[common] update Game with GameEvent

This commit is contained in:
2019-04-26 17:28:36 +03:00
parent e9de677ceb
commit 363a48bb1b
13 changed files with 230 additions and 219 deletions

View File

@@ -10,12 +10,12 @@ import promhx.Promise;
import ru.m.animate.Animate;
import ru.m.animate.OnceAnimate;
import ru.m.geom.Point;
import ru.m.tankz.core.EntityType;
import ru.m.tankz.engine.Engine;
import ru.m.tankz.game.Game.GameListener;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.render.RenderItem;
import ru.m.tankz.Type;
class Render extends SpriteView implements EngineListener {
class Render extends SpriteView implements GameListener {
private var backgroundLayer:Sprite;
private var groundLayer:Sprite;
@@ -99,69 +99,58 @@ class Render extends SpriteView implements EngineListener {
clearLayer(upperLayer);
}
public function onSpawn(entity:EntityType):Void {
switch entity {
case TANK(tank):
public function onGameEvent(event:GameEvent):Void {
switch event {
case SPAWN(TANK(tank)):
var item = new TankItem(tank);
items.set(tank.key, item);
entryLayer.addChild(item.view);
item.update();
playAnimate(tank.rect.center, AnimateBundle.tankSpawn());
case BULLET(bullet):
case SPAWN(BULLET(bullet)):
var item = new BulletItem(bullet);
items.set(bullet.key, item);
entryLayer.addChild(item.view);
item.update();
case EAGLE(eagle):
case SPAWN(EAGLE(eagle)):
var item = new EagleItem(eagle);
items.set(eagle.key, item);
entryLayer.addChild(item.view);
item.update();
case BONUS(bonus):
case SPAWN(BONUS(bonus)):
var item = new BonusItem(bonus);
items.set(bonus.key, item);
upperLayer.addChild(item.view);
item.update();
case _:
}
}
public function onCollision(entity:EntityType, with:EntityType):Void {
switch [entity, with] {
case [BULLET(_), EAGLE(eagle)]:
if (eagle.death) {
playAnimate(eagle.rect.center, AnimateBundle.tankBoom());
}
case _:
}
}
public function onDestroy(entity:EntityType):Void {
switch entity {
case TANK(tank):
case DESTROY(TANK(tank, who, wherewith, score)):
if (items.exists(tank.key)) {
entryLayer.removeChild(items.get(tank.key).view);
items.remove(tank.key);
playAnimate(tank.rect.center, AnimateBundle.tankBoom());
if (tank.config.score > 0) {
showScore(tank.rect.center, tank.config.score);
if (score != 0) {
showScore(tank.rect.center, score);
}
}
case BULLET(bullet):
case DESTROY(BULLET(bullet)):
if (items.exists(bullet.key)) {
entryLayer.removeChild(items.get(bullet.key).view);
items.remove(bullet.key);
var point = bullet.rect.center.add(new Point(bullet.rect.width * bullet.rect.direction.x, bullet.rect.height * bullet.rect.direction.y));
playAnimate(point, AnimateBundle.bulletBoom());
}
case BONUS(bonus):
case DESTROY(BONUS(bonus, who, score)):
if (items.exists(bonus.key)) {
upperLayer.removeChild(items.get(bonus.key).view);
items.remove(bonus.key);
if (bonus.config.score > 0) {
showScore(bonus.rect.center, bonus.config.score);
if (score != 0) {
showScore(bonus.rect.center, score);
}
}
case DESTROY(EAGLE(eagle, who, wherewith, score)):
playAnimate(eagle.rect.center, AnimateBundle.tankBoom());
if (score != 0) {
showScore(eagle.rect.center, score);
}
case _:
}
}
@@ -176,7 +165,6 @@ class Render extends SpriteView implements EngineListener {
upperLayer.removeChild(animate);
}
animate.dispose();
return null;
});
}

View File

@@ -5,10 +5,8 @@ import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import openfl.utils.Assets;
import ru.m.tankz.control.HumanControl;
import ru.m.tankz.game.Game;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
class SoundManager implements GameListener {
private static var TAG(default, never):String = 'SoundManager';
@@ -76,44 +74,33 @@ class SoundManager implements GameListener {
channels.remove(event.currentTarget);
}
public function onGameStart(state:GameState):Void {
play('start');
}
public function onGameChange(state:GameState):Void {
}
public function onGameComplete(state:GameState):Void {
}
public function onGameEvent(event:GameEvent):Void {
// ToDo:
/*switch event {
case SPAWN_BULLET(player):
// ToDo:
if (Std.is(player.control, HumanControl)) {
switch event {
case START(state):
play('start');
case SPAWN(BULLET(bullet)):
if (false /* ToDo: human tank */) {
play('shot');
}
case HIT_TANK(player, target):
case SPAWN(BONUS(bonus)):
play('bonus_add');
case HIT(TANK(tank, who, wherewith)):
play('bullet_hit');
case DESTROY_TANK(player, target):
// ToDo:
if (Std.is(target.control, HumanControl)) {
case DESTROY(TANK(tank, who, wherewith, score)):
if (true /* ToDo: human tank */) {
play('boom_player');
} else {
play('boom_bot');
}
case DESTROY_EAGLE(player, eagleTeamId):
case DESTROY(EAGLE(eagle, who, wherewith, score)):
play('boom_player');
case SPAWN_BONUS(bonus):
play('bonus');
case TAKE_BONUS(player, bonus):
case DESTROY(BONUS(bonus, who, score)):
if (bonus.type == 'life') {
play('live');
} else {
play('bonus_get');
}
case _:
}*/
}
}
}

View File

@@ -1,8 +1,8 @@
package ru.m.tankz.view.classic;
import ru.m.tankz.game.GameEvent;
import haxework.view.LabelView;
import haxework.view.VGroupView;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
import ru.m.tankz.preset.ClassicGame;
import ru.m.tankz.Type.PlayerId;
@@ -19,15 +19,12 @@ import ru.m.tankz.view.common.LifeView;
private var player1Id:PlayerId = new PlayerId(ClassicGame.HUMAN, 0);
private var player2Id:PlayerId = new PlayerId(ClassicGame.HUMAN, 1);
public function onGameStart(state:GameState):Void {
public function refresh(state:GameState):Void {
level.text = 'Level ${state.levelId}';
}
public function onGameChange(state:GameState):Void {
bot.life = state.getTeamLife(ClassicGame.BOT);
player1.life = state.getPlayerLife(player1Id);
player1.score = state.getPlayerScore(player1Id);
if (true) {
if (state.getPlayerLife(player2Id) > 0) {
player2.visible = true;
player2.life = state.getPlayerLife(player2Id);
player2.score = state.getPlayerScore(player2Id);
@@ -36,11 +33,27 @@ import ru.m.tankz.view.common.LifeView;
}
}
public function onGameComplete(state:GameState):Void {
}
public function onGameEvent(event:GameEvent):Void {
switch event {
case START(state):
refresh(state);
case CHANGE(TEAM_LIFE(team, life)):
if (team.id == ClassicGame.BOT) {
bot.life = life;
}
case CHANGE(PLAYER_LIFE(player, life)):
if (player.id == player1Id) {
player1.life = life;
} else if (player.id == player2Id) {
player2.life = life;
}
case CHANGE(PLAYER_SCORE(player, score)):
if (player.id == player1Id) {
player1.score = score;
} else if (player.id == player2Id) {
player2.score = score;
}
case _:
}
}
}

View File

@@ -45,7 +45,7 @@ class GameFrame extends GroupView implements GameListener {
private function start(state:GameState):Void {
game = new Game(state.type);
game.engine.connect(render);
game.connect(render);
game.connect(soundManager);
game.connect(this);
if (panel != null) {
@@ -71,26 +71,23 @@ class GameFrame extends GroupView implements GameListener {
render.reset();
}
public function onGameStart(state:GameState):Void {}
public function onGameChange(state:GameState):Void {}
public function onGameComplete(state:GameState):Void {
result = state;
this.state = switch game.next() {
case Some(s):
// ToDo:
var progress = storage.get(game.type);
progress.completeLevel(result.levelId, result.presetId);
storage.set(progress);
s;
case None: null;
}
stop();
switcher.change(ResultFrame.ID);
}
public function onGameEvent(event:GameEvent):Void {
switch event {
case GameEvent.COMPLETE(state, winner):
result = state;
this.state = switch game.next() {
case Some(s):
// ToDo:
var progress = storage.get(game.type);
progress.completeLevel(result.levelId, result.presetId);
storage.set(progress);
s;
case None: null;
}
stop();
switcher.change(ResultFrame.ID);
case _:
}
}
public function onHide():Void {

View File

@@ -4,7 +4,6 @@ import haxework.view.HGroupView;
import haxework.view.ImageView;
import haxework.view.LabelView;
import openfl.Assets;
import ru.m.tankz.game.GameState.PlayerState;
import ru.m.tankz.game.GameState;
@:template class LifeView extends HGroupView {
@@ -51,7 +50,7 @@ import ru.m.tankz.game.GameState;
override public function update():Void {
super.update();
if (state != null) {
if (state != null && currentState != null) {
var tankConfig = currentState.config.getTank(state.tank);
tank = tankConfig == null ? 'ba' : tankConfig.skin;
color = currentState.config.getColor(state.id);

View File

@@ -4,7 +4,6 @@ import haxework.view.DataView;
import haxework.view.LabelView;
import haxework.view.VGroupView;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState.PlayerState;
import ru.m.tankz.game.GameState;
import ru.m.tankz.view.common.IGamePanel;
import ru.m.tankz.view.common.LifeView;
@@ -14,22 +13,15 @@ import ru.m.tankz.view.common.LifeView;
@:view var level:LabelView;
@:view var players:DataView<PlayerState, LifeView>;
public function onGameStart(state:GameState):Void {
level.text = 'Level ${state.levelId}';
players.data = Lambda.array(state.players);
}
public function onGameChange(state:GameState):Void {
for (view in players.views) {
view.toUpdate();
public function onGameEvent(event:GameEvent):Void {
switch event {
case START(state):
level.text = 'Level ${state.levelId}';
players.data = Lambda.array(state.players);
case _:
for (view in players.views) {
view.toUpdate();
}
}
}
public function onGameComplete(state:GameState):Void {
}
public function onGameEvent(event:GameEvent):Void {
}
}

View File

@@ -5,6 +5,7 @@ import haxework.view.LabelView;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
import ru.m.tankz.preset.DotaGame;
import ru.m.tankz.Type.TeamId;
import ru.m.tankz.view.common.IGamePanel;
import ru.m.tankz.view.common.LifeView;
@@ -14,22 +15,31 @@ import ru.m.tankz.view.common.LifeView;
@:view var dire:LifeView;
@:view var level:LabelView;
public function onGameStart(state:GameState):Void {
public function refresh(state:GameState):Void {
level.text = 'Level ${state.levelId}';
}
public function onGameChange(state:GameState):Void {
radiant.life = state.getTeamLife(DotaGame.RADIANT);
radiant.score = state.getTeamScore(DotaGame.RADIANT);
dire.life = state.getTeamLife(DotaGame.DIRE);
dire.score = state.getTeamScore(DotaGame.DIRE);
}
public function onGameComplete(state:GameState):Void {
private inline function getLifeView(teamId:TeamId):LifeView {
return switch teamId {
case DotaGame.RADIANT: radiant;
case DotaGame.DIRE: dire;
case _: null;
}
}
public function onGameEvent(event:GameEvent):Void {
switch event {
case START(state):
refresh(state);
case CHANGE(TEAM_LIFE(team, life)):
getLifeView(team.id).life = life;
case CHANGE(TEAM_SCORE(team, score)):
getLifeView(team.id).score = score;
case _:
}
}
}