RectHitMap
Collision = RectHitMap(ThisMap, TheLevel, X1, Y1, X2, Y2)
 
Parameters:

    ThisMap = The Index of the map to query for a collision
    TheLevel = The level within the map
    X1 = The top left X coordinate of the rectangle
    Y1 = The top left Y coordinate of the rectangle
    X2 = The bottom right X coordinate of the rectangle
    Y2 = The bottom right Y coordinate of the rectangle
Returns:

    Collision = The collision state. It'll return True (1) with the ellipse hit something and false (0) if it didn't
 

      The RectHitMap() function checks if a rectangle region collides (overlaps) a map level. The collision in this command is based on the regions and not the pixels. Each block in the level has a rectangular region that it covers. So this command compares it's area with the regions of the level. If any overlap, it'll return a true(1) for an impact, it not it'll return a false (0)




FACTS:


      * RectHitMap compares the the region with the map not at pixel level, but at the rectangular level. Use RectHitMapPixels for a pixel to pixel level impacts.


 
Example Source: Download This Example
;     -----------------------------------------------
;           --------->> SET UP <<------------
;     -----------------------------------------------
  
  SetFPS 100
  
; Size of the  test rectangle
  RectWidth     =50
  RectHeight     =100
  
  
; create the random map from some circles
  Map,Level=Build_Random_Map(32,32)
  
  
; make a backdrop picture
  BackDrop=NewImage(800,600)
  RenderToImage Backdrop
  c1=RndRGB()
  c2=RndRGB()
  ShadeBox 0,0,800,600,c1,c1,c2,c2
  RenderToScreen
  
  
; create a camera to view the scene with
  Cam=NewCamera()
  CameraCls Cam,off
  
  
  
  
;     ------------------------------------------------
;      --------->> MAIN LOOP OF PROGRAM <<----------
;     ------------------------------------------------
  
  
  Do
     
   ; Get the camera current position
     CamX=GetCameraX(cam)
     CamY=GetCameraY(cam)
     
   ; Get the mouse position
     MX=MouseX()+CamX
     MY=MouseY()+CamY
     
   ; Check if the Left Mouse is pressed ?
     If LeftMouseButton()
        RectWidth=Mod(RectWidth+1,400)
     EndIf
     
   ; Check if the RIGHT Mouse is pressed ?
     If RightMouseButton()
        RectHeight=Mod(RectHeight+1,400)
     EndIf
     
     
     
     Method$="RectHitMap"
     
     X1=mx
     Y1=my
     X2=mx+RectWidth
     Y2=my+RectHeight
     
     If Method=0
      ; Test if the Rectangle Hits the Map blocks
        Collision=RectHitMap(Map,Level,X1,Y1,X2,Y2)
     Else
      ; Test if the Rectangle Hits the Map at pixel level
        Collision=RectHitMapPixels(Map,Level,X1,Y1,X2,Y2)
        Method$+="Pixels"
     EndIf
     
     
     If Collision
        Colour=$ff0000
        Message$="Hit"
     Else
        Colour=$0000ff
        Message$="Missed"
     EndIf
     
     
   ; tell PB to capture the following drawing commands
     CaptureToScene
     
   ; clear the scene buffer so it's empty
     ClsScene
     
   ; set the capture depth of the next item to a depth of
   ; 100 units
     CaptureDepth 100
     DrawImage BackDrop,CamX,CamY,false
     
     
   ; draw the map level
     CaptureDepth 5
     DrawMap map,Level,0,0
     
     
   ; draw the Rectangle at this depth
     CaptureDepth 20
     BoxC X1,Y1,X2,y2,true,colour
     
     
   ; draw the scene with this camera
     DrawCamera cam
     
     
   ; Check if the Space key was pressed
     If SpaceKey()
      ; if so, change the collision method
        Method=1-Method
        FlushKeys
     EndIf
     
   ; check if the ENTER key was pressed
     If EnterKey()
      ; If so, toggle Debug mode on the map
        MapDebug Map,1-GetMapDebug(Map)
        FlushKeys
     EndIf
     
     
     
     
   ; check if the users wanted to move the camera
     If LeftKey()  Then     MoveCamera Cam,-2,0
     If RightKey() Then     MoveCamera Cam,2,0
     If UpKey()    Then     MoveCamera Cam,0,-2
     If DownKey()  Then     MoveCamera Cam,0,2
     
     SetCursor 0,0
     Ink $ffffff
     Print "Press Space To Change Methods"
     Print "Mouse Buttons To Change Size"
     Print "Method:"+Method$
     Print  Message$
     Sync
  Loop
  
  
  
;     -------------------------------------------------
;      --------->> Build Random Map Scene <<---------
;     -------------------------------------------------
  
  
Function Build_Random_Map(BlockWidth,BlockHeight)
  
  BackdropColour=$008f00
  
  screen=NewFXImage(2400,1600)
  RenderToImage screen
  Cls  BackdropColour
  CircleC 800,400,400,true,$8f8f8f
  CircleC 1700,400,400,true,$0f8faf
  
  For lp=0 To 200
     x=Rnd(2400)
     y=Rnd(1600)
     rx=RndRange(50,150)
     ry=RndRange(10,50)
     EllipseC x,y,rx,ry,true, BackdropColour
  Next
  
  
  
  Map=NewMap(50)
  
; Create 1024 FX BLocks for this map
  CreateMapGFX  Map,BlockWidth,BlockHeight,1024,_
  BackdropColour,2
  
  BlocksX=GetSurfaceWidth()/BlockWidth
  BlocksY=GetSurfaceHeight()/BlockWidth
  
  Level=NewLevel(Map,BlocksX,BlocksY)
  LevelTransparent Map,Level,0
  GetMapBlk Map,Tile,0,0
  
  Tile=1
  For ylp=0 To GetLevelHeight(map,level)-1
     Ypos=ylp*BlockHeight
     If Ypos+BlockHeight<=GetSurfaceHeight()
        For xlp=0 To GetLevelWidth(map,level)-1
           Xpos=xlp*BlockWidth
           GetMapBlk Map,Tile,Xpos,ypos
           
           If GetMapBlockTransparent(Map,Tile)>-1
              PokeLevelTile Map,Level,xlp,ylp,tile
              tile++
           EndIf
           If Tile=>GetMapBlocks(Map)
              ExitFor ylp
           EndIf
        Next
     EndIf
  Next
  
  RenderToScreen
  
; Turn Debug Map for this map
  MapDebug Map,on
  
EndFunction Map,Level
  
  
  
  
 
Related Info: CircleHitMap | CircleHitMapPixels | EllipseHitMap | EllipseHitMapPixels | GetMapBlockTransparent | PointHitMapPixels | RayHitMapPixels :
 


(c) Copyright 2002 - 2024 - Kevin Picone - PlayBASIC.com