【问题标题】:AS3 - hitTestObject object hovering?AS3 - hitTestObject 对象悬停?
【发布时间】:2013-11-29 12:34:58
【问题描述】:

我正在尝试在 actionscript 3.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 函数中的hitTestObeject 无法正常工作,我希望我的角色(myChar) 出现在platoe (myLevel) 上,但myChar 一直悬停。

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

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案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 则不计入。

    【讨论】:

    • 这可能与这些框的线条样式有关。尝试使用 lineStyle(0,0,0) 而不是默认的 IIRC (1,0,1) 绘制框。
    • @Vesper 如果我没记错的话,我使用填充框而不是轮廓进行了这个测试。
    • 正确,已填充。原因是,如果你的轮廓比 0 厚,它的宽度将计入盒子的实际尺寸(两边的一半宽度加上全宽)。因此,如果您没有为轮廓删除线型,那么您测试的是 21x21 框而不是 20x20。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多