2014-03-31 5 views
5

Ich erstelle gerade ein Multiplayer-Spiel mit dem HTML5-Framework Phaser.Wie läuft man eine Phaser-Engine ohne Fenster?

Es ist ein Spiel, in dem Zombies auf der Karte spawnen und Spieler sie erschießen müssen, um sie zu töten. Die Zombies zielen auf Spieler ab, die ihnen am nächsten sind.

Derzeit habe ich ein Problem mit meiner Designstrategie. Ich bin nicht sicher, ob diese Art von Spiel mit Phaser aufgrund der Bewegungsverfolgung möglich ist.

Gegenwärtig behandelt der Client alle Spielerbewegungen. Wenn ein Spieler sich bewegt, überträgt er sie an den Server, der sie an alle anderen Clients sendet.

Allerdings möchte ich für die Zombies und die Kugeln ausschließlich vom Server gesteuert werden. Der Server aktualisiert dann jeden Client mit der Geschwindigkeit jedes Zombies und ihrer aktuellen Position. Meine Schlussfolgerung ist, dass alles, was nicht Player-Input ist, vom Server berechnet werden sollte. Dies verhindert Probleme wie zwei Kunden, die sagen, dass ein Zombie zu verschiedenen Zeiten gestorben ist und dann versuchen, miteinander zu kommunizieren, mit Geschossen an verschiedenen Orten zur selben Zeit oder Zombies, die zu unterschiedlichen Zeiten zwischen Clients spawnen.

Hier ist ein Beispiel für eine Zombie-Klasse:

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(); 
} 

Das Problem ist, dass ich nicht ein Phaser Spielobjekt auf dem Server erstellen kann (wie es auf einem Linux-Server ausgeführt wird), weil es keine Fenster gibt, das kann verwendet werden. Die Kugeln und Zombies müssen zur Kollisionserkennung Phaser-Objekte sein, aber das kann ich nicht auf dem Server tun.

Ich weiß, dass ich einen Vektor von Zombies und Aufzählungszeichen Server-Seite erstellen könnte, die die Informationen für jedes Geschoss/Zombies Position zu einem bestimmten Zeitpunkt hätte und dann den Client aktualisieren, aber dann wäre ich nicht in der Lage zu verwenden der CollisionManager in Phaser.

Im Moment scheint es, als wäre meine einzige Lösung, ein eigenes Kollisionserkennungssystem zu erstellen. Gibt es alternative Ideen?

+0

versuchen zu fälschen die 'window' Objekt mit' var Fenster = {} 'in der Regel funktioniert es, wenn der Rahmen Sachen DOM verwendet, auch versuchen zu http://gamedev.stackexchange.com posten / – Gntem

Antwort

3

Ich bin auf der Suche nach der Antwort auch. Phaser Forum Admin sagte, dass es unmöglich wäre ohne Hacking um. Bitte beachten Sie this post und another post