ShapeHitMap
Collision = ShapeHitMap(ThisMap, TheLevel, TestShape, Xpos, Ypos)
 
Parameters:

    ThisMap = The Index of the map you query for a collision
    TheLevel = The level within the map to query
    TestShape = The index of the shape you want to compare
    Xpos = The X coordinate of the shape relative to the level
    Ypos = The Y coordinate of the shape relative to the level
Returns:

    Collision = The collision state. It'll return True (1) with the polygon hit something and false (0) if it didn't
 
      The ShapeHitMap() function checks if a polygon shapes region collides (overlaps) a map level. The collision in this command is based on the two 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:


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



 
Example Source: Download This Example
;     -----------------------------------------------
;           --------->> SET UP <<------------
;     -----------------------------------------------
  
; Make a shape for collision testing
  TempShape=NewConvexShape(100,8)
  Shape          =NewConvexShape(70,6)
  MergeShape TempShape,Shape
  
  
; Angle of the rotated Shape
  Angle#=45
  
  ScaleX#=1
  ScaleY#=1
  
  
; 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()
        ScaleX#=Mod(ScaleX#+0.01,3)
     EndIf
     
     
     If RightMouseButton()
        ScaleY#=Mod(ScaleY#+0.01,3)
     EndIf
     
     If MidMouseButton()
      ; if so, rotate the polygon angle
        Angle#=WrapAngle(angle#,0.25)
     EndIf
     
     
   ; tell PB to capture the following drawing commands
     CaptureToScene
     
   ; clear the scene buffer so it's empty
     ClsScene
     
     
     RotateShapeXY Shape,Angle#,ScaleX#,scaleY#
     
     Select Method
         Case 0
             Method$="ShapeHitMap"
             Collision=ShapeHitMap(Map,Level,Shape,Mx,My)
             
         Case 1
             Method$="ShapeHitMapPixels"
             Collision=ShapeHitMapPixels(Map,Level,Shape,Mx,My)
     EndSelect
     
     
     If Collision
        Colour=$ff0000
        Message$="Hit"
     Else
        Colour=$0000ff
        Message$="Missed"
     EndIf
     
   ; draw the shape
     CaptureDepth 5
     Ink Colour
     DrawShape Shape,MX,MY,2
     
     
     
   ; 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 10
     DrawMap map,Level,0,0
     
     
     
     
   ; 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 | CreateShape | EllipseHitMap | EllipseHitMapPixels | GetMapBlockTransparent | NewShape | PointHitMapPixels | QuadHitMapPixels | RayHitMapPixels | TriangleHitMap | TriangleHitMapPixels :
 


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