Во Flash Actionscript 3.0 как создать плавные элементы управления клавиатурой для движения игрока?
Я новичок в программировании на Flash Actionscript 3.0. Я пытаюсь создать плавные элементы управления клавиатурой для движения игрока в игре.
В настоящее время я использую addEventListener(KeyboardEvent.KEY_DOWN), слушая нажатие клавиши клавиатуры, а затем в функции обработчика перемещая изображение, добавляя число к его свойству.x или.y.
Это создает медленный, вялый рывок в начале. Я знаю, что есть более плавный, более отзывчивый способ сделать это, но понятия не имею, с чего начать. Любая помощь будет оценена!
3 ответа
Для гладких клавиш я бы предложил использовать Timer или 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.
HTH, Джордж
Где вы размещаете слушателя? Это в приложении или в спрайте, который должен двигаться? Имеет ли спрайт фокус при нажатии клавиши?
Кроме того, при добавлении прослушивателя событий вы используете захват? То есть вы устанавливаете для третьего аргумента значение true, как в
addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)
Если вы используете перехват, то есть, как вы должны это делать, если само приложение прослушивает событие, тогда вы получите определенную задержку, и эта задержка будет тем больше, чем сложнее интерфейс. Если эти события должны продвигаться вверх по обширной иерархии, это может быть заметно. Если есть много спрайтов, это может усугубить проблему.
То, что вы можете сделать, это заставить спрайт, имеющий фокус, отправлять пользовательское событие, которое класс контроллера слушает для каждого спрайта. Класс контроллера будет иметь обработчик, который перемещает event.currentTarget, однако вы планируете это сделать.
Также читайте о пользовательских событиях и о том, как использовать SystemManager для динамического добавления и удаления прослушивателей: http://livedocs.adobe.com/flex/3/langref/index.html.
Самый простой пример этого будет это.
здесь у вас есть управляемый класс корабля (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;
}
}