Как преобразовать события клавиатуры AS3 в события мыши?

Я хотел бы сохранить события клавиатуры, но также добавить события мыши. События моей игровой клавиатуры работают нормально, я просто не могу понять, как добавить к ним события мыши.

У меня есть несколько мувиклипов на моей сцене слева направо вверх вниз и т. д.

Character.as

[code]
if( m_keyboard.IsKeyDown( eKeyCodes.kLeftArrow ) )
{
    walking = true;
    x += 1;
    this.scaleX = 1;    
}

if( m_keyboard.IsKeyDown( eKeyCodes.kRightArrow ) )
etc....
[code]

eKeyCodes.as

[code]
static public const kLeftArrow:int = 37;
static public const kRightArrow:int = 39;

etc....
[/code]

Keyboard.as
[/code]
public class Keyboard
{
    private const kNumKeyCodes:int = 255;

    private var m_liveKeyState:Vector.<Boolean>;
    private var m_keyState:Vector.<Boolean>;
    private var m_lastKeyState:Vector.<Boolean>;

    public function Keyboard( stage:Stage )
    {
        // add handlers
        stage.addEventListener( KeyboardEvent.KEY_DOWN, OnKeyDown, false, 0, true );
        stage.addEventListener( KeyboardEvent.KEY_UP, OnKeyUp, false, 0, true );

        // vector is an array of booleans , the array is length is passed into the constructor as 255.
        m_keyState = new Vector.<Boolean>( kNumKeyCodes );
        m_lastKeyState = new Vector.<Boolean>( kNumKeyCodes );
        m_liveKeyState = new Vector.<Boolean>( kNumKeyCodes );

        // clear state
        for ( var i:int = 0; i<kNumKeyCodes; i++ )
        {
            // the whole array is false;
            m_keyState[i] = false;
            m_lastKeyState[i] = false;
            m_liveKeyState[i] = false;
        }



    }

    public function Update( ):void
    {

        for ( var i:int = 0; i<kNumKeyCodes; i++ )
        {
            m_lastKeyState[i] = m_keyState[i];
            m_keyState[i] = m_liveKeyState[i];
        }
    }

    private function OnKeyDown( e:KeyboardEvent ):void
    {

        m_liveKeyState[e.keyCode] = true;
        trace("m_liveKeyState = " + e.keyCode);
    }

    private function OnKeyUp( e:KeyboardEvent ):void
    {

        m_liveKeyState[e.keyCode] = false;
    }

    public function IsKeyDown( key:int ):Boolean           
    {
        // if key is down leftarrow ( 36 ) && 36 < 255 do no error; as key is a valid key;
        Assert( key >= 0 && key <= kNumKeyCodes, "Keyboard.IsKeyDown(): invalid key!" );

        return m_keyState[key];

    }

    /// Is key transitioning 

    public function IsKeyDownTransition( key:int ):Boolean
    {
        Assert( key >= 0 && key <= kNumKeyCodes, "Keyboard.IsKeyDownTransition(): invalid key!" );

        return !m_lastKeyState[key] && m_keyState[key]; 
    }
}
}
[/code]

Я думал что-то вроде ....

TouchButtons.as
[code]
 icon.leftButton.addEventListner(MouseEvent.MOUSE_DOWN, leftButtonPressed, false, 0, true);
 icon.RightButton.addEventListner(MouseEvent.MOUSE_DOWN, rightButtonPressed, false, 0, true);


 public function leftButtonPressed( event:MouseEvent ):void
 {
      m_keyboard.IsKeyDown( eKeyCodes.kLeftArrow  );
 }
 etc...
[code]

Но это, похоже, не работает, есть ли простой способ сделать это.


person Luke Dobner    schedule 14.06.2013    source источник


Ответы (2)


Я думаю, вы хотите, чтобы это работало как сценическое событие.

public function leftButtonPressed( event:MouseEvent ):void
{
      m_liveKeyState[eKeyCodes.kLeftArrow] = true;
 }
person Pan    schedule 15.06.2013
comment
Я попробую, спасибо, мне также нужно будет сделать прослушиватели событий для отпускания левой и правой кнопок, не так ли? - person Luke Dobner; 15.06.2013
comment
Да, вам нужно добавить прослушиватели событий для других кнопок. Вы можете использовать одну функцию обработчика событий для всех кнопок, которые вы хотите, и переключать цель события (кнопки) в этой функции. - person Pan; 15.06.2013
comment
Я написал четыре функции для нажатия левой кнопки, отпускания левой кнопки, нажатия правой кнопки, отпускания правой кнопки, изменения истинного и ложного состояния liveKeyState, мой персонаж действительно ходит влево и вправо, но движение слева направо быстро заставляет моего персонажа идти в своем собственном направлении даже когда я ничего не нажимаю, мой код клавиатуры в порядке. Я не уверен, почему это происходит. - person Luke Dobner; 15.06.2013
comment
Вы имеете в виду, что ваш персонаж быстрее использует MouseEvent, чем kerboard? Я предполагаю, что персонаж управляет ходьбой, если персонаж должен двигаться, поэтому попробуйте отладить характер, чтобы поймать, когда ходьба должна быть установлена ​​​​на false, но не при нажатии клавиши. - person Pan; 15.06.2013
comment
Нет, я имел в виду, что быстрый переход слева направо сбивает с толку направление, в котором он должен двигаться. Я попытаюсь отладить, чтобы увидеть, замечу ли я что-нибудь. Скорость такая же, как у клавиатуры. Просто клавиатура быстро перемещается слева направо, а события мыши - нет. - person Luke Dobner; 15.06.2013

Друг схожу с ума, я хотел преобразовать этот код для использования в сенсорном экране

