[common] weapon delay param

This commit is contained in:
2019-10-07 17:29:20 +03:00
parent e7d031db58
commit d670722674
18 changed files with 74 additions and 33 deletions

View File

@@ -11,12 +11,8 @@
* A star * A star
* game config validate * game config validate
* additional weapon * additional weapon
* mine
* display count * display count
* bonus ammo * bonus ammo
* screen gamepad (button enabled, count label) * screen gamepad (button enabled, count label)
* ui: * ui:
* game frame layouts * game frame layouts
* fix:
* ice brick fix
* shot delay

View File

@@ -122,16 +122,22 @@ class AppTheme extends Theme {
var red:Color = 0xff0000; var red:Color = 0xff0000;
register(new Style("result.winner", [ register(new Style("result.winner", [
"skin.border.color" => green, "skin.border.color" => green,
"skin.border.alpha" => 0.5,
"skin.border.thickness" => 5,
"skin.round" => 10,
], ["light"])); ], ["light"]));
register(new Style("result.loser", [ register(new Style("result.loser", [
"skin.border.color" => red, "skin.border.color" => red,
"skin.border.alpha" => 0.5,
"skin.border.thickness" => 5,
"skin.round" => 10,
], ["light"])); ], ["light"]));
register(new Style("player.winner", [ register(new Style("player.winner", [
"skin.background.alpha" => 0.1, "skin.background.alpha" => 0.2,
"skin.background.color" => green, "skin.background.color" => green,
])); ]));
register(new Style("player.loser", [ register(new Style("player.loser", [
"skin.background.alpha" => 0.1, "skin.background.alpha" => 0.2,
"skin.background.color" => red, "skin.background.color" => red,
])); ]));

View File

@@ -81,7 +81,8 @@ class HumanControl extends Control {
case TankAction.SHOT(weapon): case TankAction.SHOT(weapon):
if (on) { if (on) {
if (!shotTimers.exists(weapon)) { if (!shotTimers.exists(weapon)) {
var timer = new Timer(300); // ToDo: weapon.config.delay
var timer = new Timer(350);
timer.run = shooter(weapon); timer.run = shooter(weapon);
timer.run(); timer.run();
shotTimers.set(weapon, timer); shotTimers.set(weapon, timer);

View File

@@ -150,8 +150,10 @@ class Render extends SpriteView implements IRender {
entryLayer.addChild(item.view); entryLayer.addChild(item.view);
item.update(); item.update();
playAnimate(item.rect.center, AnimateBundle.tankSpawn()); playAnimate(item.rect.center, AnimateBundle.tankSpawn());
case SPAWN(BULLET(id, rect, playerId, skin)): case SPAWN(BULLET(id, rect, playerId, skin, color)):
var item = new BulletRenderItem(rect, skin); var item = new BulletRenderItem(rect);
item.color = color;
item.skin = skin;
items.set(id, item); items.set(id, item);
entryLayer.addChild(item.view); entryLayer.addChild(item.view);
item.update(); item.update();

View File

@@ -1,20 +1,26 @@
package ru.m.tankz.render.item; package ru.m.tankz.render.item;
import haxework.color.Color;
import haxework.view.utils.BitmapUtil;
import ru.m.geom.Rectangle; import ru.m.geom.Rectangle;
class BulletRenderItem extends BitmapRenderItem { class BulletRenderItem extends BitmapRenderItem {
public var color(default, default):Null<Color>;
public var skin(default, set):String; public var skin(default, set):String;
public function new(rect:Rectangle, skin:String) { public function new(rect:Rectangle) {
super(rect); super(rect);
this.skin = skin;
move(rect.position); move(rect.position);
} }
private function set_skin(value:String):String { private function set_skin(value:String):String {
if (skin != value) { if (skin != value) {
skin = value; skin = value;
image = RenderUtil.bulletImage(skin); var image = RenderUtil.bulletImage(skin);
if (color != null) {
image = BitmapUtil.colorize(image, color);
}
this.image = image;
} }
return skin; return skin;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@@ -113,7 +113,8 @@ abstract Rectangle(Array<Float>) {
} }
public function intersection2(line:Line):Bool { public function intersection2(line:Line):Bool {
return contain(line.point1) || contain(line.point2); // ToDo: line to rect?
return contain(line.point1) || contain(line.point2) || contain(line.center);
} }
public function lean(rect:Rectangle):Void { public function lean(rect:Rectangle):Void {

View File

@@ -55,6 +55,7 @@ typedef WeaponConfig = {
var bullet:BulletConfig; var bullet:BulletConfig;
var count:Int; var count:Int;
var queue:Int; var queue:Int;
var delay:Int;
} }
typedef TankConfig = { typedef TankConfig = {

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.core; package ru.m.tankz.core;
import haxework.color.Color;
import ru.m.geom.Direction; import ru.m.geom.Direction;
import ru.m.geom.Rectangle; import ru.m.geom.Rectangle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
@@ -11,6 +12,7 @@ class Bullet extends MobileEntity {
public var tank(default, default):Tank; public var tank(default, default):Tank;
public var weapon(default, default):Weapon; public var weapon(default, default):Weapon;
public var config(default, null):BulletConfig; public var config(default, null):BulletConfig;
public var color(default, default):Color;
public function new(id:Int, rect:Rectangle, playerId:PlayerId, config:BulletConfig) { public function new(id:Int, rect:Rectangle, playerId:PlayerId, config:BulletConfig) {
super(id, rect, config.speed, Direction.RIGHT); super(id, rect, config.speed, Direction.RIGHT);

View File

@@ -4,7 +4,6 @@ import haxework.color.Color;
import ru.m.geom.Direction; import ru.m.geom.Direction;
import ru.m.geom.Rectangle; import ru.m.geom.Rectangle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.Type; import ru.m.tankz.Type;
class Tank extends MobileEntity { class Tank extends MobileEntity {

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.core; package ru.m.tankz.core;
import ru.m.tankz.engine.ITicker;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
class Weapon { class Weapon {
@@ -9,21 +10,29 @@ class Weapon {
public var queue(default, default):Int; public var queue(default, default):Int;
public var available(get, null):Bool; public var available(get, null):Bool;
private var lastShotTime:Int;
public function new(config:WeaponConfig) { public function new(config:WeaponConfig) {
this.config = config; this.config = config;
this.count = this.config.count; this.count = this.config.count;
this.queue = 0; this.queue = 0;
this.lastShotTime = 0;
} }
private function get_available():Bool { private function get_available():Bool {
return (count < 0 || count > 0) && (config.queue < 0 || queue < config.queue); return (count < 0 || count > 0) && (config.queue < 0 || queue < config.queue);
} }
public function use():Void { public function use(ticker:ITicker):Bool {
if (available && ticker.time > lastShotTime + config.delay) {
lastShotTime = ticker.time;
queue++; queue++;
if (count > 0) { if (count > 0) {
count--; count--;
} }
return true;
}
return false;
} }
public function release():Void { public function release():Void {

View File

@@ -56,6 +56,7 @@ import ru.m.tankz.map.LevelMap;
public function move(entityId:Int, direction:Direction):Void { public function move(entityId:Int, direction:Direction):Void {
if (entities.exists(entityId)) { if (entities.exists(entityId)) {
ticker.cancel('slide.tank.${entityId}');
cast(entities.get(entityId), MobileEntity).move(direction); cast(entities.get(entityId), MobileEntity).move(direction);
} }
} }

View File

@@ -50,7 +50,7 @@ class EventUtil {
} }
public static function buildBulletSpawn(bullet:Bullet):GameEvent { public static function buildBulletSpawn(bullet:Bullet):GameEvent {
return SPAWN(BULLET(bullet.id, bullet.rect.clone(), bullet.playerId, bullet.config.skin)); return SPAWN(BULLET(bullet.id, bullet.rect.clone(), bullet.playerId, bullet.config.skin, bullet.color));
} }
public static function buildMove(entity:Entity):GameEvent { public static function buildMove(entity:Entity):GameEvent {

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import haxework.color.Color;
import ru.m.geom.Position; import ru.m.geom.Position;
import ru.m.geom.Rectangle; import ru.m.geom.Rectangle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
@@ -29,7 +30,7 @@ enum SpawnEvent {
BRICK(bricks:Array<BrickInfo>); BRICK(bricks:Array<BrickInfo>);
EAGLE(id:Int, rect:Rectangle, teamId:TeamId); EAGLE(id:Int, rect:Rectangle, teamId:TeamId);
TANK(id:Int, rect:Rectangle, playerId:PlayerId, info:TankInfo); TANK(id:Int, rect:Rectangle, playerId:PlayerId, info:TankInfo);
BULLET(id:Int, rect:Rectangle, playerId:PlayerId, skin:String); BULLET(id:Int, rect:Rectangle, playerId:PlayerId, skin:String, color:Color);
BONUS(id:Int, rect:Rectangle, type:BonusType); BONUS(id:Int, rect:Rectangle, type:BonusType);
} }

View File

@@ -283,17 +283,23 @@ class GameRunner extends Game implements EngineListener {
case ACTION(tankId, SHOT(index)): case ACTION(tankId, SHOT(index)):
var tank:Tank = cast engine.entities.get(tankId); var tank:Tank = cast engine.entities.get(tankId);
var player = getPlayer(tank.playerId); var player = getPlayer(tank.playerId);
if (!tank.freezing) {
var weapon:Weapon = tank.weapons.length > index - 1 ? tank.weapons[index] : null; var weapon:Weapon = tank.weapons.length > index - 1 ? tank.weapons[index] : null;
if (weapon != null && !tank.freezing && weapon.available) { if (weapon != null && weapon.use(ticker)) {
var rect = tank.rect; var rect = tank.rect;
var point = rect.center.add(new Point(rect.width / 4 * rect.direction.x, rect.height / 4 * rect.direction.y)); var point = rect.center.add(new Point(rect.width / 4 * rect.direction.x, rect.height / 4 * rect.direction.y));
var bullet = builder.buildBullet(point, rect.direction, player.id, weapon.config.bullet); var bullet = builder.buildBullet(point, rect.direction, player.id, weapon.config.bullet);
// ToDo: mine color
if (bullet.config.skin == "mine") {
bullet.color = config.getColor(player.id);
}
bullet.tank = tank; bullet.tank = tank;
bullet.weapon = weapon; bullet.weapon = weapon;
bullet.move(bullet.rect.direction); bullet.move(bullet.rect.direction);
engine.spawn(bullet); engine.spawn(bullet);
gameEventSignal.emit(EventUtil.buildBulletSpawn(bullet)); gameEventSignal.emit(EventUtil.buildBulletSpawn(bullet));
} }
}
case ACTION(tankId, MOVE(direction)): case ACTION(tankId, MOVE(direction)):
engine.move(tankId, direction); engine.move(tankId, direction);
case ACTION(tankId, STOP): case ACTION(tankId, STOP):
@@ -305,9 +311,6 @@ class GameRunner extends Game implements EngineListener {
var player = getPlayer(playerId); var player = getPlayer(playerId);
player.tankId = id; player.tankId = id;
player.state.tank = info; player.state.tank = info;
case SPAWN(BULLET(id, _, _, _)):
var bullet:Bullet = engine.getEntity(id);
bullet.weapon.use();
case CHANGE(BRICK(id, type)): case CHANGE(BRICK(id, type)):
engine.map.bricksById[id].config = config.getBrick(type); engine.map.bricksById[id].config = config.getBrick(type);
case CHANGE(TANK(id, type, hits, bonus, boat)): case CHANGE(TANK(id, type, hits, bonus, boat)):

View File

@@ -71,6 +71,7 @@ tanks:
- bullet: {<<: *bullet, speed: 8.0} - bullet: {<<: *bullet, speed: 8.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
- type: human1 - type: human1
upgrade: human2 upgrade: human2
@@ -83,6 +84,7 @@ tanks:
- bullet: {<<: *bullet, speed: 8.5} - bullet: {<<: *bullet, speed: 8.5}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
- type: human2 - type: human2
upgrade: human3 upgrade: human3
@@ -94,6 +96,7 @@ tanks:
- bullet: {<<: *bullet, speed: 9.0} - bullet: {<<: *bullet, speed: 9.0}
queue: 2 queue: 2
count: -1 count: -1
delay: 300
- type: human3 - type: human3
downgrade: human2 downgrade: human2
@@ -105,6 +108,7 @@ tanks:
- bullet: {<<: *bullet, speed: 9.0, piercing: 3, skin: piercing} - bullet: {<<: *bullet, speed: 9.0, piercing: 3, skin: piercing}
queue: 2 queue: 2
count: -1 count: -1
delay: 300
- type: bot0 - type: bot0
width: 38 width: 38
@@ -116,6 +120,7 @@ tanks:
- bullet: {<<: *bullet, speed: 7.0} - bullet: {<<: *bullet, speed: 7.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
- type: bot1 - type: bot1
width: 40 width: 40
@@ -127,6 +132,7 @@ tanks:
- bullet: {<<: *bullet, speed: 7.0} - bullet: {<<: *bullet, speed: 7.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
- type: bot2 - type: bot2
width: 38 width: 38
@@ -138,6 +144,7 @@ tanks:
- bullet: {<<: *bullet, speed: 9.0} - bullet: {<<: *bullet, speed: 9.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
- type: bot3 - type: bot3
width: 40 width: 40
@@ -150,6 +157,7 @@ tanks:
- bullet: {<<: *bullet, speed: 8.0} - bullet: {<<: *bullet, speed: 8.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
bonuses: bonuses:
- {score: 500, factory: freeze.team, type: clock, duration: 10} - {score: 500, factory: freeze.team, type: clock, duration: 10}

View File

@@ -81,11 +81,14 @@ tanks:
- bullet: {width: 12, height: 12, speed: 12.0, piercing: 1, layer: 2, skin: normal} - bullet: {width: 12, height: 12, speed: 12.0, piercing: 1, layer: 2, skin: normal}
queue: 2 queue: 2
count: -1 count: -1
delay: 300
- bullet: {width: 16, height: 16, speed: 4.0, piercing: 4, layer: 4, skin: rocket} - bullet: {width: 16, height: 16, speed: 4.0, piercing: 4, layer: 4, skin: rocket}
queue: 1 queue: 1
count: 3 count: 3
delay: 300
- bullet: {width: 20, height: 20, speed: 0.0, piercing: 1, layer: 0, skin: mine} - bullet: {width: 20, height: 20, speed: 0.0, piercing: 1, layer: 0, skin: mine}
queue: -1 queue: -1
count: 3 count: 3
delay: 300
bonuses: [] bonuses: []

View File

@@ -97,6 +97,7 @@ tanks:
- bullet: {<<: *bullet, speed: 12.0} - bullet: {<<: *bullet, speed: 12.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
- type: fast - type: fast
width: 40 width: 40
@@ -108,6 +109,7 @@ tanks:
- bullet: {<<: *bullet, speed: 8.0} - bullet: {<<: *bullet, speed: 8.0}
queue: 1 queue: 1
count: -1 count: -1
delay: 300
bonuses: bonuses:
- {score: 100, factory: freeze.team, type: clock, duration: 10} - {score: 100, factory: freeze.team, type: clock, duration: 10}