代码之家  ›  专栏  ›  技术社区  ›  Noc

如何在没有窗口的情况下运行Phaser引擎?

  •  5
  • Noc  · 技术社区  · 10 年前

    我目前正在使用HTML5框架Phaser创建一个多人游戏。

    这是一个僵尸在地图上产卵的游戏,玩家必须开枪杀死他们。僵尸的目标是离他们最近的玩家。

    目前,我的设计策略有问题。由于移动跟踪,我不确定Phaser是否可以进行这种类型的游戏。

    目前,客户端正在处理所有的玩家移动,因此每当玩家移动时,它都会将其广播到服务器,服务器会将其发送给所有其他客户端。

    然而,我希望僵尸和子弹由服务器独占控制。然后,服务器用每个僵尸的速度及其当前位置更新每个客户端。我的推理是,任何不是玩家输入的东西都应该由服务器计算。这将防止诸如两个客户端表示僵尸在不同的时间死亡,然后试图彼此通信,同时在不同的位置放置子弹,或僵尸在不同时间在客户端之间产卵等问题。

    下面是僵尸类的示例:

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

    问题是我无法在服务器上创建Phaser游戏对象(因为它在Linux服务器上运行),因为没有可以使用的窗口。为了进行碰撞检测,子弹和僵尸需要是Phaser对象,但我不能在服务器上这样做。

    我知道我可以创建一个僵尸和子弹服务器端的向量,在任何给定的时间都可以获得每个子弹/僵尸的位置信息,然后更新客户端,但这样我就不能在Phaser中使用CollisionManager了。

    现在看来,我唯一的解决方案就是创建自己的碰撞检测系统。还有其他的想法吗?

    1 回复  |  直到 10 年前
        1
  •  3
  •   DungHuynh    10 年前

    我也在寻找答案。Phaser论坛的管理员表示,没有黑客入侵是不可能的。 请参阅 this post another post