Before adding block tiles to the game engine, I pulled out all of the player variables from the GameScreen class and put those in its own Player class. I also created a Projectiles class to hold the set of projectiles.
Blocks and Collision
For now, I created a simple 12×20 array to represent the blocks on the screen. This just represents one screen, so later on multiple screens will need to be pieced together to form a seamless scrolling game world. On each GameScreen update, I pass an array containing the current blocks on the screen to the player. The player then uses that array in its update method to determine if it has collided with any of the blocks during a fall or a move. My block collision method does a simple loop through all of the blocks on the current screen, and returns true if the player has collided with any of the blocks. However, I also add the player’s X velocity and Y velocity to the collision rectangle’s position. If I wait until after the player has moved into the block to do the check, then the player will become stuck in the block. That’s why I have to check the collision based on the player’s next position.
If the player’s falling boolean is set to true and they collide with a block, then the falling boolean is set to false. If the player’s X velocity is non-zero (they’re walking) and collide with a block, then I prevent the player from moving in the X direction. I could set the X velocity to zero, but that would stop the run animation and the player would have to press the directional button again in the case the blocks move (such as an elevator). If the player holds down in a direction, they should start moving again as soon as the obstacle is moved.
Walking on Air
One last problem is that when the player walks off of a block, they will continue to float until they jump. Therefore, I had to add another check if the player is not falling and not jumping, then check to see if they collide with a block if falling downward. If the player doesn’t collide with a block, then set the falling boolean to true so that the player starts falling. This condition only arises if the player is not falling and not jumping (they are walking or standing). Checking this way will be beneficial if disappearing blocks are added, then the player will start falling. Handling elevators may be a little more tricky, since those are not aligned directly on the tile grid.