This commit is contained in:
2014-08-26 09:53:40 +04:00
parent 36dfa19d86
commit c08638c264
3 changed files with 32 additions and 17 deletions

View File

@@ -8,27 +8,44 @@ import flash.Lib;
class PlayerTank extends Tank { class PlayerTank extends Tank {
private var keyBinding:Map<Int, TankAction>; private var keyBinding:Map<Int, TankAction>;
private var moveQueue:Array<Int>;
public function new(position:Point, keyBinding:Map<Int, TankAction>) { public function new(position:Point, keyBinding:Map<Int, TankAction>) {
super(position); super(position);
this.keyBinding = keyBinding; this.keyBinding = keyBinding;
moveQueue = new Array<Int>();
Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
} }
private function onKeyDown(event:KeyboardEvent):Void { private function onKeyDown(event:KeyboardEvent):Void {
switch (keyBinding.get(event.keyCode)) { switch (keyBinding.get(event.keyCode)) {
case TankAction.MOVE_LEFT: move(Direction.LEFT); case TankAction.MOVE(direction):
case TankAction.MOVE_TOP: move(Direction.TOP); if (moveQueue.indexOf(event.keyCode) == -1) {
case TankAction.MOVE_RIGHT: move(Direction.RIGHT); moveQueue.unshift(event.keyCode);
case TankAction.MOVE_BOTTOM: move(Direction.BOTTOM); updateMove();
}
case TankAction.SHOT: shot(); case TankAction.SHOT: shot();
} }
} }
private function onKeyUp(event:KeyboardEvent):Void { private function onKeyUp(event:KeyboardEvent):Void {
if (keyBinding.exists(event.keyCode)) { switch (keyBinding.get(event.keyCode)) {
case TankAction.MOVE(direction):
moveQueue.remove(event.keyCode);
updateMove();
case _: {};
}
}
private function updateMove():Void {
if (moveQueue.length == 0) {
stop(); stop();
} else {
switch (keyBinding.get(moveQueue[0])) {
case TankAction.MOVE(direction): move(direction);
case _: {};
}
} }
} }
} }

View File

@@ -3,10 +3,7 @@ package ru.m.tankz.core;
import flash.geom.Point; import flash.geom.Point;
enum TankAction { enum TankAction {
MOVE_LEFT; MOVE(direction:Direction);
MOVE_TOP;
MOVE_RIGHT;
MOVE_BOTTOM;
SHOT; SHOT;
} }

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.core.Direction;
import ru.m.tankz.core.IMobileEntity; import ru.m.tankz.core.IMobileEntity;
import flash.geom.Point; import flash.geom.Point;
import flash.ui.Keyboard; import flash.ui.Keyboard;
@@ -31,17 +32,17 @@ class Tankz implements ITankz {
map = new TankzMap(config.map); map = new TankzMap(config.map);
tanks = [ tanks = [
new PlayerTank(new Point(0, 0), [ new PlayerTank(new Point(0, 0), [
Keyboard.A => TankAction.MOVE_LEFT, Keyboard.A => TankAction.MOVE(Direction.LEFT),
Keyboard.S => TankAction.MOVE_BOTTOM, Keyboard.S => TankAction.MOVE(Direction.BOTTOM),
Keyboard.W => TankAction.MOVE_TOP, Keyboard.W => TankAction.MOVE(Direction.TOP),
Keyboard.D => TankAction.MOVE_RIGHT, Keyboard.D => TankAction.MOVE(Direction.RIGHT),
Keyboard.SPACE => TankAction.SHOT Keyboard.SPACE => TankAction.SHOT
]), ]),
new PlayerTank(new Point(100, 0), [ new PlayerTank(new Point(100, 0), [
Keyboard.LEFT => TankAction.MOVE_LEFT, Keyboard.LEFT => TankAction.MOVE(Direction.LEFT),
Keyboard.DOWN => TankAction.MOVE_BOTTOM, Keyboard.DOWN => TankAction.MOVE(Direction.BOTTOM),
Keyboard.UP => TankAction.MOVE_TOP, Keyboard.UP => TankAction.MOVE(Direction.TOP),
Keyboard.RIGHT => TankAction.MOVE_RIGHT, Keyboard.RIGHT => TankAction.MOVE(Direction.RIGHT),
Keyboard.SHIFT => TankAction.SHOT Keyboard.SHIFT => TankAction.SHOT
]) ])
]; ];