相机不跟随宇宙飞船

Posted

技术标签:

【中文标题】相机不跟随宇宙飞船【英文标题】:Camera not following spaceship 【发布时间】:2021-02-25 18:28:01 【问题描述】:

在开发游戏方面,我是新手,尤其是使用新语言和框架。我无法让相机粘在播放器上。不知道我应该把this.camera.startFollow(); 语句放在哪里,这样它才能工作。该游戏是小行星重制版,但地图大于 800x600。游戏已经用 socket.io 设置好了。代码如下:

var config = 
  type: Phaser.AUTO,
  parent: 'phaser-example',
  width: 3200,
  height: 2400,
  physics: 
    default: 'arcade',
    arcade: 
      debug: false,
      gravity: 
        x: 0,
        y: 0
      
    
  ,
  scene: 
    preload: preload,
    create: create,
    update: update
  
;

const game = new Phaser.Game(config);

function preload() 
  this.load.image('ship', 'assets/spaceShips_001.png');
  this.load.image('otherPlayer', 'assets/enemyBlack5.png');
  this.load.image('star', 'assets/star_gold.png');
  this.load.image('backgroundStar1', 'assets/star2.png');
  this.load.image('backgroundStar2', 'assets/star3.png');
  this.load.image('space', 'assets/deep-space.jpg');
  //this.load.image('background', 'assets/background.png');


function create() 
  var self = this;

  this.add.tileSprite(0, 0, 6400, 4800, 'space');
  this.physics.world.setBounds(0, 0, 3200, 3200);
  //this.cameras.main.setBounds(0, 0, 3200, 3200);

  this.socket = io();
  this.otherPlayers = this.physics.add.group();
  this.socket.on('currentPlayers', function (players) 
    Object.keys(players).forEach(function (id) 
      if (players[id].playerId === self.socket.id) 
        addPlayer(self, players[id]);
        //this.camera.startFollow(self.ship); - does not work
       else 
        addOtherPlayers(self, players[id]);
      
    );
  );
  this.socket.on('newPlayer', function (playerInfo) 
    addOtherPlayers(self, playerInfo);
  );
  this.socket.on('disconnect', function (playerId) 
    self.otherPlayers.getChildren().forEach(function (otherPlayer) 
      if (playerId === otherPlayer.playerId) 
        otherPlayer.destroy();
      
    );
  );
  this.socket.on('playerMoved', function (playerInfo) 
    self.otherPlayers.getChildren().forEach(function (otherPlayer) 
      if (playerInfo.playerId === otherPlayer.playerId) 
        otherPlayer.setRotation(playerInfo.rotation);
        otherPlayer.setPosition(playerInfo.x, playerInfo.y);
      
    );
  );

  this.cursors = this.input.keyboard.createCursorKeys();

  this.blueScoreText = this.add.text(16, 16, '',  fontSize: '32px', fill: '#0000FF' );
  this.redScoreText = this.add.text(584, 16, '',  fontSize: '32px', fill: '#FF0000' );
  
  this.socket.on('scoreUpdate', function (scores) 
    self.blueScoreText.setText('Blue: ' + scores.blue);
    self.redScoreText.setText('Red: ' + scores.red);
  );

  this.socket.on('starLocation', function (starLocation) 
    if (self.star) self.star.destroy();
    self.star = self.physics.add.image(starLocation.x, starLocation.y, 'star');
    self.physics.add.overlap(self.ship, self.star, function () 
      this.socket.emit('starCollected');
    , null, self);
  );


function addPlayer(self, playerInfo) 
  self.ship = self.physics.add.image(playerInfo.x, playerInfo.y, 'ship').setOrigin(0.5, 0.5).setDisplaySize(53, 40).setCollideWorldBounds(true);
  if (playerInfo.team === 'blue') 
    self.ship.setTint(0x0000ff);
   else 
    self.ship.setTint(0xff0000);
  
  self.ship.setDrag(100);
  self.ship.setAngularDrag(100);
  self.ship.setMaxVelocity(200);


function addOtherPlayers(self, playerInfo) 
  const otherPlayer = self.add.sprite(playerInfo.x, playerInfo.y, 'otherPlayer').setOrigin(0.5, 0.5).setDisplaySize(53, 40);
  if (playerInfo.team === 'blue') 
    otherPlayer.setTint(0x0000ff);
   else 
    otherPlayer.setTint(0xff0000);
  
  otherPlayer.playerId = playerInfo.playerId;
  self.otherPlayers.add(otherPlayer);


function update() 
  if (this.ship) 
    if (this.cursors.left.isDown) 
      this.ship.setAngularVelocity(-150);
     else if (this.cursors.right.isDown) 
      this.ship.setAngularVelocity(150);
     else 
      this.ship.setAngularVelocity(0);
    
  
    if (this.cursors.up.isDown) 
      this.physics.velocityFromRotation(this.ship.rotation + 1.5, 100, this.ship.body.acceleration);
     else 
      this.ship.setAcceleration(0);
    
  
    this.physics.world.wrap(this.ship, 5);

    // emit player movement
    var x = this.ship.x;
    var y = this.ship.y;
    var r = this.ship.rotation;
    if (this.ship.oldPosition && (x !== this.ship.oldPosition.x || y !== this.ship.oldPosition.y || r !== this.ship.oldPosition.rotation)) 
      this.socket.emit('playerMovement',  x: this.ship.x, y: this.ship.y, rotation: this.ship.rotation );
    
    // save old position data
    this.ship.oldPosition = 
      x: this.ship.x,
      y: this.ship.y,
      rotation: this.ship.rotation
    ;
  

【问题讨论】:

【参考方案1】:

在create()函数中加入如下代码解决:

window.scene = this;

然后更改了我的注释行

//this.cameras.main.setBounds(0, 0, 3200, 3200);

scene.cameras.main.setBounds(0, 0, 3200, 3200);

最后添加

scene.cameras.main.startFollow(self.ship);

在我的 addPlayer() 函数中。

【讨论】:

以上是关于相机不跟随宇宙飞船的主要内容,如果未能解决你的问题,请参考以下文章

如何旋转模型以跟随路径

抛开元宇宙,我们来聊聊音视频技术的未来

对话北邮张平院士:不建议高校盲目设元宇宙系,但元宇宙不能不做

观两个宇宙视频小感

元宇宙的十大经济规则

跑步进入元宇宙,王老吉能看到不一样的未来吗?