我无法弄清楚为什么当我尝试通过按向右和向上箭头键让我的播放器沿对角线跳跃它没有任何作用时,我已经使用了跟踪来查看是否有任何事情发生,什么都没有当它们一起使用时
单独或正确地完成工作,但当权利本身就有效时。
播放器被命名为英雄,平台被命名为platform,platform2,platform3等
平台位于平台层
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
答案 0 :(得分:1)
首先,让我们了解您如何设置此代码并解释发生了什么。
你有这一行:
hero
这就是说,testCollision2
存在的每个帧标记运行函数testCollision2
。这里的框架勾选不会与时间轴框架相关,它与您的应用程序的帧速率有关。因此,如果将其设置为12,则该函数将每秒运行12次。
在stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHeroUP);
内,添加另一个侦听器:
moveHeroUP
并创建一个名为(event.keyCode==Keyboard.UP && event.keyCode==Keyboard.RIGHT)
的内联函数。因此,每一帧勾选,您创建一个新功能,并将其附加到按键事件。所以(假设每秒12帧)你的应用程序5秒钟,你将有60个键盘监听器都做同样的事情。这也是一个内存泄漏(因为你每帧都在创建一个新函数),所以最终你的程序会崩溃。
要了解实际问题,键盘事件与一个特定键绑定。这意味着事件的keyCode只有一个键(触发事件的键)。因此false
之类的内容始终为event.keyCode
,因为//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;
}
只保留一个值。
对您的情况采用一种常见的方法,就是让一个全局键关闭,然后键入监听器。然后使用字典存储当前关键的键:
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;
}
}
你在这里做的是,当一个按键事件触发时,你将字典中的值设置为true(使用keycode作为字典键),然后在key up事件中将它设置为false
现在,在您的ENTER_FRAME处理程序中,您使用字典值来检查组合键:
-StayProvisioned