Flash AS3对外墙的碰撞检测

时间:2012-12-05 00:00:34

标签: actionscript-3 flash

我是新来的,需要一些帮助。基本上我正在设计一个类似吃豆人的游戏,它必须基于柳树上的风,所以鼹鼠就是!!

无论如何,我已经完成了它的基础知识,我已经制作了我的2d鼹鼠,让他移动,让他对按钮按等做出反应,现在试图让墙壁工作,从外墙开始。

我在边缘周围做了4个矩形,将它们合并为一个形状并称之为“outerWalls”。我一直在使用hitTestObject尝试让它工作但没有成功。

我做了一个测试,使它与moleman.xIncrement = -5一起使用,这使他立即向后移动而不会碰到任何墙壁。我很好奇,如果这是因为他是在墙内,它将4个外墙整体划分为方形,而他已经在理论广场内部将他移出?我不确定。有一些代码!!

动作图层 - 第1帧:

import flash.events.KeyboardEvent;

var moleman = this.addChild(new Moleman_mc());

moleman.x = 100;
moleman.y = 200;
moleman.width = 24;
moleman.height = 24;

moleman.xIncrement = 5;
moleman.yIncrement = 0;

stage.addEventListener(KeyboardEvent.KEY_DOWN, doKeyDown);

function doKeyDown (e:KeyboardEvent):void
{
    switch(e.keyCode)
    {
        case Keyboard.UP:
        moleman.xIncrement = 0;
        moleman.yIncrement = -5;
        moleman.rotation = -90;
        break;

        case Keyboard.DOWN:
        moleman.xIncrement = 0;
        moleman.yIncrement = 5;
        moleman.rotation = 90;
        break; 

        case Keyboard.LEFT:
        moleman.xIncrement = -5;
        moleman.yIncrement = 0;
        moleman.rotation = 180;
        break;

        case Keyboard.RIGHT:
        moleman.xIncrement = 5;
        moleman.yIncrement = 0;
        moleman.rotation = 0;
        break;
    }
}

动作图层 - 第2帧:

import flash.events.Event;

var collectCounter:int = 0;

moleman.x += moleman.xIncrement;
moleman.y += moleman.yIncrement;

if(moleman.hitTestObject(collect))
{
    collectCounter ++;
    collect.visible = false;
}

moleman.addEventListener(Event.ENTER_FRAME, wallHit);

function wallHit(event:Event):void
{
    if(moleman.hitTestObject(outerWalls))
    {
        moleman.stop();
    }
}

动作图层 - 第3帧:

gotoAndPlay(2);

另外,我不能让收集(例如收藏品)工作,计划是这样做,所以每当你收集一个“收集”项目,一个消失,你添加一个到collectCounter但所有其他人保持可见。目前,如果你收集一个“收集”项目,鼹鼠只是停下来并停留在他所在的位置,而另一个鼹鼠出现并继续,不是很有用。任何有关这方面的帮助也将受到赞赏,不知道从哪里拿走它。

任何帮助都非常感谢,我是新手,但希望它能顺利进行:)

非常感谢所有帮助。 约翰。

1 个答案:

答案 0 :(得分:0)

在您检测碰撞的情况下,您应该使用hitTestPoint方法而不是hitTestObject。 hitTestPoint方法有签名:

public function hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false):Boolean

因此,当shapeFlag设置为true时,可以检测与点(您的英雄)和迷宫形状(或任何其他任意形状)的碰撞。这种方法非常强大,因为计算了与实际形状的交集,而不是其边界框。修改后的wallHit方法可能如下所示:

moleman.addEventListener(Event.ENTER_FRAME, wallHit);
function wallHit(event:Event):void
{

    if(outerWalls.hitTestPoint(moleman.x, moleman.y, true))
    {
      // collision
      moleman.x += -moleman.xIncrement;
      moleman.y += -moleman.yIncrement;
      moleman.xIncrement=0;
      moleman.yIncrement=0;
    }

    moleman.x += moleman.xIncrement;
    moleman.y += moleman.yIncrement;

if(moleman.hitTestObject(collect))
{
    collectCounter ++;
    collect.visible = false;
}

}

你也可以删除第3帧和“gotoAndPlay(2);”调用因为最好将控制英雄位置的代码放入ENTER_FRAME处理程序。