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

时间:2017-02-21 04:17:08

标签: arrays actionscript-3 flash actionscript

这就是我的困境

我的游戏舞台周围有4面墙,当玩家撞到这些墙壁时,我不想为每一个墙壁制作一个if语句来检查玩家是否正在击中它,所以我创造了一个用于固定墙壁的阵列,然后检查玩家是否正在击中它。现在,因为我这样做,我不知道如果他击中某些东西,玩家实际上是在打什么,如果他打[0], [1], [2]之类的话,我就不能在我的阵列中检查,因为那时我&#39如果他碰到特定的墙壁,我会回去做检查。我不想这样做的原因是为了将来,当我添加更多障碍,建筑物等时。

所以我的问题是,如何在不对特定对象进行硬编码检查的情况下进行碰撞检查,并提供某种可用于玩家响应的值,例如,如果您击中顶墙并且您如果不做上述事情,可以以某种方式解决这个问题,然后做到这一点,这样你就无法通过什么,

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

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

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

^^完善此主题

AS3 - How to Cycle States of Character Animations (moving & stopped)

这一直困扰我一段时间,所以非常感谢帮助。这是一个很难形成的问题,所以如果有必要我可以澄清一点。

2 个答案:

答案 0 :(得分:1)

  

所以我的问题是,如何在没有硬编码的情况下进行碰撞检查   检查特定对象,并提供某种可能的值   用于玩家回应,例如,如果你击中顶部   墙,你可以不知不觉地做出来,然后   使它成为你无法走过的东西

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

这样的事情:

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面墙,这没关系。它不会让玩家进入它们。

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

答案 1 :(得分:0)

一些简单的伪代码供您学习:

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。这就是为什么我在尝试对其alpha值执行操作之前首先检查objectHit是否为null。当然,除了在项目中更改其alpha值之外,您还会做一些事情,但这是我经常做的事情(使用alpha)来快速获得事物正在检测它们应该是什么的视觉确认。