我正在尝试在动作脚本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?
答案 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,那么它将不计算。