0

Я работаю над игрой DDR для своего курса по программированию игр, и я смог заставить стрелки работать с помощью мыши. Но нужно также заставить его работать, используя клавиатуру. Я не могу заставить его работать с помощью клавиатуры.AS3 Преобразование MouseEvent в KeyboardEvent

Вот мой исходный код, как бы преобразовать MouseEvent для работы с помощью KeyboardEvents для кнопок вверх, вниз, влево и вправо?

import flash.events.KeyboardEvent; 
import flash.display.MovieClip; 
import flashx.textLayout.operations.ModifyInlineGraphicOperation; 
import flash.events.MouseEvent; 
import flash.events.Event; 
import flash.net.URLRequest; 
import flash.media.Sound; 
import flash.media.SoundChannel; 

var pattern = new Array(); 
var buttons = new Array(); 
buttons.push(up, bottom, left, right); 
var position = 0; 
var playersTurn = false; 
var mc_starttext:MovieClip; 
var mc_background:MovieClip; 

//generate the pattern 
setTimeout(nextMove, 1000); // call after 1 second 

// Expecting click from they keyboard 

up.addEventListener(MouseEvent.CLICK, clicked); 
bottom.addEventListener(MouseEvent.CLICK, clicked); 
left.addEventListener(MouseEvent.CLICK, clicked); 
right.addEventListener(MouseEvent.CLICK, clicked); 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onkeyPress); 
stage.addEventListener(KeyboardEvent.KEY_UP, onkeyRelease); 


mc_starttext.buttonMode = true; 
mc_starttext.addEventListener(MouseEvent.CLICK, startClick) 
mc_background.buttonMode = true; 
mc_background.addEventListener(MouseEvent.CLICK, startClick) 


function startClick(e:MouseEvent):void{ 
      dispatchEvent(new Event("START_GAME")); 
     } 

function hideScreen():void{ 
      this.visible = false; 
     } 

function showScreen():void{ 
      this.visible = true; 
     } 

function onkeyPress(event:KeyboardEvent):void{ 

    if (event.keyCode == 13)//enter 
       { 
        this.mc_background.visible = false 
        this.mc_starttext.visible = false 
        //this.StartCover.visible = false; 
        //this.StartText.visible = false; 

        //this.score.text = position.toString(); 
        //this.score.visible = true; 

        //startPlay = true; 
        setTimeout(nextMove, 2000);//Call nextmove after two second 

       } 

    if (event.keyCode == 32) 
    { 
     trace("space bar"); 
    } 
} 

function onkeyRelease(event:KeyboardEvent):void{ 
    if (event.keyCode == 32){ 
     trace("space release"); 
    } 
} 

function clicked(clickInfo:MouseEvent){ 

    if(!playersTurn) return; 

    if (clickInfo.target == pattern[position]){ 
     trace("right"); 
     position = position + 1; 
     //Check to see if it is computers turn 
     if (position == pattern.length){ 
      //CPUs turn 
      position = 0; 
      setTimeout(nextMove, 1000) 
     } 
     // play button animation 
     clickInfo.target.gotoAndPlay(2); 
    } else { 
     trace("wrong"); 
    } 

} 

function nextMove(){ 

    if (position < pattern.length){ 
     pattern[position].play(); 
     position++; 
     setTimeout(nextMove, 1000); 
    } else { 
     // Generate random number 
     var randomNumber = Math.floor(Math.random()*4); 
     pattern.push(buttons[randomNumber]); 
     buttons[randomNumber].play(); 
     playersTurn = true; 
     position = 0; 
    } 
} 
+0

Решено ли это сейчас или вам все еще нужно подключить одну функцию к мыши и клавиатуре? –

+0

На самом деле я еще не смог его решить! Это должно быть в понедельник, и я работал на других курсах, так что держал это, потому что я застрял. Я не мог понять, как заставить его работать как для мыши, так и для клавиатуры. @ VC.One – DaveTheCoder

ответ

0

Посмотрите, поможет ли этот демо-код понять, как использовать одну функцию для обработки как событий Keyboard, так и Mouse.

Просто проверить по ...

  • Сделать форму прямоугольника (рисовать на сцене или создать с помощью кода).
  • Дайте ему имя экземпляра: окно

Затем добавить код, приведенный ниже. Это самоочевидно, но спросите все, что вам нужно. Надеюсь, поможет.

//variable "box" is a rectangle on Stage with instance name "box" 

//# Both Mouse & Keyboard events point to one "control_Move" function 
stage.addEventListener(KeyboardEvent.KEY_DOWN, control_Move); 
box.addEventListener(MouseEvent.CLICK, control_Move); 

//# Make function of generic-ish Event type 
function control_Move (evt:Event) : void 
{ 
    //trace ("evt.type : " + evt.type); 

    if (evt.type == "click") //# If mouse clicked 
    { 
     //# If click target is "box" then move "box" forward +5 pixels 
     if (evt.target.name == "box") { box.x += 5; } 

    } 

    if (evt.type == "keyDown") //# If keyboard pressed 
    { 
     //# LEFT ARROW KEY 
     if (KeyboardEvent(evt).keyCode == 37) { box.x -= 5; } 

     //# RIGHT ARROW KEY 
     if (KeyboardEvent(evt).keyCode == 39) { box.x += 5; } 

    } 

} 
+0

Спасибо! Я просто побежал, и это работает, как вы сказали. Я возьму это знание и осуществлю его, чтобы делать то, что мне нужно! Я очень ценю помощь! @ VC.One – DaveTheCoder

3

Простой. Поскольку у вас уже есть KeyboardEvent.KEY_DOWN слушателя, сделать функцию:

onkeyPress(e) 
    { 

    } 

В рамках этой функции дополнения «если» тестирования заявления для ключевых кодов, например:

if(e.keyCode == 37)  //this is the code for the left arrow key 
    { 


    } 

Затем рассказать свою программу, что вы хотите, чтобы он делал это нажатие.

Вы должны быть в состоянии выяснить остальное самостоятельно.

+0

Спасибо большое! Имеет смысл! – DaveTheCoder

+0

Я предполагаю, что мой вопрос был не таким ясным, но я сделал это раньше, но я имел в виду, что у меня есть кнопки (вверх, вниз, вправо, влево), установленные в MouseEvents, которые отправляются на функцию щелчка, как бы я изменить это, чтобы работать с событиями клавиатуры? Я новичок в этом, поэтому я знаю, что делает up.addEventListener (KeyboardEvent.KEY_DOWN, onKeyPress); wont work @Craig – DaveTheCoder

+0

Я не совсем понимаю вас, DaveTheCoder. Вы спрашиваете, как кнопка Object или объект MovieClip может отправить событие клавиатуры? – Craig

Смежные вопросы