Copy link to clipboard
Copied
Hey guys,
So I'm practicing creating a platformer game. I've got a movement system working, but when trying to add collision with platforms I have a problem.
What I did was add each platform to an array, and then check for collision between the player and each platform, since I just have a bunch of nameless instances of the platform symbol on my stage. The issue with this is that for my jumping code I use a boolean "onGround", which determines whether the player is 'on the ground' or not. And since my 'for each' loop runs through EVERY platform, even if the player is on a certain platform, there are other ones he won't be on and so it returns the boolean onGround as false.
This is a problem with my jumping code in general, I'm just wondering where I should go from here. If I need to change my jumping code, or change the collision, or what. Any ideas would be great. Here is my code :
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.display.DisplayObject;
public class Main extends MovieClip
{
var arrowUp:Boolean = false;
var arrowDown:Boolean = false;
var arrowLeft:Boolean = false;
var arrowRight:Boolean = false;
var arrowUpReleased:Boolean = true;
var arrowDownReleased:Boolean = true;
var arrowLeftReleased:Boolean = true;
var arrowRightReleased:Boolean = true;
var onGround:Boolean = undefined;
var isJumping:Boolean = undefined;
var vx:Number = 0;
var vy:Number = 0;
var acceleration:Number = 1;
var gravity:Number = 0.3;
var jumpForce:Number = 7;
var speedLimit:uint = 6;
var platformArray:Array = new Array();
var platformNumber:uint = 0;
var thePlatform:MovieClip;
public function Main()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
stage.addEventListener(Event.ENTER_FRAME, update);
for (var i:uint = 0; i < numChildren; i++)
{
if(getChildAt(i) is Platform)
{
platformArray.push(getChildAt(i));
}
}
for each (var platform:DisplayObject in platformArray)
{
if (platform.hitTestPoint(player.x, player.y + 20, true))
{
vy = 0;
onGround = true;
}
}
}
function keyPressed(event:KeyboardEvent):void
{
if (event.keyCode == 37)
{
arrowLeft = true;
arrowLeftReleased = false;
}
if (event.keyCode == 38)
{
arrowUp = true;
arrowUpReleased = false;
isJumping = true;
}
if (event.keyCode == 39)
{
arrowRight = true;
arrowRightReleased = false;
}
if (event.keyCode == 40)
{
arrowDown = true;
arrowDownReleased = false;
}
}
function keyReleased(event:KeyboardEvent):void
{
if (event.keyCode == 37)
{
arrowLeft = false;
arrowLeftReleased = true;
}
if (event.keyCode == 38)
{
arrowUp = false;
arrowUpReleased = true;
isJumping = false;
}
if (event.keyCode == 39)
{
arrowRight = false;
arrowRightReleased = true;
}
if (event.keyCode == 40)
{
arrowDown = false;
arrowDownReleased = true;
}
}
function update (event:Event):void
{
//ACCELERATION
if (arrowLeft)
{
if (vx > 0)
{
vx = 0;
}
if ((Math.abs(vx)) < speedLimit)
{
vx -= acceleration/2;
player.x += vx;
}
else
{
player.x += vx;
}
}
if (arrowRight)
{
if (vx < 0)
{
vx = 0;
}
if (vx < speedLimit)
{
vx += acceleration/2;
player.x += vx;
}
else
{
player.x += vx;
}
}
if (arrowUp && onGround)
{
vy = -jumpForce;
}
//DECELERATION
if (arrowLeftReleased)
{
if (vx < 0)
{
vx += acceleration;
player.x += vx;
}
}
if (arrowRightReleased)
{
if (vx > 0)
{
vx -= acceleration;
player.x += vx;
}
}
//GRAVITY
player.y += vy;
if (!onGround)
{
vy += gravity;
}
if (onGround && !isJumping)
{
vy = 0;
}
if (vy > 0)
{
onGround = false;
}
else
{
onGround = true;
}
//COLLISION
for each (var platform:MovieClip in platformArray)
{
if (platform.hitTestPoint(player.x, player.y + 20, true))
{
vy = 0;
onGround = true;
}
else
{
onGround = false;
}
}
trace (onGround);
}
}
}
Thanks
P.S. what happens at the moment with that code is that the player hits the platform and stops, but onGround remains false
Likely there's too much code for anyone to really wade through. However, from what you said about your for loop:
for each (var platform:DisplayObject in platformArray){
if (platform.hitTestPoint(player.x, player.y + 20, true)){
vy = 0;
onGround = true;
}
}
I think what you might want is to put a break; in there right after onGround = true; - ie stop processing when you find a ground plane.
Also, there's a couple of good collision detection systems out there that might make this a bit easier and
...Copy link to clipboard
Copied
Likely there's too much code for anyone to really wade through. However, from what you said about your for loop:
for each (var platform:DisplayObject in platformArray){
if (platform.hitTestPoint(player.x, player.y + 20, true)){
vy = 0;
onGround = true;
}
}
I think what you might want is to put a break; in there right after onGround = true; - ie stop processing when you find a ground plane.
Also, there's a couple of good collision detection systems out there that might make this a bit easier and robust. Have a look at Collision Detection Kit (CDK):
Copy link to clipboard
Copied
Awesome, that works perfectly thanks .
Yeah I know there's a ton of collision systems out there already, but I wanted to make my own for practice. best way to learn
Find more inspiration, events, and resources on the new Adobe Community
Explore Now