ShapeHitMapPixels
Collision = ShapeHitMapPixels(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 ShapeHitMapPixels() function checks if a Shape poylgon (convex, concave, complex polygons) region collides (overlaps) a map level at pixel level.




FACTS:


      * ShapeHitMapPixels compares the region with the map at pixel level. Therefore it's not recommended for use with Maps with Video formatted blocks, best results are obtained with FX blocks.


      * ShapeHitMapPixels has to span convert the shape for calculating collisions, which can be time consuming for large complex shapes. We recommend breaking those done into smaller sections if possible.


 
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