Adobe Flash CS6 AS3:KeyUp 处理程序在 KeyDown 处理程序之后立即触发
Adobe Flash CS6 AS3: KeyUp Handler triggers immediately after KeyDown Handler
所以在我的代码中,我试图让你有两个玩家,每个玩家都有自己的按键和按键处理程序,在我的附加代码中清楚地标记,并且在他们的我处理运动,玩家一有 WSAD,玩家二使用左、右、上和下键,但是,每当我按下相关的按键处理程序时,它会立即立即触发按键处理程序,我不知道为什么,这是我的代码,如果有人可以提供帮助,那就太好了! :)
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip{
var playerOneLeft:Boolean = new Boolean(false);
var playerOneRight:Boolean = new Boolean(false);
var playerOneUp:Boolean = new Boolean(false);
var playerOneDown:Boolean = new Boolean(false);
var playerTwoLeft:Boolean = new Boolean(false);
var playerTwoRight:Boolean = new Boolean(false);
var playerTwoUp:Boolean = new Boolean(false);
var playerTwoDown:Boolean = new Boolean(false);
var playerSpeed:int = 5;
var gamePage:GamePage;
public function Main(){
gamePage = new GamePage();
addChild(gamePage);
addAllPlayerHandlers();
}
public function playerOneKeyDownHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.A){
playerOneLeft = true;
trace("a");
}
else if(event.keyCode == Keyboard.D){
playerOneRight = true;
trace("d");
}
else if(event.keyCode == Keyboard.W){
playerOneUp = true;
trace("w");
}
else if(event.keyCode == Keyboard.S){
playerOneDown = true;
trace("s");
}
}
public function playerOneKeyUpHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.A){
playerOneLeft = false;
trace("a");
}
else if(event.keyCode == Keyboard.D){
playerOneRight = false;
trace("d");
}
else if(event.keyCode == Keyboard.W){
playerOneUp = false;
trace("w");
}
else if(event.keyCode == Keyboard.S){
playerOneDown = false;
trace("s");
}
}
public function playerTwoKeyDownHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.LEFT){
playerTwoLeft = true;
trace("left");
}
else if(event.keyCode == Keyboard.RIGHT){
playerTwoRight = true;
trace("right");
}
else if(event.keyCode == Keyboard.UP){
playerTwoUp = true;
trace("up");
}
else if(event.keyCode == Keyboard.DOWN){
playerTwoDown = true;
trace("down");
}
}
public function playerTwoKeyUpHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.LEFT){
playerTwoLeft = false;
trace("left");
}
else if(event.keyCode == Keyboard.RIGHT){
playerTwoRight = false;
trace("right");
}
else if(event.keyCode == Keyboard.UP){
playerTwoUp = false;
trace("up");
}
else if(event.keyCode == Keyboard.DOWN){
playerTwoDown = false;
trace("down");
}
}
public function playerMovementHandler(event:Event):void{
if(playerOneLeft){
gamePage.playerOne.x -= playerSpeed;
}
else if(playerOneRight){
gamePage.playerOne.x += playerSpeed;
}
else if(playerOneUp){
gamePage.playerOne.y += playerSpeed;
}
else if(playerOneDown){
gamePage.playerOne.y -= playerSpeed;
}
if(playerTwoLeft){
gamePage.playerTwo.x -= playerSpeed;
}
else if(playerTwoRight){
gamePage.playerTwo.x += playerSpeed;
}
else if(playerTwoUp){
gamePage.playerTwo.y += playerSpeed;
}
else if(playerTwoDown){
gamePage.playerTwo.y -= playerSpeed;
}
}
public function playerOneCollision(event:Event):void{
if(gamePage.playerOne.hitTestObject(gamePage.leftWall)){
gamePage.playerOne.x += playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.rightWall)){
gamePage.playerOne.x -= playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.topWall)){
gamePage.playerOne.y -= playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.bottomWall)){
gamePage.playerOne.y += playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.middleWall)){
gamePage.playerOne.x -= playerSpeed;
}
}
public function playerTwoCollision(event:Event):void{
if(gamePage.playerTwo.hitTestObject(gamePage.leftWall)){
gamePage.playerTwo.x += playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.rightWall)){
gamePage.playerTwo.x -= playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.topWall)){
gamePage.playerTwo.y -= playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.bottomWall)){
gamePage.playerTwo.y += playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.middleWall)){
gamePage.playerTwo.x += playerSpeed;
}
}
public function addPlayerMovementHandler(){
stage.addEventListener(Event.ENTER_FRAME,playerMovementHandler);
}
public function addPlayerKeyHandlers(){
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyUpHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyUpHandler);
}
public function addPlayerCollisionHandlers(){
gamePage.playerOne.addEventListener(Event.ENTER_FRAME,playerOneCollision);
gamePage.playerTwo.addEventListener(Event.ENTER_FRAME,playerTwoCollision);
}
public function addAllPlayerHandlers(){
addPlayerKeyHandlers();
addPlayerCollisionHandlers();
addPlayerMovementHandler();
}
}
when ever I press the relative key down handler, it immediately fires the key up handler straight after
这是因为您将他们注册为
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyUpHandler); // this is for type KEY_DOWN, but the handler is "Up"
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyDownHandler); //that looks suspicious, too
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyUpHandler);
您应该吸取的教训是,您编写代码的复制和粘贴方法是一种不好的做法。你不应该重复自己。所有这些重复的代码都会导致类似手头的问题。
所以在我的代码中,我试图让你有两个玩家,每个玩家都有自己的按键和按键处理程序,在我的附加代码中清楚地标记,并且在他们的我处理运动,玩家一有 WSAD,玩家二使用左、右、上和下键,但是,每当我按下相关的按键处理程序时,它会立即立即触发按键处理程序,我不知道为什么,这是我的代码,如果有人可以提供帮助,那就太好了! :)
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip{
var playerOneLeft:Boolean = new Boolean(false);
var playerOneRight:Boolean = new Boolean(false);
var playerOneUp:Boolean = new Boolean(false);
var playerOneDown:Boolean = new Boolean(false);
var playerTwoLeft:Boolean = new Boolean(false);
var playerTwoRight:Boolean = new Boolean(false);
var playerTwoUp:Boolean = new Boolean(false);
var playerTwoDown:Boolean = new Boolean(false);
var playerSpeed:int = 5;
var gamePage:GamePage;
public function Main(){
gamePage = new GamePage();
addChild(gamePage);
addAllPlayerHandlers();
}
public function playerOneKeyDownHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.A){
playerOneLeft = true;
trace("a");
}
else if(event.keyCode == Keyboard.D){
playerOneRight = true;
trace("d");
}
else if(event.keyCode == Keyboard.W){
playerOneUp = true;
trace("w");
}
else if(event.keyCode == Keyboard.S){
playerOneDown = true;
trace("s");
}
}
public function playerOneKeyUpHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.A){
playerOneLeft = false;
trace("a");
}
else if(event.keyCode == Keyboard.D){
playerOneRight = false;
trace("d");
}
else if(event.keyCode == Keyboard.W){
playerOneUp = false;
trace("w");
}
else if(event.keyCode == Keyboard.S){
playerOneDown = false;
trace("s");
}
}
public function playerTwoKeyDownHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.LEFT){
playerTwoLeft = true;
trace("left");
}
else if(event.keyCode == Keyboard.RIGHT){
playerTwoRight = true;
trace("right");
}
else if(event.keyCode == Keyboard.UP){
playerTwoUp = true;
trace("up");
}
else if(event.keyCode == Keyboard.DOWN){
playerTwoDown = true;
trace("down");
}
}
public function playerTwoKeyUpHandler(event:KeyboardEvent){
if(event.keyCode == Keyboard.LEFT){
playerTwoLeft = false;
trace("left");
}
else if(event.keyCode == Keyboard.RIGHT){
playerTwoRight = false;
trace("right");
}
else if(event.keyCode == Keyboard.UP){
playerTwoUp = false;
trace("up");
}
else if(event.keyCode == Keyboard.DOWN){
playerTwoDown = false;
trace("down");
}
}
public function playerMovementHandler(event:Event):void{
if(playerOneLeft){
gamePage.playerOne.x -= playerSpeed;
}
else if(playerOneRight){
gamePage.playerOne.x += playerSpeed;
}
else if(playerOneUp){
gamePage.playerOne.y += playerSpeed;
}
else if(playerOneDown){
gamePage.playerOne.y -= playerSpeed;
}
if(playerTwoLeft){
gamePage.playerTwo.x -= playerSpeed;
}
else if(playerTwoRight){
gamePage.playerTwo.x += playerSpeed;
}
else if(playerTwoUp){
gamePage.playerTwo.y += playerSpeed;
}
else if(playerTwoDown){
gamePage.playerTwo.y -= playerSpeed;
}
}
public function playerOneCollision(event:Event):void{
if(gamePage.playerOne.hitTestObject(gamePage.leftWall)){
gamePage.playerOne.x += playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.rightWall)){
gamePage.playerOne.x -= playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.topWall)){
gamePage.playerOne.y -= playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.bottomWall)){
gamePage.playerOne.y += playerSpeed;
}
if(gamePage.playerOne.hitTestObject(gamePage.middleWall)){
gamePage.playerOne.x -= playerSpeed;
}
}
public function playerTwoCollision(event:Event):void{
if(gamePage.playerTwo.hitTestObject(gamePage.leftWall)){
gamePage.playerTwo.x += playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.rightWall)){
gamePage.playerTwo.x -= playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.topWall)){
gamePage.playerTwo.y -= playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.bottomWall)){
gamePage.playerTwo.y += playerSpeed;
}
if(gamePage.playerTwo.hitTestObject(gamePage.middleWall)){
gamePage.playerTwo.x += playerSpeed;
}
}
public function addPlayerMovementHandler(){
stage.addEventListener(Event.ENTER_FRAME,playerMovementHandler);
}
public function addPlayerKeyHandlers(){
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyUpHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyUpHandler);
}
public function addPlayerCollisionHandlers(){
gamePage.playerOne.addEventListener(Event.ENTER_FRAME,playerOneCollision);
gamePage.playerTwo.addEventListener(Event.ENTER_FRAME,playerTwoCollision);
}
public function addAllPlayerHandlers(){
addPlayerKeyHandlers();
addPlayerCollisionHandlers();
addPlayerMovementHandler();
}
}
when ever I press the relative key down handler, it immediately fires the key up handler straight after
这是因为您将他们注册为
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN,playerOneKeyUpHandler); // this is for type KEY_DOWN, but the handler is "Up"
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyDownHandler); //that looks suspicious, too
stage.addEventListener(KeyboardEvent.KEY_UP,playerTwoKeyUpHandler);
您应该吸取的教训是,您编写代码的复制和粘贴方法是一种不好的做法。你不应该重复自己。所有这些重复的代码都会导致类似手头的问题。