Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 什么';这是一种更有效的碰撞方式吗?_Arrays_Actionscript 3_Flash_Actionscript - Fatal编程技术网

Arrays 什么';这是一种更有效的碰撞方式吗?

Arrays 什么';这是一种更有效的碰撞方式吗?,arrays,actionscript-3,flash,actionscript,Arrays,Actionscript 3,Flash,Actionscript,这是我的困境 我在游戏的舞台周围有4堵墙,当玩家击中这些墙时,我不想对每堵墙都做一个if语句,检查玩家是否击中了它,所以我创建了一个数组来固定这些墙,然后检查玩家是否击中了它。现在,因为我正在这样做,所以如果玩家击中某个东西,我将不知道他实际击中了什么,如果他击中了像[0]、[1]、[2]等,我无法在我的数组中进行检查,因为这样我就可以重新检查他是否击中了特定的墙。我不想这样做的原因是为了将来,当我添加更多的障碍物、建筑物等时 所以我的问题是,我如何进行碰撞检查,而不必对特定的对象进行硬编码检查

这是我的困境

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

所以我的问题是,我如何进行碰撞检查,而不必对特定的对象进行硬编码检查,并给出一些可以让玩家做出反应的值,例如,如果你撞到了顶墙,你可以在不做上述操作的情况下以某种方式找出答案,然后让它使你无法通过或做其他事情

if (main.playerPosKeeper_mc.hitTestObject(this[main.StageCollisions]))
{
    trace("hit");
}
StageCollisions是一个数组,其中包含了我所有的障碍

当玩家在舞台碰撞中击中任何物体时,我不能简单地从他的y值或x值中减去,因为我不知道他击中了哪个物体,但我也不想硬编码,以便检查我是否击中了顶部障碍物,因为如果我回到静态if-else语句,为什么首先要创建数组呢

^^重新定义此主题


这件事困扰了我一段时间,所以我非常感谢你的帮助。这是一个很难形成的问题,因此我可以在必要时澄清要点。

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

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)快速获得视觉确认,确认事物正在检测它们应该检测的东西

所以我的问题是,我如何在没有硬编码的情况下进行碰撞检查 检查特定对象,并给出某种可以 用于玩家作出反应,例如,如果你击中顶部 你不需要做上面的事就可以知道 这样你就不能走过去了

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

大概是这样的:

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;
}
这样你就可以检查4面墙或50面墙了,这没关系,不会让玩家进入其中


这只是一个起点,有很多方法可以分解或细化它。

所以你想在循环处理4个边界墙时将英雄剪辑保留在某个矩形内吗?不一定,我正在进行碰撞检查,我很好奇如何知道玩家击中的是哪面墙,而不检查我看到的每一面墙ave,然后给出相应的命令。我真正的目标是远离硬编码与特定对象的碰撞检查,好像如果我把游戏扩大,我必须对特定对象进行更多检查。我所包含的用户Vesper的回复主题是我一直在努力实现的,但值得自己的主题。它是p可能我想得太多了,但是是的。另外,忘了提一下,我正在做碰撞检查,一旦点击了dpad方向,我以前就被告知要使用循环,可能是通过使用激活每一帧的事件侦听器,但我认为一个更简单、更有效的方法是只在点击dpad时进行检查,它会移动如果你击中了什么东西,如果你击中了什么东西,把你移回去,但是我不知道我击中了什么,我不想为了将来我想增加更多的墙和东西而硬编码检查特定的对象。我不确定我是否得到了你想要的。你可以有一个数组(任意数量的)墙,在循环中,你可以找到是否有任何墙与英雄发生碰撞,如果有,还可以找到哪一堵墙是罪魁祸首。这是你想要的吗?对于GameDev堆栈交换来说,这可能是一个更好的问题。“当然,你会在项目中做一些事情,而不是更改其alpha值”——这就是OP要问的问题不,如果你读了帖子下面的OPs评论,你会发现他只是想知道如何找出他撞到了哪面墙。他清楚地理解移动、检查、撤消的概念。他似乎认为有一种更好的方法,比通过数组依次检查每个对象更好,而数组实际上没有,这正是我试图展示的。然后,如果他eally需要知道他击中了什么,我的代码会返回它。是的,这确实会返回他击中的对象,但他真正的问题是如何对他击中的对象做一些有意义的事情,而不必为击中的对象编写不同的条件。这个示例根本没有说明如何做。这可能是他的目标,但这不是我所说的他的问题再读一遍,阅读理解是我每次表演的最低分数,所以也许你是对的:)嗨,我很抱歉不清楚我的意图。的确,我想知道我击中了哪个物体,但这是为了我能调用正确的响应(如果你没有击中什么东西,就向上移动,或者让你保持静止以防止碰撞,或者我能想到的其他任何事情),我想Aaron的代码很好地满足了我的意图,但是没有