需要帮助修复播放器对角跳跃 Flash CS4

Need help fixing player jumping diagonally Flash CS4

我不明白为什么当我尝试通过按向右和向上箭头键让我的播放器沿对角线跳跃时它什么也没做,我使用跟踪来查看是否发生了任何事情,而当他们一起使用。

向上不能单独使用或与右侧一起使用,但当右侧单独使用时它可以工作。

玩家名为英雄,平台名为平台、平台2、平台3等

平台在平台层

stop();

var gravity:Number=5;  //Very important, allows player to fall 
var movex:Number=0; // Moving players X
// Moving player

stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHero);

var speed=10;
function moveHero(event:KeyboardEvent) {
    if (event.keyCode==Keyboard.LEFT) {
        hero.x-=speed;
        hero.play();
    }

    if (event.keyCode==Keyboard.RIGHT) {
        hero.x+=speed;
        hero.play();
    }

}

hero.addEventListener(Event.ENTER_FRAME, testCollision2);

// Allowing player to jump when on platform
function testCollision2(e: Event) {

//Allowing player to jump when on platform continued
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHeroUP);

function moveHeroUP(event:KeyboardEvent) {
    if (hero.hitTestObject(platform) && event.keyCode==Keyboard.UP) {
        gravity=-50;
        hero.y=hero.y+gravity;
    } else if (hero.hitTestObject(platform2) && event.keyCode==Keyboard.UP) {
        gravity=-50;
        hero.y=hero.y+gravity;
    } else if (hero.hitTestObject(platform4) && event.keyCode==Keyboard.UP) {
        gravity=-50;
        hero.y=hero.y+gravity;
    }

    if(hero.hitTestObject(platform) && event.keyCode==Keyboard.UP && event.keyCode==Keyboard.RIGHT){
        movex = 20;
        hero.x = hero.x + movex;
        gravity =-50;
        hero.y = hero.y + gravity;
    }

}

我试图让玩家在最后跳入代码块

Flash CS4 AS3

首先,让我们了解一下您是如何设置这段代码的,并解释发生了什么。

你有这条线:

hero.addEventListener(Event.ENTER_FRAME, testCollision2);

也就是说,hero存在的每一帧tick,运行函数testCollision2。 Frame tick here与时间线帧有关,它与您的应用程序的帧率有关。因此,如果将其设置为 12,则该函数将每秒 运行 12 次。

testCollision2 内,您添加另一个侦听器:

stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHeroUP);

并创建一个名为 moveHeroUP 的内联函数。因此,每一帧滴答声,您都会创建一个新函数,并将其附加到按键按下事件。因此(假设每秒 12 帧)进入您的应用程序 5 秒后,您将有 60 个键盘侦听器都在做同样的事情。这也是一个内存泄漏(因为你每帧都在创建一个新函数),所以最终你的程序会崩溃。

为了解决实际问题,键盘事件与一个特定的键相关联。这意味着事件的 keyCode 永远只是一个键(触发事件的键)。所以做类似 (event.keyCode==Keyboard.UP && event.keyCode==Keyboard.RIGHT) 的事情将永远是 false 因为 event.keyCode 只持有一个值。

针对您的情况的一种常见方法是使用一个全局按键按下和按键向上侦听器。然后用一个字典来存储当前有哪些key是down的:

//create just one key down listener
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

//create a dictionary to store key presses
var keyboardDown:Dictionary = new Dictionary();

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

function keyUpHandler(e:KeyboardEvent):void {
    keyboardDown[e.keyCode] = false;
}

你在这里做的是,当按键按下事件触发时,你将字典中的值设置为 true(键码作为字典键),然后在按键弹起事件上将其设置为 false .

现在,在您的 ENTER_FRAME 处理程序中,您使用字典值来检查组合键:

hero.addEventListener(Event.ENTER_FRAME, moveHero);

function moveHero(event:Event) {
    //DO ALL YOUR MOVEMENTS IN ONE ENTER FRAME FUNCTION

    if (keyboardDown[Keyboard.LEFT]) {
        hero.x-=speed;
        hero.play();
    }

    if (keyboardDown[Keyboard.RIGHT]) {
       hero.x+=speed;
       hero.play();
    }

    if (hero.hitTestObject(platform) && keyboardDown[Keyboard.UP]) {
        gravity=-50;
        hero.y=hero.y+gravity;
    } else if (hero.hitTestObject(platform2) && keyboardDown[Keyboard.UP]) {
        gravity=-50;
        hero.y=hero.y+gravity;
    } else if (hero.hitTestObject(platform4) && keyboardDown[Keyboard.UP]) {
        gravity=-50;
        hero.y=hero.y+gravity;
    }

    if(hero.hitTestObject(platform) && keyboardDown[Keyboard.UP] && keyboardDown[Keyboard.RIGHT]){
        movex = 20;
        hero.x = hero.x + movex;
        gravity =-50;
        hero.y = hero.y + gravity;
    }

}