今天在 reddit.com 上发布了一篇关于ActionScript 3 中的像素完美碰撞检测的文章,它可以解决您的问题的碰撞检测部分。
真正的逻辑是当你检测到碰撞时要做什么。但是,您是否注意到大多数横向卷轴游戏都使用平坦的行走表面?
一个想法(不需要碰撞检测)是使用像想法一样的高度图。您可以使用数组(或纹理中的像素)来确定沿您的表面的每一部分地面的高度。当您的角色在场景中移动时,您只需将角色的位置索引到您的高度图中。
// 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];
要使用纹理而不是数组,只需将int
本应放入heightMap
数组中的每个像素放入 BitmapData 对象的单个像素中。使用纹理的优点是您可以将大量信息存储在一个小的 BitmapData 对象中,并使用 getPixel32() 将其读出。您可以生成一次地图,将其保存(如 png),然后将其嵌入到 SWF 中。
如果你想变得花哨,如果你想要平台、桥梁、移动物体等等,你可能会想……然后使用 2d 物理引擎。已经有一些开源项目,包括APE、Box2dAS3、Fisix和FOAM等。学习曲线会更高,编码也会更困难,但最终可能会为您带来回报。哎呀,如果您愿意的话,从头开始写一个本身就是一种体验!