現在、HTML5 フレームワーク Phaser を使用してマルチプレイヤー ゲームを作成しています。
ゾンビがマップ上にスポーンし、プレイヤーがゾンビを撃って殺すゲームです。ゾンビは最も近くにいるプレイヤーをターゲットにします。
現在、デザイン戦略に問題があります。動きの追跡が原因で、Phaser でこのタイプのゲームが可能かどうかはわかりません。
現在、クライアントはすべてのプレーヤーの動きを処理しているため、プレーヤーが移動するたびに、それをサーバーにブロードキャストし、サーバーはそれを他のすべてのクライアントに送信します。
ただし、ゾンビと弾丸はサーバーのみで制御したいです。次にサーバーは、各ゾンビの速度と現在の位置で各クライアントを更新します。私の推論は、プレイヤーの入力以外のものはすべてサーバーで計算する必要があるということです。これにより、2 つのクライアントがゾンビが別の時間に死亡したと言い、互いに通信しようとする、同時に別の場所に弾丸がある、クライアント間で別の時間にゾンビがスポーンするなどの問題を防ぐことができます。
ゾンビ クラスの例を次に示します。
function Zombie(game, data){
this.game = game;
this.id = data.id;
Phaser.Sprite.call(this, this.game, data.x, data.y, 'zombie');
this.anchor.setTo(0.5,0.5);
this.animations.add('right', [0,1,2,3], 7, true);
this.animations.add('left', [4,5,6,7], 7, true);
this.game.physics.arcade.enable(this);
this.body.collideWorldBounds = true;
this.health = data.health;
this.maxHealth = data.maxHealth;
this.speed = data.speed;
this.target = this.game.player;
this.waiting = 100;
this.name = "zombie";
this.healthBary = 20;
this.healthBar = this.game.add.sprite(this.x, this.y + this.healthBary, 'player_health');
this.healthBar.anchor.setTo(0.5, 0.5);
CollisionManager.addObjectToGroup(this, 'baddies');
this.game.add.existing(this);
}
Zombie.prototype = Object.create( Phaser.Sprite.prototype );
Zombie.prototype.constructor = Zombie;
Zombie.prototype.update = function(){
this.updateHealthBar();
this.moveTowards(this.target);
Zombie.prototype.uTarget = function(target) {
this.target = target;
};
Zombie.prototype.moveTowards = function(target){
var x = target.x - this.x;
var y = target.y - this.y;
var mag = Math.sqrt((x * x) + (y * y));
var nx = x / mag;
var ny = y / mag;
this.body.velocity.x = nx * this.speed;
this.body.velocity.y = ny * this.speed;
if(this.body.velocity.x >= 0){
this.animations.play('right');
}
else if(this.body.velocity.x < 0){
this.animations.play('left')
}
}
Zombie.prototype.updateHealthBar = function(){
this.healthBar.x = this.x;
this.healthBar.y = this.y + this.healthBary;
var p = (this.health / this.maxHealth);
p = parseFloat(p.toFixed(1));
this.healthBar.frame = 10 - (p * 10);
}
Zombie.prototype._damage = function(amount){
this.health -= amount;
if(this.health <= 0){
this.kill;
this.die(true);
}
}
Zombie.prototype.die = function(points){
if(this.game){
//this.game.baddie_die_sfx.play();
}
WaveManager.onMap--;
CollisionManager.removeObjectFromGroup(this, "baddies");
if(this.healthBar){
this.healthBar.destroy();
}
socket.emit("kill zombie", {id: this.id});
this.kill();
this.destroy();
}
問題は、使用できるウィンドウがないため、(Linux サーバー上で実行されているため) サーバー上に Phaser ゲーム オブジェクトを作成できないことです。弾丸とゾンビは、衝突検出のために Phaser オブジェクトである必要がありますが、サーバー上ではそれができません。
ゾンビと弾丸のベクトルをサーバー側で作成し、各弾丸/ゾンビの位置の情報をいつでも取得してからクライアントを更新できることはわかっていますが、Phaser で CollisionManager を使用することはできません。 .
今のところ、私の唯一の解決策は、独自の衝突検出システムを作成することです。代替案はありますか?