什么是更有效的碰撞方法?



这是我的困境

我的游戏舞台周围有 4 堵墙,当玩家撞到这些墙时,我不想对每一堵墙都做一个 if 语句,检查玩家是否击中了它,所以我创建了一个数组来固定墙壁,然后检查玩家是否击中了它。 现在,因为我正在这样做,所以我不会知道如果玩家击中了什么东西,如果他击中了什么,我也无法在我的阵列中进行检查,如果他像[0], [1], [2]一样击中,因为如果他击中特定的墙壁,我就会回到检查。 我不想这样做的原因是为了将来,当我添加更多的障碍物、建筑物等时。

所以我的问题是,我如何进行碰撞检查,而不对特定对象进行硬编码检查,并提供某种可用于玩家响应的值,例如,如果你撞到顶墙并且你可以以某种方式弄清楚而不做上述事情,然后让它让你无法走过或其他什么,

if (main.playerPosKeeper_mc.hitTestObject(this[main.StageCollisions]))
{
trace("hit");
}

StageCollisions是一个数组,其中包含我所有的障碍。

当玩家在 StageCollisions 中击中任何东西时,我不能简单地从他的 y 值或 x 值中减去,因为我不知道他击中了哪个对象,但我也不想对其进行硬编码,以便我检查我是否击中了顶部障碍,因为如果我只是回到静态 if else 语句,为什么要首先做一个数组。

^^ 重新引用此主题

AS3 - 如何循环角色动画的状态(移动和停止)

这已经让我难倒了一段时间,所以帮助将不胜感激。 这是一个很难形成的问题,因此如有必要,我可以澄清要点。

所以我的问题是,如何在没有硬编码的情况下进行碰撞检查 检查特定对象,并给出某种值,该值可以是 用于玩家响应,例如,如果您击中顶部 墙,你可以以某种方式弄清楚,而无需做上述操作,然后 让它让你无法走过或其他东西

对,所以您需要一种方法来执行通用碰撞响应。这可能是一个很大的话题。最简单的方法通常是在移动后检查碰撞,然后在发生碰撞时反转移动。

像这样:

function movePlayer(movementX:Number, movementY:Number):void {
var originalX:Number = player.x;
var originalY:Number = player.y;
player.x += movementX;
if (checkCollision()) {
player.x = originalX;
}
player.y += movementY;
if (checkCollision()) {
player.y = originalY;
}
}
function checkCollision():Boolean {
for each (var wall:MovieClip in walls) {
if (player.hitTestObject(wall)) {
return true;
}
}
return false;
}

这样您就可以checkCollision()检查 4 面墙或 50 面墙,没关系。它不会让玩家进入它们。

这只是一个起点,有很多方法可以分解或改进。

一些琐碎的伪代码供你学习:

private function collisionCheck(h:Sprite):Sprite{  // pass the hero Sprite into this function and it will return the wall that it hit
for each (b:Sprite in blockArray){ // if your array of hit-able objects is called "blockArray"
if (h.hitTtestObject(b)){ // check the hero Sprite against all objects in the array
return b;
}
}
return null;
}

然后,在代码中的其他地方(可能是在您的 gameTick 函数或 gameLoop 函数中,或者您在每一帧上重复游戏逻辑的任何位置):

private function gameTick():void{
var objectHit:Sprite = collisionCheck(_myHero); // this will run the collision check function, and return the sprite that the hero collides with;
if (objectHit != null){
objectHit.alpha = 0.5; 
// this will give you a visible representation that your code is indeed working, or not.
}
}

对于您的英雄没有与任何东西发生冲突的时刻,此函数将返回 null。 这就是为什么我首先检查 objectHit 是否不为空,然后再尝试对其 alpha 值执行操作。 当然,除了在项目中更改其 alpha 值之外,您还会做其他事情,但这是我经常做的事情(使用 alpha),以快速获得视觉确认,即事物正在检测它们应该检测到的内容。

最新更新