From efe826110c1f21af374c13a55b490d0d53191210 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 16 May 2019 21:25:53 +0300 Subject: [PATCH] [render] spawn eagle from GameEvent --- src/client/haxe/ru/m/tankz/render/Render.hx | 10 +- .../ru/m/tankz/render/item/EagleRenderItem.hx | 6 +- src/common/haxe/ru/m/geom/Rectangle.hx | 94 ++++++++++++++----- src/common/haxe/ru/m/tankz/core/Eagle.hx | 4 +- .../haxe/ru/m/tankz/game/EntityBuilder.hx | 6 +- src/common/haxe/ru/m/tankz/game/Game.hx | 5 +- src/common/haxe/ru/m/tankz/game/GameEvent.hx | 3 +- src/common/haxe/ru/m/tankz/game/GameRunner.hx | 6 +- 8 files changed, 95 insertions(+), 39 deletions(-) diff --git a/src/client/haxe/ru/m/tankz/render/Render.hx b/src/client/haxe/ru/m/tankz/render/Render.hx index c1b885e..8344387 100755 --- a/src/client/haxe/ru/m/tankz/render/Render.hx +++ b/src/client/haxe/ru/m/tankz/render/Render.hx @@ -1,5 +1,6 @@ package ru.m.tankz.render; +import ru.m.geom.Rectangle; import flash.display.DisplayObjectContainer; import flash.display.Graphics; import flash.display.Sprite; @@ -102,11 +103,11 @@ class Render extends SpriteView implements IRender implements GameListener { public function onSpawn(entity:EntityType):Void { switch entity { - case EAGLE(eagle): + /*case EAGLE(eagle): var item = new EagleRenderItem(eagle); items.set(eagle.id, item); entryLayer.addChild(item.view); - item.update(); + item.update();*/ case TANK(tank): var item = new TankRenderItem(tank); items.set(tank.id, item); @@ -142,6 +143,11 @@ class Render extends SpriteView implements IRender implements GameListener { content.addEventListener(Event.ENTER_FRAME, onEnterFrame); case COMPLETE(_, _): content.removeEventListener(Event.ENTER_FRAME, onEnterFrame); + case SPAWN(EAGLE(id, rect, teamId)): + var item = new EagleRenderItem(rect); + items.set(id, item); + entryLayer.addChild(item.view); + item.update(); case MOVE(BULLET(id, position)): if (items.exists(id)) { var item = items[id]; diff --git a/src/client/haxe/ru/m/tankz/render/item/EagleRenderItem.hx b/src/client/haxe/ru/m/tankz/render/item/EagleRenderItem.hx index 0f0e69b..a2c2e7b 100644 --- a/src/client/haxe/ru/m/tankz/render/item/EagleRenderItem.hx +++ b/src/client/haxe/ru/m/tankz/render/item/EagleRenderItem.hx @@ -1,12 +1,12 @@ package ru.m.tankz.render.item; -import ru.m.tankz.core.Eagle; +import ru.m.geom.Rectangle; class EagleRenderItem extends BitmapRenderItem { public var death(default, set):Bool = true; - public function new(eagle:Eagle) { - super(eagle.rect); + public function new(rect:Rectangle) { + super(rect); death = false; } diff --git a/src/common/haxe/ru/m/geom/Rectangle.hx b/src/common/haxe/ru/m/geom/Rectangle.hx index f5c0456..468a7e6 100644 --- a/src/common/haxe/ru/m/geom/Rectangle.hx +++ b/src/common/haxe/ru/m/geom/Rectangle.hx @@ -1,24 +1,58 @@ package ru.m.geom; -class Rectangle { - public var x(default, default):Float; - public var y(default, default):Float; - public var width(default, default):Float; - public var height(default, default):Float; +abstract Rectangle(Array) { + public var x(get, set):Float; + public var y(get, set):Float; + public var width(get, set):Float; + public var height(get, set):Float; public var center(get, set):Point; - public var direction(default, set):Direction; - public var left(get, null):Float; - public var right(get, null):Float; - public var top(get, null):Float; - public var bottom(get, null):Float; - public var position(get, null):Position; + public var direction(get, set):Direction; + public var left(get, never):Float; + public var right(get, never):Float; + public var top(get, never):Float; + public var bottom(get, never):Float; + public var position(get, set):Position; - public function new(x:Float, y:Float, width:Float, height:Float) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.direction = Direction.RIGHT; + public function new(x:Float = 0, y:Float = 0, width:Float = 0, height:Float = 0, direction:Direction = null) { + if (direction == null) { + direction = Direction.RIGHT; + } + this = [ + x, y, width, height, + direction.x, direction.y, + ]; + } + + private inline function get_x():Float { + return this[0]; + } + + private inline function set_x(value:Float):Float { + return this[0] = value; + } + + private inline function get_y():Float { + return this[1]; + } + + private inline function set_y(value:Float):Float { + return this[1] = value; + } + + private inline function get_width():Float { + return this[2]; + } + + private inline function set_width(value:Float):Float { + return this[2] = value; + } + + private inline function get_height():Float { + return this[3]; + } + + private inline function set_height(value:Float):Float { + return this[3] = value; } private function get_center():Point { @@ -26,8 +60,8 @@ class Rectangle { } private function set_center(value:Point):Point { - this.x = value.x - width / 2; - this.y = value.y - height / 2; + x = value.x - width / 2; + y = value.y - height / 2; return value; } @@ -49,6 +83,10 @@ class Rectangle { } } + private function get_direction():Direction { + return [Std.int(this[4]), Std.int(this[5])]; + } + public function set_direction(value:Direction):Direction { if (direction != value) { if (direction != null && direction.x * value.x == 0 && direction.y * value.y == 0) { @@ -57,7 +95,8 @@ class Rectangle { width = h; height = w; } - direction = value; + this[4] = value.x; + this[5] = value.y; } return direction; } @@ -96,23 +135,30 @@ class Rectangle { return 'Rectangle{x=$x,y=$y,width=$width,height=$height}'; } - function get_left():Float { + private function get_left():Float { return x; } - function get_right():Float { + private function get_right():Float { return x + width; } - function get_top():Float { + private function get_top():Float { return y; } - function get_bottom():Float { + private function get_bottom():Float { return y + height; } private function get_position():Position { return {x:x, y:y, direction:direction}; } + + private function set_position(position:Position):Position { + x = position.x; + y = position.y; + direction = position.direction; + return position; + } } diff --git a/src/common/haxe/ru/m/tankz/core/Eagle.hx b/src/common/haxe/ru/m/tankz/core/Eagle.hx index 234b2d1..6c5553f 100644 --- a/src/common/haxe/ru/m/tankz/core/Eagle.hx +++ b/src/common/haxe/ru/m/tankz/core/Eagle.hx @@ -15,8 +15,8 @@ class Eagle extends Entity { public var score(get, null):Int; - public function new(id:Int, team:TeamId, config:EagleConfig) { - super(id, new Rectangle(0, 0, 44, 44)); // ToDo: hardcode size + public function new(id:Int, rect:Rectangle, team:TeamId, config:EagleConfig) { + super(id, rect); this.team = team; this.config = config; this.death = false; diff --git a/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx b/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx index a6af52c..2cacfa7 100644 --- a/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx +++ b/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx @@ -1,5 +1,6 @@ package ru.m.tankz.game; +import ru.m.geom.Rectangle; import ru.m.tankz.config.Config; import ru.m.tankz.core.Bonus; import ru.m.tankz.core.Bullet; @@ -15,10 +16,9 @@ class EntityBuilder { this.config = config; } - public function buildEagle(id:Int, teamId:TeamId):Eagle { + public function buildEagle(id:Int, rect:Rectangle, teamId:TeamId):Eagle { var eageleConfig = config.getTeam(teamId).eagle; - var eaglePoint = config.getPoint(teamId, "eagle"); - var eagle = new Eagle(id, teamId, eageleConfig); + var eagle = new Eagle(id, rect, teamId, eageleConfig); eagle.color = config.getColor(new PlayerId(teamId, -1)); return eagle; } diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index 29d4fd3..3bf7dc3 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -74,9 +74,8 @@ import ru.m.tankz.Type; case GameEvent.COMPLETE(state, winnerId): this.state = state; this.winner = winnerId; - case GameEvent.SPAWN(EAGLE(id, position, teamId)): - var eagle = builder.buildEagle(id, teamId); - applyPosition(eagle, position); + case GameEvent.SPAWN(EAGLE(id, rect, teamId)): + var eagle = builder.buildEagle(id, rect, teamId); var team = getTeam(teamId); team.eagleId = eagle.id; engine.spawn(eagle); diff --git a/src/common/haxe/ru/m/tankz/game/GameEvent.hx b/src/common/haxe/ru/m/tankz/game/GameEvent.hx index 7e415fe..d3ad9bb 100644 --- a/src/common/haxe/ru/m/tankz/game/GameEvent.hx +++ b/src/common/haxe/ru/m/tankz/game/GameEvent.hx @@ -1,11 +1,12 @@ package ru.m.tankz.game; import ru.m.geom.Position; +import ru.m.geom.Rectangle; import ru.m.tankz.control.Control; import ru.m.tankz.Type; enum SpawnEvent { - EAGLE(id:Int, position:Position, teamId:TeamId); + EAGLE(id:Int, rect:Rectangle, teamId:TeamId); TANK(id:Int, position:Position, playerId:PlayerId, type:TankType); BULLET(id:Int, position:Position, playerId:PlayerId); BONUS(id:Int, position:Position, type:BonusType); diff --git a/src/common/haxe/ru/m/tankz/game/GameRunner.hx b/src/common/haxe/ru/m/tankz/game/GameRunner.hx index 4ffa69f..10e7cdc 100644 --- a/src/common/haxe/ru/m/tankz/game/GameRunner.hx +++ b/src/common/haxe/ru/m/tankz/game/GameRunner.hx @@ -1,5 +1,6 @@ package ru.m.tankz.game; +import ru.m.geom.Rectangle; import ru.m.geom.Direction; import haxe.ds.Option; import haxe.Timer; @@ -78,7 +79,10 @@ class GameRunner implements EngineListener implements GameListener { } if (team.config.eagle != null) { var point = game.config.getPoint(team.id, "eagle"); - gameEventSignal.emit(GameEvent.SPAWN(EAGLE(++entityId, pointToPosition(point), team.id))); + var position = pointToPosition(point); + var rect = new Rectangle(0, 0, 44, 44); + rect.center = new Point(position.x, position.y); + gameEventSignal.emit(GameEvent.SPAWN(EAGLE(++entityId, rect, team.id))); } } gameEventSignal.emit(GameEvent.START(state));