While testing a map today I found a quirk in the platform code. Basically the character can walk across a gap without falling.
Run this example and you'll see. The CHaracter starts on a platform and when walking right walks over the gaps.
Is there a way to fix this?
Thanks.
SuperStrict Graphics 800 , 600 Global Tiles:TImage = LoadAnimImage("ice_floortiles.png",32,32,0,8) Global Player:TImage = LoadImage("player.png") Const MAPWIDTH:Int = 800/32 Const MAPHEIGHT:Int = 600/32 Global Map:Int[MAPWIDTH , MAPHEIGHT] Global PlayerX:Float 'The players X Location On Screen Global PlayerY:Float ' The Players Y Location On Screen Global CheckPlayerPosition:Int = 0 ' A Flag to check the Players Current position. Global Direction:Int = -1' The Direction the Player is travelling in Global Jump:Int = 0 ' Are we Jumping Const Gravity:Float = 0.2 ' Amount of Gravity to apply to JumpHeight Global JumpHeight:Float = 5.3' The height The player Jumps in pixels Global CanJump:Int = 1 ' Whether we can Jump. If we're already jumping we can't jump again ie. double jump. Global Falling:Int = 0 ' Whether the player is falling. 1 = Falling 'Global Jumping:Int = 0 ' Are we jumping ReadLevelData() ' We Read the level data While Not KeyHit(KEY_ESCAPE) Cls DrawMap() CheckIfPlayerCollideWithTile() DrawPlayer() MovePLayer() DoJump() Flip Wend '###################################################### '#### Function DrawPLayer() # '#### Draws Player to Screen and gets Player Position # '###################################################### Function DrawPlayer() If CheckPlayerPosition = 0 ' We use this to check if there is a number 2 in the tilemap array. If you notice there is a number 2 'in the defdata statements. This is used to start the player at that position. For Local x:Int = 0 Until MAPWIDTH ' Loop until MapWidth For Local y:Int = 0 Until MAPHEIGHT' Loop Until MapHeight Select Map[x,y]' We use a select function to select check data in the MapArray Case 2 ' If the data in the map array = 2\/ PlayerX = getX(x) 'we get the location in pixels of the tiles x position and pass it to PlayerX PlayerY = getY(y) ' we get the location in pixels of the tiles y position and pass it to PlayerY CheckPlayerPosition = 1 ' We switch this to one because we don't want to check the start position of the player anymore End Select Next Next EndIf DrawText "PlayerX = " +PlayerX , 0 , 20 DrawImage Player, PlayerX , PlayerY , 0 ' Now we have the where the number 2 was in the MapArray and have passed this position 'to Player X and PlayerY, we use this to draw the player at that location. So if you move the number 2 'elsewhere in the defdata statements the player will be drawn according to where it is. End Function '################################################# '### Function MovePLayer() # '## Moves Player and checks outer boundaries # '################################################# Function MovePLayer() If KeyDown(KEY_LEFT) And Not KeyDown(KEY_RIGHT) Direction = 0 ' set direction to 0. Going Left PlayerX:-2 ' Minus 2 from Players X position to move him left ElseIf KeyDown(KEY_RIGHT) And Not KeyDown(KEY_LEFT) Direction = 1 ' set direction to 1. Going Right PlayerX:+2 ' Add 2 to the players X position to move him right End If If PlayerX-32 <=0 ' Boundary checks to prevent our Player Jumping out the screen PlayerX:+2 ElseIf PlayerX >= 800-64 PlayerX:-2 End If End Function '########################################################## '### Function CheckIfPlayerCollideWithTile() # '### Checks to see if the player has collided with a tile # '### Checks also if the Player is falling # '########################################################## Function CheckIfPlayerCollideWithTile() '#Region Select Direction Case 1 If Jump = 0 If Map[PlayerX/32+1, PlayerY/32] = 1 ' If we put the players X&y position within the map array and divide them by 32 PlayerX:-2 ' which is the size of the player and the tiles, we are able to determine which EndIf ' tile the Player is on or near. if we have a +1 in PlayerX/32+1 or PlayerY/32+1 EndIf ' it just means we are checking the tiles next to the player. so if we add a +1 Case 0 ' to PlayerY/32 we are checking the tile under the players feet. If Jump = 0 ' In this we are checking the tiles to the right and left and if they = 1 (Tile is present) If Map[PlayerX/32, PlayerY/32] = 1 ' then we stop the player from moving. PlayerX:+2 End If EndIf End Select '#End Region If Falling = 1 ' If falling = 1 we minus 3.2 from the players Y position making him fall. PlayerY:+3.2 If Map[PlayerX/32,PlayerY/32+1] = 1 ' While he's falling if we check to see if a tile is underneath and if there is If (PlayerY Mod 32.0) <= 6.4 'checks to see if player is close to top of tile if not keep falling ' 6.4 is twice the falling distance of 3.2 PlayerY = PlayerY - (PlayerY Mod 32) 'subtract the remainder to obtain exact start of tile Jump = 0 ' We stop falling. We reset Jump to 0 and CanJump to 1 and also reset the JumpHeight Falling = 0 CanJump = 1 JumpHeight = 5.5 EndIf EndIf End If If Not Map[PlayerX/32+1,PlayerY/32+1] And Not map[PlayerX/32,PlayerY/32+1] ' This is used seperately and does nothing apart from enabling me to use the "else bit" ' left of player as well as right of player needs to be checked against ' the tile so it wont fall of the middle of the tile. ' If there's nothing under the players feet we start falling but only if we're not jumping If Jump = 0 Falling = 1 EndIf End If End Function '############################################## '### Function DoJump() # '### Makes our player jump # '############################################## Function DoJump() If KeyHit(KEY_SPACE) And CanJump = 1 ' If we hit the space button and CanJump = 1 Jump = 1 ' We enable Jump CanJump = 0 ' We Disable CanJump. Can't jump while jumping End If If Jump = 1 ' If Jump is enabled PlayerY:-JumpHeight ' we minus JumpHeight from Players Y Position JumpHeight:-Gravity ' We minus Gravity from JumpHeight If JumpHeight <=-1.0 Or PlayerY < 32' If JumpHeight <= -1.0 and reached the top tile Falling = 1 ' We beging to fall by setting Falling to 1 EndIf End If End Function '######################################## '### Function DrawMap() # '### We Draw the Map to screen # '######################################## Function DrawMap() For Local x:Int = 0 Until MAPWIDTH ' we loop until MapWidth For Local y:Int = 0 Until MAPHEIGHT ' We loop until MapHeight Select Map[x,y] ' We select the data stored in the MapArray Case 1 ' if it = 1 DrawImage Tiles , x*32 , y*32 , 0 ' we draw the tiles to there corresponding position End Select Next Next End Function '####################################################### '### Function ReadLevelData() # '### We read the data stored in the defdata statements # '####################################################### Function ReadLevelData() For Local y:Int = 0 Until MAPHEIGHT' We loop through the Y position first until MapHeight For Local x:Int = 0 Until MAPWIDTH ' We Loop Until MAPWIDTH Local data:Int ' Setup a local variable to store the data in ReadData data ' We read the data from the defdata statements in to the data variable Map[x,y] = data ' we assign the data in the data variable to our MapArray Next Next End Function 'Function getX:Int(x:Int) ' Return sizeX * x '+ offsetX 'End Function ' 'Function getY:Int(y:Int) ' Return sizeX * y '+ offsetX 'End Function Function getX:Int(x:Int) Return 32 * x '+ offsetX End Function Function getY:Int(y:Int) Return 32 * y '+ offsetX End Function DefData 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 DefData 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 DefData 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Run this example and you'll see. The CHaracter starts on a platform and when walking right walks over the gaps.
Is there a way to fix this?
Thanks.