【发布时间】:2016-05-03 19:31:13
【问题描述】:
好的,所以我的主要问题是用于闪存的KeyboardEvent 太慢了。可以说我按左箭头。由于某种原因,移动延迟然后移动。当我在做二段跳或根本跳的时候,我不得不按住按钮而不是单按。我的问题是闪光灯有没有办法检测任何键的单次按下以及如何解决 keyCode 的移动延迟?
import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
//Initialized variables
var theKey:KeyObject = new KeyObject(stage);//Help the stage checks for keypressed objects
var hspeed:Number = 0;// horizontal speed
var vspeed:Number = 0;// vertical speed
var gravity:Number = 2;//Gravity
var friction:Number = .5;//Friction
var ground:int = 800;//Bottom of the stage
var JumpMax:Number = 0;//Double jump
//All Booleans (Mainly player states)
var aDown:Boolean = false;//Press left key
var dDown:Boolean = false;//Press right key
var Jumped:Boolean = false;//Player in jumping state
var AttackMode:Boolean = false;//Player in attacking state
var CrouchMode:Boolean = false;//Player in crouched state
var RightSide:Boolean = false;//Player hitting right side of block
var LeftSide:Boolean = false;//Player hitting left side of block
var DownSide:Boolean = false;//Player hitting the top of block
var UpSide:Boolean = false;//Player hits bottom of block
ultraDaimyo.gotoAndStop("idleDaimyo");
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyYeet);
function keyYeet(e:KeyboardEvent):void
{
if(e.keyCode == Keyboard.D)
{
dDown = true;
}
if(e.keyCode == Keyboard.A)
{
aDown = true;
}
if(e.keyCode == Keyboard.C)
{
AttackMode = true;
}
if(e.keyCode == Keyboard.W || Jumped == true)
{
Jumped = true;
}
}
stage.addEventListener(KeyboardEvent.KEY_UP, keyNot);
function keyNot(e:KeyboardEvent):void
{
if(e.keyCode == Keyboard.D)
{
dDown = false;
}
if(e.keyCode == Keyboard.A)
{
aDown = false;
}
if(e.keyCode == Keyboard.C)
{
AttackMode = false;
}
if(e.keyCode == Keyboard.W)
{
Jumped = false;
}
}
stage.addEventListener(Event.ENTER_FRAME, gameCycle);
function gameCycle(e:Event):void
{
hspeed *= friction;
ultraDaimyo.x += hspeed;
ultraDaimyo.y += gravity;
if(AttackMode)
{
ultraDaimyo.gotoAndStop("attackDaimyo");
ultraDaimyo.x += 5;
if(ultraDaimyo.scaleX == -1)
{
ultraDaimyo.gotoAndStop("attackDaimyo");
ultraDaimyo.x -= 10;
}
}
if(Jumped == true)
{
ultraDaimyo.y -= 30;
ultraDaimyo.gotoAndStop("jumpDaimyo");
}
if(dDown)
{
hspeed += 20;
ultraDaimyo.gotoAndStop("runDaimyo");
ultraDaimyo.scaleX = 1;
}
if(aDown)
{
hspeed -= 20;
ultraDaimyo.gotoAndStop("runDaimyo");
ultraDaimyo.scaleX = -1;
}
if(!aDown && !dDown && !AttackMode && !Jumped)
{
ultraDaimyo.gotoAndStop("idleDaimyo");
}
if(ultraDaimyo.x - ultraDaimyo.width/2 < 0)//If the player goes past the left side
{
ultraDaimyo.x = ultraDaimyo.width/2;
}
if(ultraDaimyo.x + ultraDaimyo.width/2 > 1400)//If the player goes past right
{
ultraDaimyo.x = 1400 - ultraDaimyo.width/2;//Player cant go past
}
if(ultraDaimyo.y + ultraDaimyo.height/2 < floor && Jumped)//If we are above the floor
{
if(Jumped)
{
ultraDaimyo.gotoAndStop("jumpDaimyo");
}
gravity++;//Accelerate gravity in the process
}
if(ultraDaimyo.y + ultraDaimyo.height/2 > floor)
{
Jumped = false;//If we are on the floor then we're not jumping
gravity = 0;//Gravity can no longer be applied
ultraDaimyo.y = floor - ultraDaimyo.height/2;//Player sits on top of the floor
}
}
【问题讨论】:
-
答案是肯定的。如果您想要比这更好的答案,请编辑您的问题并向您显示当前代码,以便有人可以指出您的延迟来自哪里。
-
更新:我刚刚在这里添加了我的角色 Daimyo 的完整代码。现在问题是键盘事件本身。 keyCode 只是延迟片刻,然后进行移动。另外,我仍然想知道 as3 是否只能检测到按下而不是保持。谢谢!
-
您所说的“仅按”是什么意思?本质上,
KEY_UP事件相当于一次新闻发布会。您的代码看起来不错,如果我不得不猜测,您的延迟来自您的gotoAndStop,而不是事件本身。尝试在您的按键处理程序 (keyYeet) 中添加一个跟踪语句,看看该跟踪是否会立即触发,而不是您在时间轴上看到的任何内容。 -
是的,它可以检测短按和长按。为什么你的
function keyYeet中需要if(aDown)语句和布尔值之类的东西?只要该相关键发送“使用中”信号,ultraDaimyo...代码就会持续触发。实验并查看... -
我的意思是能够检测到一个简单的点击,而不是实际按住它。我在跳跃时遇到问题,因为我实际上必须按住向上键才能真正让玩家处于跳跃状态,直到它到达地面。我只想让 flash 简单地检测一个短暂的点击,然后执行整个跳转过程。
标签: actionscript-3 flash