[common] added control to PlayerState

This commit is contained in:
2018-01-26 12:01:38 +03:00
parent 7ac181ed5a
commit d72d7e8c81
7 changed files with 69 additions and 31 deletions

View File

@@ -8,15 +8,20 @@ import flash.ui.Keyboard;
import flash.events.KeyboardEvent; import flash.events.KeyboardEvent;
import flash.Lib; import flash.Lib;
class PlayerControl extends Control {
private var keyBinding:Map<Int, TankAction>; typedef KeyBinding = Map<Int, TankAction>;
class HumanControl extends Control {
public static var TYPE(default, never):ControlType = 'human';
private var keyBinding:KeyBinding;
private var moveQueue:Array<Int>; private var moveQueue:Array<Int>;
private var shotTimer:Timer; private var shotTimer:Timer;
public function new(keyBinding:Map<Int, TankAction>) { public function new(index:Int) {
super(); super({type:TYPE, index:index});
this.keyBinding = keyBinding; this.keyBinding = resolve(index);
moveQueue = new Array<Int>(); 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);
@@ -78,26 +83,26 @@ class PlayerControl extends Control {
action(TankAction.SHOT); action(TankAction.SHOT);
} }
public static function forPlayer(index:Int):PlayerControl { private static function resolve(index:Int):KeyBinding {
switch (index) { switch (index) {
case 0: case 0:
return new PlayerControl([ return [
Keyboard.A => TankAction.MOVE(Direction.LEFT), Keyboard.A => TankAction.MOVE(Direction.LEFT),
Keyboard.S => TankAction.MOVE(Direction.BOTTOM), Keyboard.S => TankAction.MOVE(Direction.BOTTOM),
Keyboard.W => TankAction.MOVE(Direction.TOP), Keyboard.W => TankAction.MOVE(Direction.TOP),
Keyboard.D => TankAction.MOVE(Direction.RIGHT), Keyboard.D => TankAction.MOVE(Direction.RIGHT),
Keyboard.SPACE => TankAction.SHOT Keyboard.SPACE => TankAction.SHOT
]); ];
case 1: case 1:
return new PlayerControl([ return [
Keyboard.LEFT => TankAction.MOVE(Direction.LEFT), Keyboard.LEFT => TankAction.MOVE(Direction.LEFT),
Keyboard.DOWN => TankAction.MOVE(Direction.BOTTOM), Keyboard.DOWN => TankAction.MOVE(Direction.BOTTOM),
Keyboard.UP => TankAction.MOVE(Direction.TOP), Keyboard.UP => TankAction.MOVE(Direction.TOP),
Keyboard.RIGHT => TankAction.MOVE(Direction.RIGHT), Keyboard.RIGHT => TankAction.MOVE(Direction.RIGHT),
Keyboard.NUMPAD_0 => TankAction.SHOT Keyboard.NUMPAD_0 => TankAction.SHOT
]); ];
case _: case _:
throw 'Invalid player index ${index}'; throw 'Invalid control index ${index}';
} }
} }
} }

View File

@@ -1,7 +1,6 @@
package ru.m.tankz.view.frames; package ru.m.tankz.view.frames;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.control.PlayerControl;
import flash.events.Event; import flash.events.Event;
import haxe.Timer; import haxe.Timer;
import haxework.gui.VGroupView; import haxework.gui.VGroupView;
@@ -34,9 +33,6 @@ class GameFrame extends VGroupView implements ViewBuilder implements IPacketHand
} }
game.engine.listeners.push(render); game.engine.listeners.push(render);
game.start(state); game.start(state);
for (human in state.players['human'].iterator()) {
game.setControl({team:'human', index:human.index}, PlayerControl.forPlayer(human.index));
}
content.addEventListener(Event.ENTER_FRAME, redraw); content.addEventListener(Event.ENTER_FRAME, redraw);
Provider.get(IConnection).packetHandler.addListener(this); Provider.get(IConnection).packetHandler.addListener(this);
render.draw(game.engine); render.draw(game.engine);

View File

