AS3 - hitTestObject对象悬停?

时间:2013-11-29 12:34:59

标签: actionscript-3 flash

我正在尝试在动作脚本3.0中构建一个2D游戏,但我遇到了最热门的问题。我这里有这个代码

import flash.ui.Keyboard;
import flash.events.Event;
import flash.events.KeyboardEvent;

myChar.addEventListener(Event.ENTER_FRAME, update);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
stage.addEventListener(Event.ENTER_FRAME, letsSee);

var keys:Array=[];

function update(e:Event):void {
    myChar.y+=10;
        if (keys[Keyboard.RIGHT]) {
            myChar.x+=10;
        }

        if (keys[Keyboard.LEFT]) {
            myChar.x-=10;
        }
}

function onKeyDown(e:KeyboardEvent):void {
    keys[e.keyCode]=true;
}

function onKeyUp(e:KeyboardEvent):void {
    keys[e.keyCode]=false;
}
function letsSee(e:Event):void {
    if (myChar.hitTestObject(myLevel)==true) {
        myChar.y-=10;
    }
}

一切正常,但是letSee函数中的hitTestObeject不能正常工作,我希望我的角色(myChar)能够在platoe(myLevel)上找到,但myChar一直在盘旋。

如何在没有对象悬停的情况下制作hitTestObject?

1 个答案:

答案 0 :(得分:1)

它正在徘徊,因为当你发生碰撞时,你以与坠落时相同的速度抬起他。

想象一下,角色从5开始,对象是20.在2帧中,角色将在25处与对象发生碰撞。当发生这种情况时,你将他向上移动10,这使他处于15,所以他在5以上徘徊。然后在下一帧中发生完全相同的事情。因此他总是会徘徊。

一种解决方案是将角色向上移动他在对象“内部”的数量。因此,如果他在23岁并且物体在20,那么你将他向上移动3。

在我看来,另一个远非最有效但最容易做到的解决方案是

function letsSee(e:Event):void {
    while (myChar.hitTestObject(myLevel)==true) {
        myChar.y-=1;
    }
}

这将反复将他向上移动直到他不再与物体碰撞。

注意:我用hitTestObject方法发现的是,如果两个盒子的边缘在同一个位置,它就算作一个碰撞。例如:

方框A为100x100,位于x = 100,y = 100 方框B为100x100,位于x = 200,y = 100 hitTestObject会将其视为碰撞,如果B位于x = 201,那么它将不计算。