[英]Flash As3 key press issue
好的,所以我的主要問題是,Flash的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
}
}
KeyboardEvent
不會連續觸發,因為這將使檢測單個擊鍵變得困難。
您要做的是使用KeyboardEvent
僅更改速度變量,但將速度應用於另一個連續Event
(即Event.ENTER_FRAME
的位置變量。
我根據您的代碼創建了一個示例:
import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
//Initialized variables
var speedX:Number = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyYeet);
function keyYeet(e:KeyboardEvent):void
{
if(e.keyCode == Keyboard.D)
{
speedX = 20;
}
if(e.keyCode == Keyboard.A)
{
speedX = -20;
}
}
stage.addEventListener(KeyboardEvent.KEY_UP, keyNot);
function keyNot(e:KeyboardEvent):void
{
if(e.keyCode == Keyboard.D || e.keyCode == Keyboard.A)
{
speedX = 0;
}
}
addEventListener(Event.ENTER_FRAME, gameCycle);
function gameCycle(e:Event):void
{
ultraDaimyo.x += speedX;
}
這個想法是當按鍵下降到某個值時設置速度,並在按鍵返回時將其設置回0。
速度將連續應用於該位置。
從評論:
請仔細檢查您的第一句話。
確實有錯別字,但內容確實如我所願。
結果是連續射擊=連續運動。
不適合我。 對於不同的(鍵盤)硬件或軟件(操作系統,閃存運行時),這可能是不同的。 其他人也有類似的經驗,就像在手頭的問題的這些副本中可以看到的那樣。
我們不要看顯示對象的移動,也不要比較它們是否連續移動的觀點。 讓我們收集一些可比較的數據。
這是一個小的文檔類,它計算KEY_DOWN
事件在5次出現之間的延遲。
要使用它,請確保應用程序具有焦點並按下任意按鈕,直到軌跡出現在輸出面板中。
釋放鍵將重置陣列,並且可以按住另一個鍵。
package
{
import flash.utils.getTimer;
import flash.events.KeyboardEvent;
import flash.display.Sprite;
public class Main extends Sprite
{
private var oldTime:Number = 0;
private var deltaTimes:Array = [];
public function Main()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
}
private function onKeyDown(e:KeyboardEvent):void
{
var currentTime:Number = getTimer();
// collect 5 time differences between two consecutive occurrences of this event
if (deltaTimes.length < 5)
{
deltaTimes.push(currentTime - oldTime)
}
else
{
stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
trace(deltaTimes);
}
oldTime = currentTime;
}
private function onKeyUp(e:KeyboardEvent = null):void
{
deltaTimes = [];
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
}
}
這是我的結果:
7584,499,49,51,50
2117,500,50,50,50
1786,500,50,50,49
1375,499,48,50,52
1395,500,50,50,50
1385,500,50,50,50
1243,501,47,52,49
2167,501,49,50,50
1587,500,50,50,50
3871,500,50,48,53
2237,500,49,51,49
1715,500,47,53,50
可以觀察到三個重要的事情:
我在上面的答案中提供的代碼解決了此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.