Walking on Sprite Collision Map
This example uses a set of sprites for as a collision map. The player (or character) runs pixel level collisions against this sprite set in order to determine what it's standing upon. The collision map in the example is made up of basic primitives (triangles and boxes)..
[pbcode]
setfps 60
// ---------------------------------------------------------------------
// ----------------->> CREATE COLLISION MAP TILES <<-------------------
// ---------------------------------------------------------------------
global TileWidth =64
global TileHeight =64
Cls 0
Tri 0,TileHeight,TileWidth,0,TileWidth,TileHeight
getimage 1,0,0,tilewidth,tileheight
Cls 0
box 0,0,tilewidth,tileheight,true
getimage 2,0,0,tilewidth,tileheight
Cls 0
Tri 0,0,TileWidth,TileHeight,0,TileHeight
getimage 3,0,0,tilewidth,tileheight
for lp=1 to 3
preparefximage lp
next
Dim CollisionMap(50,10)
Dim CollisionMapSprites(50,10)
for ylp=0 to 9
row$=Readdata$()
for xlp=1 to 50
ThisChr=mid(row$,Xlp)
select ThisChr
case ASC(".")
; Null (Transparent chr)
ThisImage=0
case ASC("/")
; triangle wedge /|
ThisImage=1
case ASC("\")
; triangle wedge |\
ThisImage=3
case ASC("-")
; Solid Block []
ThisImage=2
EndSelect
CollisionMap(xlp,ylp)=ThisImage
next
next
CreateSpriteSceneFromCollisionMap()
// --------------------------------------------------------------------------------
// --------------->> Init Player <<-------------------
// --------------------------------------------------------------------------------
CreateCamera 1
PlayerX#=100
PlayerY#=100
PLayerHeight=32
PlayerCollisionWidth=4
PlayerCollisionHeight=4
// Create a strip of pixels as the ground height detector
Cls $ffffffff
GetIMage 100,0,0,PlayerCollisionWidth,PlayerCollisionHeight
preparefximage 100
// Create Player sprite
PlayerSprite=NewSprite(PlayerX#,playerY#,100)
SpriteDrawmode PLayerSprite,2
SpriteCollisionMode PLayerSprite,6
SpriteHandle PLayerSprite, PlayerCollisionWidth/-2,0
#if playbasicversion>163
SpriteTint PlayerSprite ,$00ff0000
#endif
// ---------------------------------------------------------------------
// ----------------->> Main Loop <<-------------------
// ---------------------------------------------------------------------
Do
// init capture to scene mode
CaptureToScene
// clear the scene buffer of any old data
ClsScene
if leftkey() then playerx#=playerx#-4
if rightkey() then playerx#=playerx#+4
PositionSprite PLayerSprite,playerx#,playery#
// Check if Player hits the collision world ??
NewPLayerX#=playerx#
NewPLayerY#=playerY#
ThisSprite=SpriteHit(PLayerSprite,GetFirstSprite(),1)
Collision=false
While ThisSprite>0
Collision=true
// Move this sprite up by one pixel
MoveSprite PLayerSprite,0,-1
// Check to see it still's still overlapping
// if so, then check moving it up.
While SpritesOverLap(PlayerSprite,ThisSprite)
MoveSprite PLayerSprite,0,-1
EndWhile
// Get the players new position
NewPLayerX#=GetSpriteX(PLayerSprite)
NewPLayerY#=GetSpriteY(PLayerSprite)
// Continue Searching for hits
ThisSprite=GetNextSprite(ThisSprite)
if ThisSprite>0
ThisSprite=SpriteHit(PLayerSprite,ThisSprite,1)
endif
EndWhile
if Collision=false
PLayery#=playery#+1
else
Playery#=NewPLayery#
endif
//
PositionSprite PLayerSprite,playerx#,playery#
// Draw an ellipse to represent the player character
Ellipsec Playerx#,PLayery#-PLayerHeight,PLayerHeight/2,PLayerHeight,true,rgb(0,255,0)
// capture the sprites to the scene
drawallsprites
// Focus the camera in on the player
Cx#=GetCamerax(1)+400
Cy#=GetCameray(1)+300
cx#=CurveValue(playerx#,cx#,20)
cy#=CurveValue(playery#,cy#,20)
positionCamera 1,cx#-400,cy#-300
// draw whatever the camera see's this frame
DrawCamera 1
// show this to the player
Sync
loop
Data ".................................................."
Data ".................................................."
Data ".................................................."
Data "..../------\....................../-----\........."
Data ".../--------\...../---\........../-----..........."
Data "../----------\.../-----\....../-------\..........."
Data "..-------------------------------------..........."
Data ".................................................."
Data ".................................................."
Data "--------------------------------------------------"
Data "--------------------------------------------------"
Function CreateSpriteSceneFromCollisionMap()
For Ylp=0 to GetArrayElements(CollisionMap(),2)
Ypos=Ylp*TileHeight
For Xlp=0 to GetArrayElements(CollisionMap(),1)
Xpos=Xlp*TileWidth
if CollisionMap(Xlp,ylp)
ThisIMage=CollisionMap(xlp,ylp)
ThisSprite=NewSprite(xpos,ypos,thisimage)
SpriteDrawMode ThisSprite,2
SpriteCollisionMode ThisSprite, 6
PositionSpriteZ ThisSprite,100
endif
next
next
EndFunction
[/pbcode]
Related To:
Platform Game Movement Based on Ray Intersection (http://www.underwaredesign.com/forums/index.php?topic=3916.0)
Walking On Sprites (http://www.underwaredesign.com/forums/index.php?topic=3338.0)
Platformer Pixel Collisions Via Ray Casting (http://www.underwaredesign.com/forums/index.php?topic=3163.0)
Advanced Platform Collision (Vector WORLD) (http://www.underwaredesign.com/forums/index.php?topic=1364.0)