@@ -6,13 +6,14 @@ import ru.m.geom.Direction;
import haxe.Timer; import haxe.Timer;
class Bot extends Control { class BotControl extends Control {
public static var TYPE(default, never):ControlType = 'bot';
private var shotTimer:Timer; private var shotTimer:Timer;
private var turnTimer:Timer; private var turnTimer:Timer;
public function new() { public function new(index:Int) {
super(); super({type:TYPE, index:index});
} }
override public function onCollision(with:EntityType):Void { override public function onCollision(with:EntityType):Void {
@@ -24,8 +25,9 @@ class Bot extends Control {
} }
override public function start():Void { override public function start():Void {
var tank = handler.entities.get(tankId); //var tank = handler.entities.get(tankId);
action(TankAction.MOVE(tank.rect.direction)); //action(TankAction.MOVE(tank.rect.direction));
action(TankAction.MOVE(Direction.BOTTOM)); // ToDo: hardcode bot start direction
if (shotTimer == null) { if (shotTimer == null) {
shotTimer = new Timer(1000); shotTimer = new Timer(1000);
shotTimer.run = shot; shotTimer.run = shot;

View File

@@ -13,11 +13,23 @@ enum TankAction {
} }
typedef ControlType = String;
typedef ControlId = {
var type:ControlType;
var index:Int;
}
class Control { class Control {
public var id:ControlId;
public var tankId(default, default):Int; public var tankId(default, default):Int;
private var handler:ControlHandler; private var handler:ControlHandler;
public function new() {} public function new(id:ControlId) {
this.id = id;
}
public function bind(handler:ControlHandler):Void { public function bind(handler:ControlHandler):Void {
this.handler = handler; this.handler = handler;

View File

@@ -1,9 +1,7 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.game.GameState.PlayerState; import ru.m.tankz.game.GameState.PlayerState;
import ru.m.tankz.bot.Bot;
import ru.m.tankz.game.Game; import ru.m.tankz.game.Game;
import ru.m.tankz.config.Config;
class ClassicGame extends Game { class ClassicGame extends Game {
@@ -17,13 +15,6 @@ class ClassicGame extends Game {
super(TYPE); super(TYPE);
} }
override public function start(state:GameState):Void {
super.start(state);
for (player in teams.get(BOT).players) {
setControl(player.id, new Bot());
}
}
public static function buildState(level:Int, humans:Int):GameState { public static function buildState(level:Int, humans:Int):GameState {
var state = new GameState(); var state = new GameState();
state.type = TYPE; state.type = TYPE;
@@ -37,13 +28,24 @@ class ClassicGame extends Game {
group: HUMAN, group: HUMAN,
type: '1' type: '1'
}, },
control:{
type: 'human',
index: i
},
life:3, life:3,
}; };
} }
for (i in 0...humans*2+2) { for (i in 0...humans*2+2) {
state.players[BOT][i] = { state.players[BOT][i] = {
index:i, index:i,
tank:null, tank:{
group: BOT,
type: '1'
},
control:{
type: 'bot',
index: i
},
life:-1, life:-1,
}; };
} }

View File

@@ -1,5 +1,7 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.bot.BotControl;
import ru.m.tankz.control.HumanControl;
import ru.m.tankz.config.ConfigBundle; import ru.m.tankz.config.ConfigBundle;
import ru.m.tankz.config.MapBundle; import ru.m.tankz.config.MapBundle;
import ru.m.tankz.game.Spawner; import ru.m.tankz.game.Spawner;
@@ -68,6 +70,15 @@ class Game implements EngineListener {
var player = new Player({team:team.id, index:playerState.index}); var player = new Player({team:team.id, index:playerState.index});
team.players.push(player); team.players.push(player);
teams.set(team.id, team); teams.set(team.id, team);
if (playerState.control != null) {
var control = switch (playerState.control.type) {
case HumanControl.TYPE: new HumanControl(playerState.control.index);
case BotControl.TYPE: new BotControl(playerState.control.index);
case _: throw 'Unsupported control type: "${playerState.control.type}"';
}
player.control = control;
player.control.bind(engine);
}
} }
spawners.set(team.id, new Spawner(team.config, spawn)); spawners.set(team.id, new Spawner(team.config, spawn));
} }

View File

@@ -4,10 +4,20 @@ import ru.m.tankz.game.Game;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
typedef ControlType = String;
typedef ControId = {
var type:ControlType;
var index:Int;
}
typedef PlayerState = { typedef PlayerState = {
var index:Int; var index:Int;
var tank:TankType; var tank:TankType;
var life:Int; var life:Int;
var control:ControId;
} }