This commit is contained in:
2015-08-12 17:54:00 +03:00
parent 3eee4db51b
commit a37712136e
5 changed files with 96 additions and 28 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -7,6 +7,8 @@ enum TankAction {
class Tank extends MobileEntity implements ITank {
private static var bulletIdCounter:Int = -1;
public var bullets:Array<IMobileEntity>;
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);

View File

@@ -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<GameChange> = new Array<GameChange>();
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<Int, ObjectState>();
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<GameChange>();
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));
}

View File

@@ -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 {