首先,我很惊讶,动作脚本3.0没有基于像素的碰撞检测。
无论如何我正在使用碰撞库found here(如果需要,我愿意选择另一个库)
我recorded a video更好地展示我正在尝试做的事情,简而言之,我正在制作一个侧滚动游戏(如马里奥),我希望我的地面(地板)像地面一样行动。当用户走路时,它走在地上,哈哈,
起初我正在考虑做一个“反弹”效果,例如“如果用户是X量低于地面,那就把他推上去”。它看起来很好,但我发现我能做到的唯一方法就是让我的用户在接触地面时不断跳跃(不是在视频中)。
所以有人知道如何获得它,以便当我的用户走路并且他在地面上爬山时它也会使用户字符也上升吗?
答案 0 :(得分:4)
今天在reddit.com上发布了一篇关于pixel perfect collision detection in 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等。学习曲线会更高,编码更难,但最终可能会为你带来回报。哎呀,如果你热衷于从头开始编写一个体验本身就是一种体验!
答案 1 :(得分:2)
看起来你正在探测与地面的垂直碰撞,但忽略了水平碰撞。但是,而不是仅仅在击中水平物体时停止(即地板中的1像素变化将被视为与墙壁相同,并且您必须跳过它),您需要将玩家推到顶部对象。你也希望在这里有一个截止点,所以玩家在击中它们时不会被推到墙顶。因此,当检测到水平碰撞时,将玩家移动到物体顶部,除非物体顶部是>距离当前位置10个像素。