proto update
This commit is contained in:
@@ -5,12 +5,6 @@
|
|||||||
"id": "name", "@type": "haxework.gui.LabelView",
|
"id": "name", "@type": "haxework.gui.LabelView",
|
||||||
"pWidth": 100, "height": 25, "text": ""
|
"pWidth": 100, "height": 25, "text": ""
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "restart", "@type": "haxework.gui.ButtonView",
|
|
||||||
"width": 100, "height": 45,
|
|
||||||
"text": "Restart",
|
|
||||||
"@style": "button_skin"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "render", "@type": "ru.m.tankz.render.Render",
|
"id": "render", "@type": "ru.m.tankz.render.Render",
|
||||||
"contentSize": true
|
"contentSize": true
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package ru.m.tankz.core;
|
package ru.m.tankz.core;
|
||||||
|
|
||||||
import flash.geom.Point;
|
import ru.m.tankz.proto.GameActionType;
|
||||||
|
import ru.m.tankz.proto.GameActionRequest;
|
||||||
|
import ru.m.core.connect.IConnection;
|
||||||
|
import haxework.provider.Provider;
|
||||||
import ru.m.tankz.core.Tank.TankAction;
|
import ru.m.tankz.core.Tank.TankAction;
|
||||||
import flash.events.KeyboardEvent;
|
import flash.events.KeyboardEvent;
|
||||||
import flash.Lib;
|
import flash.Lib;
|
||||||
@@ -10,8 +13,8 @@ class PlayerTank extends Tank {
|
|||||||
private var keyBinding:Map<Int, TankAction>;
|
private var keyBinding:Map<Int, TankAction>;
|
||||||
private var moveQueue:Array<Int>;
|
private var moveQueue:Array<Int>;
|
||||||
|
|
||||||
public function new(position:Point, keyBinding:Map<Int, TankAction>) {
|
public function new(id:Int, x:Float, y:Float, keyBinding:Map<Int, TankAction>) {
|
||||||
super(position);
|
super(id, x, y);
|
||||||
this.keyBinding = keyBinding;
|
this.keyBinding = keyBinding;
|
||||||
moveQueue = new Array<Int>();
|
moveQueue = new Array<Int>();
|
||||||
Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
|
Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
|
||||||
@@ -25,7 +28,13 @@ class PlayerTank extends Tank {
|
|||||||
moveQueue.unshift(event.keyCode);
|
moveQueue.unshift(event.keyCode);
|
||||||
updateMove();
|
updateMove();
|
||||||
}
|
}
|
||||||
case TankAction.SHOT: shot();
|
case TankAction.SHOT:
|
||||||
|
//ToDo:
|
||||||
|
//shot();
|
||||||
|
Provider.get(IConnection).send(
|
||||||
|
new GameActionRequest()
|
||||||
|
.setType(GameActionType.SHOT)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,8 +52,16 @@ class PlayerTank extends Tank {
|
|||||||
stop();
|
stop();
|
||||||
} else {
|
} else {
|
||||||
switch (keyBinding.get(moveQueue[0])) {
|
switch (keyBinding.get(moveQueue[0])) {
|
||||||
case TankAction.MOVE(direction): move(direction);
|
case TankAction.MOVE(direction):
|
||||||
case _: {};
|
//ToDo:
|
||||||
|
//move(direction);
|
||||||
|
Provider.get(IConnection).send(
|
||||||
|
new GameActionRequest()
|
||||||
|
.setType(GameActionType.MOVE)
|
||||||
|
.setDirectionX(direction.x)
|
||||||
|
.setDirectionY(direction.y)
|
||||||
|
);
|
||||||
|
case _:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
30
src/client/haxe/ru/m/tankz/game/ClientTankz.hx
Normal file
30
src/client/haxe/ru/m/tankz/game/ClientTankz.hx
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package ru.m.tankz.game;
|
||||||
|
|
||||||
|
import ru.m.tankz.core.Direction;
|
||||||
|
import ru.m.tankz.core.Tank.TankAction;
|
||||||
|
import flash.ui.Keyboard;
|
||||||
|
import ru.m.tankz.core.PlayerTank;
|
||||||
|
import ru.m.tankz.core.ITank;
|
||||||
|
|
||||||
|
class ClientTankz extends Tankz {
|
||||||
|
|
||||||
|
public var personId(default, default):Int;
|
||||||
|
|
||||||
|
public function new() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
override private function buildTank(id:Int, x:Float, y:Float):ITank {
|
||||||
|
return if (id == personId) {
|
||||||
|
new PlayerTank(id, x, y, [
|
||||||
|
Keyboard.A => TankAction.MOVE(Direction.LEFT),
|
||||||
|
Keyboard.S => TankAction.MOVE(Direction.BOTTOM),
|
||||||
|
Keyboard.W => TankAction.MOVE(Direction.TOP),
|
||||||
|
Keyboard.D => TankAction.MOVE(Direction.RIGHT),
|
||||||
|
Keyboard.SPACE => TankAction.SHOT
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
super.buildTank(id, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,48 +1,41 @@
|
|||||||
package ru.m.tankz.view.frames;
|
package ru.m.tankz.view.frames;
|
||||||
|
|
||||||
|
import ru.m.tankz.game.ClientTankz;
|
||||||
|
import protohx.Message;
|
||||||
|
import ru.m.tankz.proto.GameUpdateResponse;
|
||||||
|
import ru.m.core.connect.IConnection;
|
||||||
import haxework.gui.ViewBuilder;
|
import haxework.gui.ViewBuilder;
|
||||||
import ru.m.tankz.config.TankzConfig;
|
import ru.m.tankz.config.TankzConfig;
|
||||||
import flash.events.Event;
|
import flash.events.Event;
|
||||||
import ru.m.tankz.game.Tankz;
|
|
||||||
import ru.m.tankz.game.ITankz;
|
|
||||||
import haxework.gui.LabelView;
|
|
||||||
import haxework.gui.ButtonView;
|
|
||||||
import haxework.provider.Provider;
|
import haxework.provider.Provider;
|
||||||
import ru.m.tankz.data.GameData;
|
import ru.m.tankz.data.GameData;
|
||||||
import haxework.gui.VGroupView;
|
import haxework.gui.VGroupView;
|
||||||
|
|
||||||
@:template("layout/frames/game.json", "layout/styles.json")
|
@:template("layout/frames/game.json", "layout/styles.json")
|
||||||
class GameFrame extends VGroupView implements ViewBuilder {
|
class GameFrame extends VGroupView implements ViewBuilder implements IPacketHandler {
|
||||||
|
|
||||||
private static inline var TAG = "GameFrame";
|
private static inline var TAG = "GameFrame";
|
||||||
|
|
||||||
public static inline var ID = "game";
|
public static inline var ID = "game";
|
||||||
|
|
||||||
private var game:ITankz;
|
private var game:ClientTankz;
|
||||||
|
|
||||||
private var config:TankzConfig;
|
|
||||||
|
|
||||||
public function init():Void {
|
public function init():Void {
|
||||||
game = new Tankz();
|
game = new ClientTankz();
|
||||||
config = {
|
|
||||||
map: {
|
|
||||||
cellWidth: 20,
|
|
||||||
cellHeight: 20,
|
|
||||||
gridWidth: 26,
|
|
||||||
gridHeight: 26
|
|
||||||
}
|
|
||||||
};
|
|
||||||
restart.onPress = this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onShow():Void {
|
public function onShow():Void {
|
||||||
var person = Provider.get(GameData).person;
|
var person = Provider.get(GameData).person;
|
||||||
|
var persons = Provider.get(GameData).game.persons;
|
||||||
name.text = person.name;
|
name.text = person.name;
|
||||||
game.init(config);
|
game.personId = person.id;
|
||||||
|
game.init(persons, DEFAULT.CONFIG);
|
||||||
content.addEventListener(Event.ENTER_FRAME, updateGame);
|
content.addEventListener(Event.ENTER_FRAME, updateGame);
|
||||||
|
Provider.get(IConnection).packetHandler.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onHide():Void {
|
public function onHide():Void {
|
||||||
|
Provider.get(IConnection).packetHandler.removeListener(this);
|
||||||
content.removeEventListener(Event.ENTER_FRAME, updateGame);
|
content.removeEventListener(Event.ENTER_FRAME, updateGame);
|
||||||
game.clear();
|
game.clear();
|
||||||
}
|
}
|
||||||
@@ -52,11 +45,9 @@ class GameFrame extends VGroupView implements ViewBuilder {
|
|||||||
render.draw(game);
|
render.draw(game);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onPress(view:ButtonView):Void {
|
public function onGameUpdateResponse(packet:GameUpdateResponse):Void {
|
||||||
switch (view.id) {
|
|
||||||
case "restart":
|
|
||||||
game.clear();
|
|
||||||
game.init(config);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onPacket(packet:Message):Void {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ class GameReadyFrame extends VGroupView implements ViewBuilder implements IPacke
|
|||||||
public static inline var ID = "game_ready";
|
public static inline var ID = "game_ready";
|
||||||
|
|
||||||
public function init() {
|
public function init() {
|
||||||
list = findViewById("list");
|
|
||||||
//list.dispatcher.addListener(this);
|
//list.dispatcher.addListener(this);
|
||||||
findViewById("start", ButtonView).onPress = this;
|
findViewById("start", ButtonView).onPress = this;
|
||||||
findViewById("exit", ButtonView).onPress = this;
|
findViewById("exit", ButtonView).onPress = this;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package ru.m.tankz;
|
package ru.m.tankz;
|
||||||
|
|
||||||
|
import ru.m.tankz.proto.GameUpdateResponse;
|
||||||
|
import ru.m.tankz.proto.GameActionRequest;
|
||||||
import ru.m.core.connect.IConnection;
|
import ru.m.core.connect.IConnection;
|
||||||
import protohx.Message;
|
import protohx.Message;
|
||||||
import ru.m.tankz.proto.LoginRequest;
|
import ru.m.tankz.proto.LoginRequest;
|
||||||
@@ -41,6 +43,10 @@ class PacketBuilder implements IPacketBuilder {
|
|||||||
0x0008 => StartGameResponse,
|
0x0008 => StartGameResponse,
|
||||||
0x0009 => ExitGameRequest,
|
0x0009 => ExitGameRequest,
|
||||||
0x000a => ExitGameResponse
|
0x000a => ExitGameResponse
|
||||||
|
],
|
||||||
|
0x03 => [
|
||||||
|
0x0001 => GameActionRequest,
|
||||||
|
0x0002 => GameUpdateResponse
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -10,3 +10,14 @@ typedef MapConfig = {
|
|||||||
typedef TankzConfig = {
|
typedef TankzConfig = {
|
||||||
var map:MapConfig;
|
var map:MapConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DEFAULT {
|
||||||
|
public static var CONFIG:TankzConfig = {
|
||||||
|
map: {
|
||||||
|
cellWidth: 20,
|
||||||
|
cellHeight: 20,
|
||||||
|
gridWidth: 26,
|
||||||
|
gridHeight: 26
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package ru.m.tankz.core;
|
package ru.m.tankz.core;
|
||||||
|
|
||||||
import flash.geom.Point;
|
|
||||||
|
|
||||||
class Entity implements IEntity {
|
class Entity implements IEntity {
|
||||||
|
|
||||||
public var x(default, default):Float;
|
public var x(default, default):Float;
|
||||||
@@ -10,8 +8,8 @@ class Entity implements IEntity {
|
|||||||
public var width(default, default):Float;
|
public var width(default, default):Float;
|
||||||
public var height(default, default):Float;
|
public var height(default, default):Float;
|
||||||
|
|
||||||
public function new(position:Point) {
|
public function new(x:Float, y:Float) {
|
||||||
x = position.x;
|
this.x = x;
|
||||||
y = position.y;
|
this.y = y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package ru.m.tankz.core;
|
package ru.m.tankz.core;
|
||||||
|
|
||||||
interface ITank extends IMobileEntity {
|
interface ITank extends IMobileEntity {
|
||||||
|
public var id(default, null):Int;
|
||||||
public var bullets:Array<IMobileEntity>;
|
public var bullets:Array<IMobileEntity>;
|
||||||
|
|
||||||
public function shot():Void;
|
public function shot():Void;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package ru.m.tankz.core;
|
package ru.m.tankz.core;
|
||||||
|
|
||||||
import flash.geom.Point;
|
|
||||||
class MobileEntity extends Entity implements IMobileEntity {
|
class MobileEntity extends Entity implements IMobileEntity {
|
||||||
|
|
||||||
public var mx(default, default):Float;
|
public var mx(default, default):Float;
|
||||||
@@ -9,8 +8,8 @@ class MobileEntity extends Entity implements IMobileEntity {
|
|||||||
public var speed(default, null):Float;
|
public var speed(default, null):Float;
|
||||||
public var direction(default, default):Direction;
|
public var direction(default, default):Direction;
|
||||||
|
|
||||||
public function new(position:Point, speed:Float, ?direction:Direction = null) {
|
public function new(x:Float, y:Float, speed:Float, direction:Direction = null) {
|
||||||
super(position);
|
super(x, y);
|
||||||
this.speed = speed;
|
this.speed = speed;
|
||||||
this.direction = direction == null ? Direction.BOTTOM : direction;
|
this.direction = direction == null ? Direction.BOTTOM : direction;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package ru.m.tankz.core;
|
package ru.m.tankz.core;
|
||||||
|
|
||||||
import flash.geom.Point;
|
|
||||||
|
|
||||||
enum TankAction {
|
enum TankAction {
|
||||||
MOVE(direction:Direction);
|
MOVE(direction:Direction);
|
||||||
SHOT;
|
SHOT;
|
||||||
@@ -9,10 +7,12 @@ enum TankAction {
|
|||||||
|
|
||||||
class Tank extends MobileEntity implements ITank {
|
class Tank extends MobileEntity implements ITank {
|
||||||
|
|
||||||
|
public var id(default, null):Int;
|
||||||
public var bullets:Array<IMobileEntity>;
|
public var bullets:Array<IMobileEntity>;
|
||||||
|
|
||||||
public function new(position:Point) {
|
public function new(id:Int, x:Float, y:Float) {
|
||||||
super(position, 4);
|
super(x, y, 4);
|
||||||
|
this.id = id;
|
||||||
bullets = new Array<IMobileEntity>();
|
bullets = new Array<IMobileEntity>();
|
||||||
width = 34;
|
width = 34;
|
||||||
height = 34;
|
height = 34;
|
||||||
@@ -20,7 +20,7 @@ class Tank extends MobileEntity implements ITank {
|
|||||||
|
|
||||||
public function shot():Void {
|
public function shot():Void {
|
||||||
if (bullets.length >= 5) return;
|
if (bullets.length >= 5) return;
|
||||||
var bullet = new MobileEntity(new Point(x + width / 2 - 5, y + height / 2 - 5), 6, direction);
|
var bullet = new MobileEntity(x + width / 2 - 5, y + height / 2 - 5, 6, direction);
|
||||||
bullet.width = 10;
|
bullet.width = 10;
|
||||||
bullet.height = 10;
|
bullet.height = 10;
|
||||||
bullet.move(direction);
|
bullet.move(direction);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package ru.m.tankz.game;
|
package ru.m.tankz.game;
|
||||||
|
|
||||||
|
import ru.m.tankz.proto.Person;
|
||||||
import ru.m.tankz.config.TankzConfig;
|
import ru.m.tankz.config.TankzConfig;
|
||||||
import ru.m.tankz.core.ITank;
|
import ru.m.tankz.core.ITank;
|
||||||
import ru.m.tankz.map.ITankzMap;
|
import ru.m.tankz.map.ITankzMap;
|
||||||
@@ -10,6 +11,6 @@ interface ITankz {
|
|||||||
public var tanks(default, null):Array<ITank>;
|
public var tanks(default, null):Array<ITank>;
|
||||||
|
|
||||||
public function clear():Void;
|
public function clear():Void;
|
||||||
public function init(config:TankzConfig):Void;
|
public function init(persons:Array<Person>, config:TankzConfig):Void;
|
||||||
public function update():Void;
|
public function update():Void;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
package ru.m.tankz.game;
|
package ru.m.tankz.game;
|
||||||
|
|
||||||
|
import ru.m.tankz.proto.Person;
|
||||||
import ru.m.tankz.core.Direction;
|
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.Rectangle;
|
||||||
import flash.ui.Keyboard;
|
|
||||||
import flash.geom.Rectangle;
|
|
||||||
import ru.m.tankz.config.TankzConfig;
|
import ru.m.tankz.config.TankzConfig;
|
||||||
import ru.m.tankz.core.Tank;
|
import ru.m.tankz.core.Tank;
|
||||||
import ru.m.tankz.core.PlayerTank;
|
|
||||||
import ru.m.tankz.map.TankzMap;
|
import ru.m.tankz.map.TankzMap;
|
||||||
import ru.m.tankz.core.ITank;
|
import ru.m.tankz.core.ITank;
|
||||||
import ru.m.tankz.map.ITankzMap;
|
import ru.m.tankz.map.ITankzMap;
|
||||||
@@ -27,25 +25,19 @@ class Tankz implements ITankz {
|
|||||||
tanks = [];
|
tanks = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function init(config:TankzConfig):Void {
|
private function buildTank(id:Int, x:Float, y:Float):ITank {
|
||||||
|
return new Tank(id, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function init(persons:Array<Person>, config:TankzConfig):Void {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
map = new TankzMap(config.map);
|
map = new TankzMap(config.map);
|
||||||
tanks = [
|
tanks = [];
|
||||||
new PlayerTank(new Point(0, 0), [
|
for (person in persons) {
|
||||||
Keyboard.A => TankAction.MOVE(Direction.LEFT),
|
var x = 0;
|
||||||
Keyboard.S => TankAction.MOVE(Direction.BOTTOM),
|
var y = 100 * persons.indexOf(person);
|
||||||
Keyboard.W => TankAction.MOVE(Direction.TOP),
|
tanks.push(buildTank(person.id, x, y));
|
||||||
Keyboard.D => TankAction.MOVE(Direction.RIGHT),
|
}
|
||||||
Keyboard.SPACE => TankAction.SHOT
|
|
||||||
]),
|
|
||||||
new PlayerTank(new Point(100, 0), [
|
|
||||||
Keyboard.LEFT => TankAction.MOVE(Direction.LEFT),
|
|
||||||
Keyboard.DOWN => TankAction.MOVE(Direction.BOTTOM),
|
|
||||||
Keyboard.UP => TankAction.MOVE(Direction.TOP),
|
|
||||||
Keyboard.RIGHT => TankAction.MOVE(Direction.RIGHT),
|
|
||||||
Keyboard.SHIFT => TankAction.SHOT
|
|
||||||
])
|
|
||||||
];
|
|
||||||
x_limit = map.gridWidth * map.cellWidth;
|
x_limit = map.gridWidth * map.cellWidth;
|
||||||
y_limit = map.gridHeight * map.cellHeight;
|
y_limit = map.gridHeight * map.cellHeight;
|
||||||
}
|
}
|
||||||
@@ -61,7 +53,7 @@ class Tankz implements ITankz {
|
|||||||
tank.x += tank.mx;
|
tank.x += tank.mx;
|
||||||
tank.y += tank.my;
|
tank.y += tank.my;
|
||||||
|
|
||||||
var tankR = new Rectangle(tank.x, tank.y, tank.width, tank.height);
|
/*var tankR = new Rectangle(tank.x, tank.y, tank.width, tank.height);
|
||||||
|
|
||||||
for (t in tanks) if (t != tank) {
|
for (t in tanks) if (t != tank) {
|
||||||
var r = new Rectangle(t.x, t.y, t.width, t.height);
|
var r = new Rectangle(t.x, t.y, t.width, t.height);
|
||||||
@@ -77,7 +69,7 @@ class Tankz implements ITankz {
|
|||||||
if (tank.y < t.y + t.height) tank.y = t.y + t.height;
|
if (tank.y < t.y + t.height) tank.y = t.y + t.height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (tank.x < 0) tank.x = 0;
|
if (tank.x < 0) tank.x = 0;
|
||||||
if (tank.x + tank.width > x_limit) tank.x = x_limit - tank.width;
|
if (tank.x + tank.width > x_limit) tank.x = x_limit - tank.width;
|
||||||
@@ -93,7 +85,7 @@ class Tankz implements ITankz {
|
|||||||
bullet.x += bullet.mx;
|
bullet.x += bullet.mx;
|
||||||
bullet.y += bullet.my;
|
bullet.y += bullet.my;
|
||||||
|
|
||||||
var bulletR = new Rectangle(bullet.x, bullet.y, bullet.width, bullet.height);
|
/*var bulletR = new Rectangle(bullet.x, bullet.y, bullet.width, bullet.height);
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
while (i < tanks.length) {
|
while (i < tanks.length) {
|
||||||
@@ -106,7 +98,7 @@ class Tankz implements ITankz {
|
|||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (bullet.x < 0 || bullet.x + bullet.width > x_limit || bullet.y < 0 || bullet.y + bullet.height > y_limit) {
|
if (bullet.x < 0 || bullet.x + bullet.width > x_limit || bullet.y < 0 || bullet.y + bullet.height > y_limit) {
|
||||||
tank.destroyBullet(bullet);
|
tank.destroyBullet(bullet);
|
||||||
|
|||||||
@@ -85,4 +85,41 @@ message ExitGameRequest {
|
|||||||
|
|
||||||
message ExitGameResponse {
|
message ExitGameResponse {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Game
|
||||||
|
*/
|
||||||
|
enum GameActionType {
|
||||||
|
MOVE = 1;
|
||||||
|
SHOT = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GameActionRequest {
|
||||||
|
required GameActionType type = 1;
|
||||||
|
optional int32 directionX = 2;
|
||||||
|
optional int32 directionY = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum GameObjectType {
|
||||||
|
TANK = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum GameChangeType {
|
||||||
|
MOVED = 1;
|
||||||
|
DESTROED = 2;
|
||||||
|
MODIFIED = 3;
|
||||||
|
APPEND = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GameChange {
|
||||||
|
required GameChangeType type = 1;
|
||||||
|
required GameObjectType objectType = 2;
|
||||||
|
required int32 objectId = 3;
|
||||||
|
optional int32 newX = 4;
|
||||||
|
optional int32 newY = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GameUpdateResponse {
|
||||||
|
repeated GameChange changes = 1;
|
||||||
}
|
}
|
||||||
@@ -4,19 +4,12 @@ import ru.m.tankz.db.Orm;
|
|||||||
import ru.m.tankz.proto.Person;
|
import ru.m.tankz.proto.Person;
|
||||||
import ru.m.tankz.proto.Account;
|
import ru.m.tankz.proto.Account;
|
||||||
|
|
||||||
typedef DbPerson = {
|
class DbProvider {
|
||||||
@:optional var a_id:Int;
|
|
||||||
var p_id:Int;
|
|
||||||
var p_name:String;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Db {
|
|
||||||
|
|
||||||
private var db:orm.Db;
|
|
||||||
private var orm:Orm;
|
private var orm:Orm;
|
||||||
|
|
||||||
public function new() {
|
public function new() {
|
||||||
db = new orm.Db("mysql://shmyga:xkbp8jh9z2@localhost:3306/armageddon");
|
var db = new orm.Db("mysql://shmyga:xkbp8jh9z2@localhost:3306/armageddon");
|
||||||
orm = new Orm(db);
|
orm = new Orm(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
package ru.m.tankz.server.session;
|
package ru.m.tankz.server.session;
|
||||||
|
|
||||||
|
import ru.m.tankz.game.Tankz;
|
||||||
|
import ru.m.tankz.game.ITankz;
|
||||||
|
import ru.m.tankz.proto.GameActionType;
|
||||||
|
import ru.m.tankz.proto.GameActionRequest;
|
||||||
import ru.m.tankz.proto.ExitGameResponse;
|
import ru.m.tankz.proto.ExitGameResponse;
|
||||||
import ru.m.tankz.proto.ExitGameRequest;
|
import ru.m.tankz.proto.ExitGameRequest;
|
||||||
import ru.m.tankz.proto.StartGameRequest;
|
import ru.m.tankz.proto.StartGameRequest;
|
||||||
@@ -18,7 +22,7 @@ import ru.m.tankz.proto.PersonSelectRequest;
|
|||||||
import ru.m.tankz.proto.Account;
|
import ru.m.tankz.proto.Account;
|
||||||
import ru.m.core.connect.neko.NekoConnection;
|
import ru.m.core.connect.neko.NekoConnection;
|
||||||
import ru.m.tankz.proto.ErrorResponse;
|
import ru.m.tankz.proto.ErrorResponse;
|
||||||
import ru.m.tankz.server.db.Db;
|
import ru.m.tankz.server.db.DbProvider;
|
||||||
import ru.m.tankz.proto.LoginResponse;
|
import ru.m.tankz.proto.LoginResponse;
|
||||||
import ru.m.tankz.proto.LoginRequest;
|
import ru.m.tankz.proto.LoginRequest;
|
||||||
import ru.m.tankz.proto.GamesRequest;
|
import ru.m.tankz.proto.GamesRequest;
|
||||||
@@ -35,10 +39,13 @@ class GameCenter {
|
|||||||
private var created:Map<Int, Int>;
|
private var created:Map<Int, Int>;
|
||||||
private var persons:Map<Int, Int>;
|
private var persons:Map<Int, Int>;
|
||||||
|
|
||||||
|
private var running:Map<Int, ITankz>;
|
||||||
|
|
||||||
public function new() {
|
public function new() {
|
||||||
games = new Map<Int, Game>();
|
games = new Map<Int, Game>();
|
||||||
created = new Map<Int, Int>();
|
created = new Map<Int, Int>();
|
||||||
persons = new Map<Int, Int>();
|
persons = new Map<Int, Int>();
|
||||||
|
running = new Map<Int, ITankz>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getReadyGames():Array<Game> {
|
public function getReadyGames():Array<Game> {
|
||||||
@@ -68,7 +75,7 @@ class GameCenter {
|
|||||||
return game;
|
return game;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function exit(personId):Void {
|
public function exit(personId:Int):Void {
|
||||||
if (persons.exists(personId)) {
|
if (persons.exists(personId)) {
|
||||||
var game:Game = games.get(persons.get(personId));
|
var game:Game = games.get(persons.get(personId));
|
||||||
for (person in game.persons) if (person.id == personId) {
|
for (person in game.persons) if (person.id == personId) {
|
||||||
@@ -81,12 +88,33 @@ class GameCenter {
|
|||||||
persons.remove(personId);
|
persons.remove(personId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function start(gameId:Int):Void {
|
||||||
|
if (games.exists(gameId)) {
|
||||||
|
games.get(gameId).setState(GameState.STARTED);
|
||||||
|
var tankz = new Tankz();
|
||||||
|
running.set(gameId, tankz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function broadcast(gameId:Int, packet:Message):Void {
|
||||||
|
var game = games.get(gameId);
|
||||||
|
if (game != null) {
|
||||||
|
for (person in game.persons) {
|
||||||
|
var session = Session.sessions.get(person.id);
|
||||||
|
if (session != null) {
|
||||||
|
session.send(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Session implements IConnectionHandler implements IPacketHandler {
|
class Session implements IConnectionHandler implements IPacketHandler {
|
||||||
|
|
||||||
private static var games:GameCenter = new GameCenter();
|
private static var games:GameCenter = new GameCenter();
|
||||||
|
public static var sessions:Map<Int, Session> = new Map<Int, Session>();
|
||||||
|
|
||||||
public var account(default, null):Account;
|
public var account(default, null):Account;
|
||||||
public var person(default, null):Person;
|
public var person(default, null):Person;
|
||||||
@@ -99,6 +127,10 @@ class Session implements IConnectionHandler implements IPacketHandler {
|
|||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function send(packet:Message):Void {
|
||||||
|
connection.send(packet);
|
||||||
|
}
|
||||||
|
|
||||||
public function pushData(bytes:Bytes):Void {
|
public function pushData(bytes:Bytes):Void {
|
||||||
if (connection != null) {
|
if (connection != null) {
|
||||||
connection.pushData(bytes);
|
connection.pushData(bytes);
|
||||||
@@ -140,7 +172,7 @@ class Session implements IConnectionHandler implements IPacketHandler {
|
|||||||
* Packets handlers
|
* Packets handlers
|
||||||
**/
|
**/
|
||||||
public function onLoginRequest(packet:LoginRequest):Void {
|
public function onLoginRequest(packet:LoginRequest):Void {
|
||||||
var db = new Db();
|
var db = new DbProvider();
|
||||||
account = db.getAccount(packet.login, packet.password);
|
account = db.getAccount(packet.login, packet.password);
|
||||||
if (account != null) {
|
if (account != null) {
|
||||||
connection.send(new LoginResponse().setAccount(account));
|
connection.send(new LoginResponse().setAccount(account));
|
||||||
@@ -150,10 +182,11 @@ class Session implements IConnectionHandler implements IPacketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function onPersonSelectRequest(packet:PersonSelectRequest):Void {
|
public function onPersonSelectRequest(packet:PersonSelectRequest):Void {
|
||||||
var db = new Db();
|
var db = new DbProvider();
|
||||||
var person = db.getPerson(packet.personId);
|
var person = db.getPerson(packet.personId);
|
||||||
if (person != null) {
|
if (person != null) {
|
||||||
this.person = person;
|
this.person = person;
|
||||||
|
sessions.set(person.id, this);
|
||||||
connection.send(new PersonSelectResponse().setPerson(person));
|
connection.send(new PersonSelectResponse().setPerson(person));
|
||||||
} else {
|
} else {
|
||||||
connection.send(new ErrorResponse().setCode(404).setMessage("Person not found"));
|
connection.send(new ErrorResponse().setCode(404).setMessage("Person not found"));
|
||||||
@@ -177,7 +210,7 @@ class Session implements IConnectionHandler implements IPacketHandler {
|
|||||||
public function onStartGameRequest(packet:StartGameRequest):Void {
|
public function onStartGameRequest(packet:StartGameRequest):Void {
|
||||||
var game:Game = games.getCreatedGame(person.id);
|
var game:Game = games.getCreatedGame(person.id);
|
||||||
game.setState(GameState.STARTED);
|
game.setState(GameState.STARTED);
|
||||||
connection.send(new StartGameResponse().setGame(game));
|
games.broadcast(game.id, new StartGameResponse().setGame(game));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onExitGameRequest(packet:ExitGameRequest):Void {
|
public function onExitGameRequest(packet:ExitGameRequest):Void {
|
||||||
@@ -185,6 +218,15 @@ class Session implements IConnectionHandler implements IPacketHandler {
|
|||||||
connection.send(new ExitGameResponse());
|
connection.send(new ExitGameResponse());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onGameActionRequest(packet:GameActionRequest):Void {
|
||||||
|
switch (packet.type) {
|
||||||
|
case GameActionType.SHOT:
|
||||||
|
|
||||||
|
case GameActionType.MOVE:
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function onPacket(packet:Message):Void {
|
public function onPacket(packet:Message):Void {
|
||||||
trace("Unknown packet: " + Type.getClassName(Type.getClass(packet)).split(".").pop());
|
trace("Unknown packet: " + Type.getClassName(Type.getClass(packet)).split(".").pop());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user