3

好吧,首先我很惊讶 actionscript 3.0 没有基于像素的碰撞检测。

无论如何,我正在使用在这里找到的碰撞库(如果需要,我愿意选择另一个库)

录制了一段视频以更好地展示我正在尝试做的事情,简而言之,我正在制作一个横向滚动游戏(如马里奥),我希望我的地面(地板)就像地面一样......当用户走路时它在地面上行走,哈哈

起初我在考虑做一个“反弹”效果,比如“如果用户在地面以下 X 量,然后将他推上去”。看起来不错,但我发现我能做到的唯一方法是让我的用户在触地后继续跳跃(不是在视频中)。

那么有谁知道如何获得它,以便当我的用户走路并且他在地面上上山时,它也会让用户 char 也上去?

4

2 回答 2

4

今天在 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 物理引擎。已经有一些开源项目,包括APEBox2dAS3FisixFOAM等。学习曲线会更高,编码也会更困难,但最终可能会为您带来回报。哎呀,如果您愿意的话,从头开始写一个本身就是一种体验!

于 2009-08-08T23:56:34.937 回答
2

看起来您正在检测与地面的垂直碰撞,但忽略了水平碰撞。但是,不仅仅是在击中水平物体时停下来(即地板上 1 像素的变化将被视为与墙壁相同,并且您必须跳过它),您需要将玩家推到顶部的对象。你也想在这里有一个截止,所以当他们击中他们时玩家不会被推到墙的顶部。因此,例如,当检测到水平碰撞时,将玩家移动到对象顶部,除非对象顶部距离当前位置 > 10 像素。

于 2009-08-09T00:12:05.203 回答