Actionscript 3 AS3-hitTestObject对象悬停?

Actionscript 3 AS3-hitTestObject对象悬停?,actionscript-3,flash,Actionscript 3,Flash,我试图在ActionScript3.0中构建一个2d游戏,但我在hittest方面遇到了问题。我这里有这个密码 import flash.ui.Keyboard; import flash.events.Event; import flash.events.KeyboardEvent; myChar.addEventListener(Event.ENTER_FRAME, update); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyD

我试图在ActionScript3.0中构建一个2d游戏,但我在hittest方面遇到了问题。我这里有这个密码

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;
    }
}
一切都很好,但是letsSee函数中的HitTestObject并没有按我所希望的那样工作,我希望我的角色(myChar)位于柏拉图(myLevel)的位置,但myChar一直悬停


如何使hitTestObject在没有外部对象悬停的情况下保持悬停状态?

它悬停是因为在发生碰撞时,你以与它下落相同的速度将其抬起

假设角色从5开始,对象在20。在2帧中,角色将处于25,这将与对象发生碰撞。当这种情况发生时,你将他向上移动10,这意味着他在15,所以他在上面悬停5。然后在下一帧中,同样的事情发生了。因此,他将永远徘徊不前

一种解决方案是将角色向上移动他“在”对象内的量。如果他在23,物体在20,你把他向上移动3

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

function letsSee(e:Event):void {
    while (myChar.hitTestObject(myLevel)==true) {
        myChar.y-=1;
    }
}
这将反复将他向上移动1,直到他不再与物体碰撞

注意:我在hitTestObject方法中发现,如果两个框的边在同一点上,则将其视为碰撞。例如:

框A为100x100,x=100,y=100 框B为100x100,x=200,y=100
hitTestObject会将其计算为碰撞,如果B在x=201,则不会计算。

这可能与这些框的线条样式有关。尝试使用
lineStyle(0,0,0)
而不是默认值(IIRC(1,0,1))绘制框。@Vesper如果我没记错的话,我使用填充框而不是轮廓框进行了此测试。对,填充。原因是,如果您的轮廓大于0,则其宽度将计入框的实际尺寸(两侧各半个宽度将添加全宽)。因此,如果您没有删除轮廓线样式,那么您正在测试21x21框,而不是20x20框。