UnderwareDESIGN

PlayBASIC => Resources => Source Codes => Topic started by: kevin on January 20, 2010, 09:41:14 PM

Title: Walking on Sprite Collision Map
Post by: kevin on January 20, 2010, 09:41:14 PM
 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)