[client] update SoundManager
This commit is contained in:
@@ -233,11 +233,24 @@ class BulletItem extends BitmapItem<Bullet> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class EagleItem extends BitmapItem<Eagle> {
|
class EagleItem extends RenderItem<Eagle, Sprite> {
|
||||||
|
|
||||||
|
private var eagleView:Bitmap;
|
||||||
|
private var protectView:Animate;
|
||||||
private var death:Bool;
|
private var death:Bool;
|
||||||
private var protected:Bool;
|
private var protected:Bool;
|
||||||
|
|
||||||
|
public function new(value:Eagle) {
|
||||||
|
super(value);
|
||||||
|
view = new Sprite();
|
||||||
|
eagleView = new Bitmap();
|
||||||
|
view.addChild(eagleView);
|
||||||
|
protectView = AnimateBundle.tankProtect();
|
||||||
|
protectView.visible = false;
|
||||||
|
view.addChild(protectView);
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
override public function update():Void {
|
override public function update():Void {
|
||||||
super.update();
|
super.update();
|
||||||
var d = value.death;
|
var d = value.death;
|
||||||
@@ -249,8 +262,8 @@ class EagleItem extends BitmapItem<Eagle> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override private function getImage():String {
|
private function getImage():String {
|
||||||
var suffix = value.death ? '-death' : value.protect.active ? '-protected' : '';
|
var suffix = value.death ? '-death' : '';
|
||||||
return 'resources/image/eagle/eagle${suffix}.png';
|
return 'resources/image/eagle/eagle${suffix}.png';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +272,16 @@ class EagleItem extends BitmapItem<Eagle> {
|
|||||||
if (!value.color.zero) {
|
if (!value.color.zero) {
|
||||||
image = BitmapUtil.colorize(image, value.color);
|
image = BitmapUtil.colorize(image, value.color);
|
||||||
}
|
}
|
||||||
view.bitmapData = image;
|
eagleView.bitmapData = image;
|
||||||
|
if (value.protect.active) {
|
||||||
|
protectView.x = (image.width - protectView.frames[0].image.width) / 2;
|
||||||
|
protectView.y = (image.height - protectView.frames[0].image.height) / 2;
|
||||||
|
protectView.playing = true;
|
||||||
|
protectView.visible = true;
|
||||||
|
} else {
|
||||||
|
protectView.playing = false;
|
||||||
|
protectView.visible = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
package ru.m.tankz.sound;
|
package ru.m.tankz.sound;
|
||||||
|
|
||||||
import openfl.media.Sound;
|
import flash.events.Event;
|
||||||
|
import flash.media.Sound;
|
||||||
|
import flash.media.SoundChannel;
|
||||||
|
import flash.media.SoundTransform;
|
||||||
import openfl.utils.Assets;
|
import openfl.utils.Assets;
|
||||||
import ru.m.tankz.core.EntityType;
|
import ru.m.tankz.core.EntityType;
|
||||||
import ru.m.tankz.engine.Engine;
|
import ru.m.tankz.engine.Engine;
|
||||||
import ru.m.tankz.Type;
|
import ru.m.tankz.Type;
|
||||||
|
|
||||||
|
|
||||||
class SoundManager {
|
class SoundManager {
|
||||||
private static var TAG(default, never):String = 'SoundManager';
|
private static var TAG(default, never):String = 'SoundManager';
|
||||||
|
|
||||||
@@ -16,23 +18,68 @@ class SoundManager {
|
|||||||
private static var type:String = 'ogg';
|
private static var type:String = 'ogg';
|
||||||
#end
|
#end
|
||||||
|
|
||||||
public function new() {}
|
public var volume(default, set):Float = 1;
|
||||||
|
public var mute(default, set):Bool = false;
|
||||||
|
|
||||||
|
private var channels:Array<SoundChannel>;
|
||||||
|
private var transform:SoundTransform;
|
||||||
|
|
||||||
|
public function new() {
|
||||||
|
channels = [];
|
||||||
|
updateSoundTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function updateSoundTransform():Void {
|
||||||
|
transform = new SoundTransform(mute ? 0 : volume);
|
||||||
|
for (channel in channels) {
|
||||||
|
channel.soundTransform = transform;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function set_volume(value:Float):Float {
|
||||||
|
if (volume != value) {
|
||||||
|
volume = value;
|
||||||
|
updateSoundTransform();
|
||||||
|
}
|
||||||
|
return volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function set_mute(value:Bool):Bool {
|
||||||
|
if (mute != value) {
|
||||||
|
mute = value;
|
||||||
|
updateSoundTransform();
|
||||||
|
}
|
||||||
|
return mute;
|
||||||
|
}
|
||||||
|
|
||||||
public function play(id:String):Void {
|
public function play(id:String):Void {
|
||||||
//L.d(TAG, 'play: ${id}');
|
//L.d(TAG, 'play: ${id}');
|
||||||
var sound:Sound = Assets.getSound('resources/sounds/${id}.${type}');
|
var sound:Sound = Assets.getSound('resources/sounds/${id}.${type}');
|
||||||
if (sound != null) {
|
if (sound != null) {
|
||||||
sound.play();
|
var channel = sound.play(0, 0, transform);
|
||||||
|
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
|
||||||
|
channels.push(channel);
|
||||||
} else {
|
} else {
|
||||||
L.w(TAG, 'Sound "${id}" not found');
|
L.w(TAG, 'Sound "${id}" not found');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function stopAll():Void {
|
||||||
|
for (channel in channels) {
|
||||||
|
channel.stop();
|
||||||
|
}
|
||||||
|
channels = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function onSoundComplete(event:Event):Void {
|
||||||
|
channels.remove(event.currentTarget);
|
||||||
|
}
|
||||||
|
|
||||||
public function onSpawn(entity:EntityType):Void {
|
public function onSpawn(entity:EntityType):Void {
|
||||||
switch entity {
|
switch entity {
|
||||||
case EntityType.BULLET(_.tank.playerId.team => 'human'):
|
case BULLET(_.tank.playerId.team => 'human'):
|
||||||
play('shot');
|
play('shot');
|
||||||
case EntityType.BONUS(_):
|
case BONUS(_):
|
||||||
play('bonus_add');
|
play('bonus_add');
|
||||||
case _:
|
case _:
|
||||||
}
|
}
|
||||||
@@ -40,11 +87,11 @@ class SoundManager {
|
|||||||
|
|
||||||
public function onChange(entity:EntityType, change:EntityChange):Void {
|
public function onChange(entity:EntityType, change:EntityChange):Void {
|
||||||
switch [entity, change] {
|
switch [entity, change] {
|
||||||
case [EntityType.TANK(_), EntityChange.HIT]:
|
case [TANK(_), HIT]:
|
||||||
play('bullet_hit');
|
play('bullet_hit');
|
||||||
//case [EntityType.TANK(_), EntityChange.LIVE_UP]:
|
//case [TANK(_), LIVE_UP]:
|
||||||
// play('live');
|
// play('live');
|
||||||
case [EntityType.EAGLE(_), EntityChange.DEATH(_)]:
|
case [EAGLE(_), DEATH(_)]:
|
||||||
play('boom_player');
|
play('boom_player');
|
||||||
case _:
|
case _:
|
||||||
}
|
}
|
||||||
@@ -52,7 +99,7 @@ class SoundManager {
|
|||||||
|
|
||||||
public function onCollision(entity:EntityType, with:EntityType):Void {
|
public function onCollision(entity:EntityType, with:EntityType):Void {
|
||||||
switch [entity, with] {
|
switch [entity, with] {
|
||||||
case [EntityType.BULLET(_), EntityType.CELL(cell)]:
|
case [BULLET(_), CELL(cell)]:
|
||||||
//play('bullet_wall');
|
//play('bullet_wall');
|
||||||
case _:
|
case _:
|
||||||
}
|
}
|
||||||
@@ -60,9 +107,9 @@ class SoundManager {
|
|||||||
|
|
||||||
public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void {
|
public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void {
|
||||||
switch entity {
|
switch entity {
|
||||||
case EntityType.TANK(_):
|
case TANK(_):
|
||||||
play('boom_bot');
|
play('boom_bot');
|
||||||
case EntityType.BONUS(_):
|
case BONUS(_):
|
||||||
play('bonus_get');
|
play('bonus_get');
|
||||||
case _:
|
case _:
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,40 @@
|
|||||||
package ru.m.tankz.view;
|
package ru.m.tankz.view;
|
||||||
|
|
||||||
|
import haxework.view.IView;
|
||||||
import flash.events.KeyboardEvent;
|
import flash.events.KeyboardEvent;
|
||||||
import flash.ui.Keyboard;
|
import flash.ui.Keyboard;
|
||||||
import haxework.resources.IResources;
|
import haxework.resources.IResources;
|
||||||
import haxework.view.frame.FrameSwitcher;
|
import haxework.view.frame.FrameSwitcher;
|
||||||
|
import ru.m.tankz.sound.SoundManager;
|
||||||
|
|
||||||
@:template class ClientView extends FrameSwitcher {
|
@:template class ClientView extends FrameSwitcher {
|
||||||
|
|
||||||
@:provide var resources:IResources;
|
@:provide var resources:IResources;
|
||||||
@:provide var switcher:FrameSwitcher;
|
@:provide var switcher:FrameSwitcher;
|
||||||
|
@:provide var soundManager:SoundManager;
|
||||||
|
|
||||||
public function init():Void {
|
public function init():Void {
|
||||||
resources.text.put('version', '${Const.VERSION}');
|
resources.text.put('version', '${Const.VERSION}');
|
||||||
switcher = this;
|
switcher = this;
|
||||||
|
onSwitch.connect(onFrameSwitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function launch():Void {
|
public function launch():Void {
|
||||||
content.stage.stageFocusRect = false;
|
content.stage.stageFocusRect = false;
|
||||||
content.stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):Void {
|
content.stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):Void {
|
||||||
if (event.keyCode == Keyboard.ESCAPE) {
|
switch event.keyCode {
|
||||||
|
case Keyboard.ESCAPE:
|
||||||
change(StartFrame.ID);
|
change(StartFrame.ID);
|
||||||
|
case Keyboard.M:
|
||||||
|
soundManager.mute = !soundManager.mute;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
change(StartFrame.ID);
|
change(StartFrame.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function onFrameSwitch(frame:IView<Dynamic>):Void {
|
||||||
|
if (frame.id == StartFrame.ID) {
|
||||||
|
soundManager.stopAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class GameFrame extends GroupView {
|
|||||||
private var panel(get, null):IGamePanel;
|
private var panel(get, null):IGamePanel;
|
||||||
|
|
||||||
@:provide var network:NetworkManager;
|
@:provide var network:NetworkManager;
|
||||||
@:provide var sound:SoundManager;
|
@:provide var soundManager:SoundManager;
|
||||||
@:provide var state:GameState;
|
@:provide var state:GameState;
|
||||||
@:provide("result") var result:GameState;
|
@:provide("result") var result:GameState;
|
||||||
@:provide var switcher:FrameSwitcher;
|
@:provide var switcher:FrameSwitcher;
|
||||||
@@ -45,7 +45,7 @@ class GameFrame extends GroupView {
|
|||||||
private function start(state:GameState):Void {
|
private function start(state:GameState):Void {
|
||||||
game = new Game(state.type);
|
game = new Game(state.type);
|
||||||
game.engine.connect(render);
|
game.engine.connect(render);
|
||||||
game.engine.connect(sound);
|
game.engine.connect(soundManager);
|
||||||
game.connect(this);
|
game.connect(this);
|
||||||
if (panel != null) {
|
if (panel != null) {
|
||||||
game.connect(panel);
|
game.connect(panel);
|
||||||
@@ -55,7 +55,7 @@ class GameFrame extends GroupView {
|
|||||||
timer.run = updateEngine;
|
timer.run = updateEngine;
|
||||||
content.addEventListener(Event.ENTER_FRAME, _redraw);
|
content.addEventListener(Event.ENTER_FRAME, _redraw);
|
||||||
render.draw(game.engine);
|
render.draw(game.engine);
|
||||||
sound.play('start');
|
soundManager.play('start');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function stop():Void {
|
private function stop():Void {
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 612 B |
Binary file not shown.
|
Before Width: | Height: | Size: 365 B After Width: | Height: | Size: 6.5 KiB |
@@ -303,8 +303,8 @@ class Game extends GameDispatcher {
|
|||||||
private function spawnBonus(?type:BonusType):Void {
|
private function spawnBonus(?type:BonusType):Void {
|
||||||
var bonusConfig:BonusConfig = type != null ? config.getBonus(type) : config.bonuses[Math.floor(Math.random() * config.bonuses.length)];
|
var bonusConfig:BonusConfig = type != null ? config.getBonus(type) : config.bonuses[Math.floor(Math.random() * config.bonuses.length)];
|
||||||
var bonus = new Bonus(bonusConfig);
|
var bonus = new Bonus(bonusConfig);
|
||||||
bonus.rect.x = Math.random() * engine.map.width;
|
bonus.rect.x = Math.round(Math.random() * engine.map.width / engine.map.cellWidth) * engine.map.cellWidth;
|
||||||
bonus.rect.y = Math.random() * engine.map.height;
|
bonus.rect.y = Math.round(Math.random() * engine.map.height/ engine.map.cellHeight) * engine.map.cellHeight;
|
||||||
engine.spawn(bonus);
|
engine.spawn(bonus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user