3
votes

Well first off I'm surprised actionscript 3.0 doesnt have pixel-based collision detection.

Anyways I'm using a collision library found here (I'm willing to pick another library if needed)

I recorded a video to better show what I'm trying to do, in short I'm making a side scrolling game (like mario) and I want my ground (floor) to act just like ground does... when the user walks it walks on top of the ground, lol

At first I was thinking about doing a "bounce" effect where like "if user is X amount below the surface of the ground then push him up". It seems fine but the only way I found I can do it makes my user just keep jumping once it touches the ground (not in video).

So does anyone know how to get it so that when my user is walking and he goes UP hill on the ground it will also make the users char go up too?

2

2 Answers

4
votes

There was an article posted today on reddit.com about pixel perfect collision detection in ActionScript 3 which does the collision detection portion of your problem.

The real logic will be what to do when you detect a collision. However, have you ever noticed how most side-scrolling games use a flat walking surface?

One idea (that doesn't require collision detection) is to use a height map like idea. You can use an array (or the pixels in a texture) to determine the height of each section of ground along your surface. As your character moves through the scene you just index the position of the character into your height map.

// How many pixels each index of the heightMap contains.
// You'll probably want to use the same value as the distance
// your character moves when the move left/right key is pressed.
const SECTION_SIZE:int = 10; 

// Fill this as a huge array with all the heights and
// the size of this will be (mapHorizontalLengthInPixels / SECTION_SIZE).
// Each element will be the distance from the top of the screen to 
// place the character so it looks like it is standing on the ground.
var heightMap:Array = [ /* ... */ ];

// TODO: you might want to Tween to this value so it doesn't look chunky
character.y = heightMap[character.x / SECTION_SIZE];

To use a texture instead of an array, you just put each int that would have been put into the heightMap array into a single pixel of a BitmapData object. The advantage to using a texture is you can store a huge amount of information in a small BitmapData Object and use getPixel32() to read it out. You can generate the map once, save it (like as a png) and then embed it into the SWF.

If you want to get fancy, and you probably will if you want platforms, bridges, moving objects and more ... then use a 2d physics engine. There are a few open-source projects already including APE, Box2dAS3, Fisix, and FOAM among others. The learning curve will be higher and the coding more difficult but it may pay off for you in the end. Heck, it is an experience itself to write one from scratch if your keen!

2
votes

It looks like you're detecting vertical collisions with the ground, but ignoring horizontal collisions. But rather than just simply stopping when hitting a horizontal object (i.e. a 1 pixel change in the floor would be treated the same as a wall, and you'd have to jump over it) you'd need to push the player to the top of the object. You'd want to have a cutoff here too, so the player doesn't get pushed to the top of walls when they hit them. So, something like, when a horizontal collision is detected, move player to top of object, unless top of object is > 10 pixels from current location.