2010-02-12 2 views
2

Я начинаю программировать Flash ActionScript 3.0. Я пытаюсь создать гладкие элементы управления клавиатурой для движения игрока в игре.В Flash ActionScript 3.0 как создать гладкие элементы управления клавиатурой для движения игрока?

В настоящее время я использую addEventListener (KeyboardEvent.KEY_DOWN), который прослушивает нажатие клавиши клавиатуры, а затем в функции обработчика перемещает графику, добавляя номер к свойству .x или .y.

Это создает медленный, вялый рывок в начале. Я знаю, что есть более плавный, более отзывчивый способ сделать это, но не знаю, с чего начать. Любая помощь будет оценена!

ответ

0

Где вы размещаете слушателя? Это в приложении или в спрайте, который должен двигаться? Спрайт имеет фокус, когда вы нажимаете клавишу?

Кроме того, при добавлении прослушивателя событий вы используете захват? То есть, вы установка 3-й аргумента так, как в

addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true) 

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

Что вы можете сделать, так это иметь спрайт, который имеет фокус, посылать настраиваемое событие, которое класс контроллера прослушивает для каждого спрайта. Класс контроллера будет иметь обработчик, который перемещает event.currentTarget, однако вы планируете его выполнить.

Также читайте о пользовательских событиях и о том, как использовать SystemManager для динамического добавления и удаления слушателей: http://livedocs.adobe.com/flex/3/langref/index.html.

2

Для гладких клавиш я бы предложил использовать таймер или onEnterFrame для опроса для ключей достаточно часто, чтобы получить плавный контроль. Он выполнит свою работу, но с определенным расходом. Если у вас есть остаток логики все в порядке, это должно вписываться в ок:

var key:int = NaN; 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true); 
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true); 
this.addEventListener(Event.ENTER_FRAME,update,false,0,true); 

function onKeyPress(event:KeyboardEvent):void { 
    key = event.keyCode; 
    event.stopPropagation(); 
} 
function onKeyRelease(event:KeyboardEvent):void { 
    key = NaN; 
    event.stopPropagation(); 
} 
function update(event:Event):void{ 
    if(key) trace(key); 
} 

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

НТН, Джордж

+2

Сделайте это. Чтобы быть ясным, проблема с версией опроса заключается в том, что вы двигаетесь только тогда, когда на самом деле нажата клавиша, поэтому она перемещается один раз, когда вы сначала нажимаете клавишу, а затем движется дальше, когда ОС начинает выдавать повторяющиеся события из-за нажатие клавиши. Вы не хотите, чтобы символ перемещался *, когда * нажата клавиша, вы хотите, чтобы она перемещалась по обновлениям фрейма *, а * нажата клавиша, поэтому движение должно выполняться в обработчике ENTER_FRAME, а не в обработчике нажатия. – fenomas

0

самый простой пример, чтобы это было бы это.
здесь у вас есть управляемый класс корабля (Ship.as).

import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 
import flash.events.Event; 

public class Ship extends MovieClip { 

    private var speedX; 
    private var speedY; 

    public function Ship() { 
     //constructor 
     stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp); 
     stage.addEventListener(Event.ENTER_FRAME, update); 
    } 

    public function keyDown(e:KeyboardEvent) { 
     if(e.keyCode == 37) { 
      speedX = -5; 
     } 
     if(e.keyCode == 38) { 
      speedY = -5; 
     } 
     if(e.keyCode == 39) { 
      speedX = 5; 
     } 
     if(e.keyCode == 40) { 
      speedY = 5; 
     } 
    } 

    public function keyUp(e:KeyboardEvent) { 
     if(e.keyCode == 37 || e.keyCode == 39) { 
      speedX = 0; 
     } 
     if(e.keyCode == 38 || e.keyCode == 40) { 
      speedY = 0; 
     } 
    } 

    public function update(e:Event) { 
     x += speedX; 
     y += speedY; 
    } 

}