diff --git a/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx index 2a813a5..4bf3013 100755 --- a/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx @@ -73,13 +73,29 @@ class GameFrame extends VGroupView implements ViewBuilder implements IPacketHand break; } } + case GameObjectType.BULLET: + for (tank in engine.tanks) { + if (tank.id == change.parentObjectId) { + for (bullet in tank.bullets) { + if (bullet.id == change.objectId) { + bullet.x = change.x; + bullet.y = change.y; + break; + } + } + break; + } + } } case GameChangeType.APPEND: switch (change.objectType) { case GameObjectType.BULLET: for (tank in engine.tanks) { if (tank.id == change.parentObjectId) { - tank.bullets.push(new MobileEntity(0, change.x, change.y, 0, new Direction(change.directionX, change.directionY))); + var bullet = new MobileEntity(change.objectId, change.x, change.y, 0, new Direction(change.directionX, change.directionY)); + bullet.width = 10; + bullet.height = 10; + tank.bullets.push(bullet); break; } } diff --git a/src/client/haxe/ru/m/tankz/view/frames/GameReadyFrame.hx b/src/client/haxe/ru/m/tankz/view/frames/GameReadyFrame.hx index fb83338..6c46db4 100755 --- a/src/client/haxe/ru/m/tankz/view/frames/GameReadyFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/frames/GameReadyFrame.hx @@ -1,5 +1,7 @@ package ru.m.tankz.view.frames; +import ru.m.tankz.proto.LeaveGameResponse; +import ru.m.tankz.proto.JoinGameResponse; import haxework.gui.ViewBuilder; import ru.m.tankz.proto.ExitGameResponse; import haxework.gui.frame.IFrameSwitcher; @@ -43,7 +45,18 @@ class GameReadyFrame extends VGroupView implements ViewBuilder implements IPacke Provider.get(IFrameSwitcher).change(GameFrame.ID); } + public function onJoinGameResponse(packet:JoinGameResponse):Void { + Provider.get(GameData).game = packet.game; + list.data = Provider.get(GameData).game.persons; + } + + public function onLeaveGameResponse(packet:LeaveGameResponse):Void { + Provider.get(GameData).game = packet.game; + list.data = Provider.get(GameData).game.persons; + } + public function onExitGameResponse(packet:ExitGameResponse):Void { + Provider.get(GameData).game = null; Provider.get(IFrameSwitcher).change(GameListFrame.ID); } diff --git a/src/common/haxe/ru/m/tankz/core/Tank.hx b/src/common/haxe/ru/m/tankz/core/Tank.hx index 14d8e9b..f3d7a71 100755 --- a/src/common/haxe/ru/m/tankz/core/Tank.hx +++ b/src/common/haxe/ru/m/tankz/core/Tank.hx @@ -7,6 +7,8 @@ enum TankAction { class Tank extends MobileEntity implements ITank { + private static var bulletIdCounter:Int = -1; + public var bullets:Array; public function new(id:Int, x:Float, y:Float) { @@ -19,7 +21,7 @@ class Tank extends MobileEntity implements ITank { public function shot():Void { if (bullets.length >= 5) return; - var bullet = new MobileEntity(0, x + width / 2 - 5, y + height / 2 - 5, 6, direction); + var bullet = new MobileEntity(bulletIdCounter--, x + width / 2 - 5, y + height / 2 - 5, 6, direction); bullet.width = 10; bullet.height = 10; bullet.move(direction); diff --git a/src/server/haxe/ru/m/tankz/server/game/GameManager.hx b/src/server/haxe/ru/m/tankz/server/game/GameManager.hx index c4d6d1b..332f7f1 100644 --- a/src/server/haxe/ru/m/tankz/server/game/GameManager.hx +++ b/src/server/haxe/ru/m/tankz/server/game/GameManager.hx @@ -1,5 +1,7 @@ package ru.m.tankz.server.game; +import ru.m.tankz.proto.GameActionType; +import ru.m.tankz.proto.GameActionRequest; import ru.m.tankz.proto.ExitGameResponse; import ru.m.tankz.proto.GameObjectType; import ru.m.tankz.proto.GameChangeType; @@ -56,7 +58,6 @@ class NekoTimer { typedef ObjectState = { var x:Float; var y:Float; - var d:Direction; } /** @@ -75,6 +76,8 @@ class GameManager { private var timer:NekoTimer; + private var changes:Array = new Array(); + public function new(person:Person) { game = new Game() .setId(idCounter++) @@ -102,7 +105,7 @@ class GameManager { public function leave(person:Person) { game.setPersons(game.persons.filter(function(p) return p.id != person.id)); byPersonId.remove(person.id); - if (game.persons.length == 0 || person.id == game.creator.id) { + if (game.persons.length == 0/* || person.id == game.creator.id*/) { stop(); } else { broadcast(new LeaveGameResponse().setGame(game)); @@ -129,29 +132,58 @@ class GameManager { broadcast(new ExitGameResponse()); } + public function action(person:Person, action:GameActionRequest) { + for (tank in engine.tanks) { + if (tank.id == person.id) { + switch (action.type) { + case GameActionType.SHOT: + tank.shot(); + var bullet = tank.bullets.slice(0).pop(); + changes.push(new GameChange() + .setType(GameChangeType.APPEND) + .setObjectType(GameObjectType.BULLET) + .setParentObjectId(tank.id) + .setObjectId(bullet.id) + .setX(bullet.x) + .setY(bullet.y) + .setDirectionX(bullet.direction.x) + .setDirectionY(bullet.direction.y) + ); + case GameActionType.MOVE: + tank.move(new Direction(action.directionX, action.directionY)); + changes.push(new GameChange() + .setType(GameChangeType.DIRECTION) + .setObjectType(GameObjectType.TANK) + .setObjectId(tank.id) + .setDirectionX(tank.direction.x) + .setDirectionY(tank.direction.y) + ); + case GameActionType.STOP: + tank.stop(); + } + } + } + } + private function update() { var states = new Map(); for (tank in engine.tanks) { states.set(tank.id, { x: tank.x, - y: tank.y, - d: tank.direction + y: tank.y }); + for (bullet in tank.bullets) { + states.set(bullet.id, { + x: bullet.x, + y: bullet.y + }); + } } engine.update(); var changes = new Array(); for (tank in engine.tanks) { if (states.exists(tank.id)) { var state = states.get(tank.id); - if (state.d != tank.direction) { - changes.push(new GameChange() - .setType(GameChangeType.DIRECTION) - .setObjectType(GameObjectType.TANK) - .setObjectId(tank.id) - .setDirectionX(tank.direction.x) - .setDirectionY(tank.direction.y) - ); - } if (state.x != tank.x || state.y != tank.y) { changes.push(new GameChange() .setType(GameChangeType.MOVED) @@ -161,8 +193,25 @@ class GameManager { .setY(tank.y) ); } + for (bullet in tank.bullets) { + if (states.exists(bullet.id)) { + var state = states.get(bullet.id); + if (state.x != bullet.x || state.y != bullet.y) { + changes.push(new GameChange() + .setType(GameChangeType.MOVED) + .setObjectType(GameObjectType.BULLET) + .setParentObjectId(tank.id) + .setObjectId(bullet.id) + .setX(bullet.x) + .setY(bullet.y) + ); + } + } + } } } + changes = this.changes.concat(changes); + this.changes = []; if (changes.length > 0) { broadcast(new GameUpdateResponse().setChanges(changes)); } diff --git a/src/server/haxe/ru/m/tankz/server/session/Session.hx b/src/server/haxe/ru/m/tankz/server/session/Session.hx index fe46117..5d14e07 100755 --- a/src/server/haxe/ru/m/tankz/server/session/Session.hx +++ b/src/server/haxe/ru/m/tankz/server/session/Session.hx @@ -144,19 +144,7 @@ class Session implements IConnectionHandler implements IPacketHandler { } public function onGameActionRequest(packet:GameActionRequest):Void { - var game:IEngine = GameManager.byPersonId.get(person.id).engine; - for (tank in game.tanks) { - if (tank.id == person.id) { - switch (packet.type) { - case GameActionType.SHOT: - tank.shot(); - case GameActionType.MOVE: - tank.move(new Direction(packet.directionX, packet.directionY)); - case GameActionType.STOP: - tank.stop(); - } - } - } + GameManager.byPersonId.get(person.id).action(person, packet); } public function onPacket(packet:Message):Void {