[common] weapon delay param
This commit is contained in:
4
WORK.md
4
WORK.md
@@ -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
|
|
||||||
|
|||||||
@@ -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,
|
||||||
]));
|
]));
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 |
@@ -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 {
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)):
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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: []
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user