var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var upPressed:Boolean = false;
var downPressed:Boolean = false;

var leftBumping:Boolean = false;
var rightBumping:Boolean = false;
var upBumping:Boolean = false;
var downBumping:Boolean = false;

var leftBumpPoint:Point = new Point(-30, -55);
var rightBumpPoint:Point = new Point(70, -50);
var upBumpPoint:Point = new Point(0, -110);
var downBumpPoint:Point = new Point(0, 0);

var scrollX:Number = 0;
var scrollY:Number = 500;

var xSpeed:Number = 0;
var ySpeed:Number = 0;

var speedConstant:Number = 2;
var frictionConstant:Number = 0.9;
var gravityConstant:Number = 1.8;
var jumpConstant:Number = -30;
var maxSpeedConstant:Number = 18;

var doubleJumpReady:Boolean = false;
var upReleasedInAir:Boolean = false;

var keyCollected:Boolean = false;
var doorOpen:Boolean = false;

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

stage.addEventListener(Event.ENTER_FRAME, loop);

function loop(e:Event):void{
	if(back.collisions.hitTestPoint(player.x + leftBumpPoint.x, player.y + leftBumpPoint.y, true)){
		//trace("leftBumping");
		leftBumping = true;
	} else {
		leftBumping = false;
	}
	
	if(back.collisions.hitTestPoint(player.x + rightBumpPoint.x, player.y + rightBumpPoint.y, true)){
		//trace("rightBumping");
		rightBumping = true;
	} else {
		rightBumping = false;
	}
	
	if(back.collisions.hitTestPoint(player.x + upBumpPoint.x, player.y + upBumpPoint.y, true)){
		//trace("upBumping");
		upBumping = true;
	} else {
		upBumping = false;
	}
	
	if(back.collisions.hitTestPoint(player.x + downBumpPoint.x, player.y + downBumpPoint.y, true)){
		//trace("downBumping");
		downBumping = true;
	} else {
		downBumping = false;
	}	
	

	if(leftPressed){
		xSpeed -= speedConstant;
		player.scaleX = -1;

	} else if(rightPressed){
		xSpeed += speedConstant;
		player.scaleX = 1;
	}


	if(leftBumping){
		if(xSpeed < 0){
			xSpeed *= -0.5;
		}
	}
	
	if(rightBumping){
		if(xSpeed > 0){
			xSpeed *= -0.5;
		}
	}
	
	if(upBumping){
		if(ySpeed < 0){
			ySpeed *= -0.5;
		}
	}
	
	if(downBumping){ //if we are touching the floor
		if(ySpeed > 0){ 
			ySpeed = 0; //set the y speed to zero
		}
		if(upPressed){ //and if the up arrow is pressed
			ySpeed = jumpConstant; //set the y speed to the jump constant
		}
		
		//DOUBLE JUMP
		if(upReleasedInAir == true){
			upReleasedInAir = false;
		}
		if(doubleJumpReady == false){
			doubleJumpReady = true;
		}
	} else { //if we are not touching the floor
		
		ySpeed += gravityConstant; //accelerate downwards
		
		//DOUBLE JUMP
		if(upPressed == false && upReleasedInAir == false){
			upReleasedInAir = true;
			//trace("upReleasedInAir");
		}
		if(doubleJumpReady && upReleasedInAir){
			if(upPressed){ //and if the up arrow is pressed
				//trace("doubleJump!");
				doubleJumpReady = false;
				ySpeed = jumpConstant; //set the y speed to the jump constant
			}
		}
		
	}
	
	if(keyCollected == false){
		if(player.hitTestObject(back.doorKey)){
			back.doorKey.visible = false;
			keyCollected = true;
			trace("key collected");
		}
	}
	
	if(doorOpen == false){
		if(keyCollected == true){
			if(player.hitTestObject(back.lockedDoor)){
				back.lockedDoor.gotoAndStop(2);
				doorOpen = true;
				trace("door open");
			}
		}
	}
											 
	
	if(xSpeed > maxSpeedConstant){ //moving right
		xSpeed = maxSpeedConstant;
	} else if(xSpeed < (maxSpeedConstant * -1)){ //moving left
		xSpeed = (maxSpeedConstant * -1);
	}
	
	xSpeed *= frictionConstant;
	ySpeed *= frictionConstant;
	
	if(Math.abs(xSpeed) < 0.5){
		xSpeed = 0;
	}
	
	scrollX -= xSpeed;
	scrollY -= ySpeed;

	back.x = scrollX;
	back.y = scrollY;
	
	sky.x = scrollX * 0.2;
	sky.y = scrollY * 0.2;
	
}

function keyDownHandler(e:KeyboardEvent):void{
	if(e.keyCode == Keyboard.LEFT){
		leftPressed = true;
	
	} else if(e.keyCode == Keyboard.RIGHT){
		rightPressed = true;
	
	} else if(e.keyCode == Keyboard.UP){
		upPressed = true;
	
	} else if(e.keyCode == Keyboard.DOWN){
		downPressed = true;
	}	
}

function keyUpHandler(e:KeyboardEvent):void{
	if(e.keyCode == Keyboard.LEFT){
		leftPressed = false;
	
	} else if(e.keyCode == Keyboard.RIGHT){
		rightPressed = false;
	
	} else if(e.keyCode == Keyboard.UP){
		upPressed = false;
	
	} else if(e.keyCode == Keyboard.DOWN){
		downPressed = false;
	}	
}

person Lailson R silva    schedule 23.05.2015
comment
Это не ответ, и вы не должны публиковать это здесь. Вы должны опубликовать свой собственный вопрос с подробным описанием того, что вы ищете, что вы пробовали и что у вас есть, а также опубликовать любой соответствующий код. - person Norman Breau; 24.05.2015