Как поменять поколение платформы в игре Phaser? - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю бесконечного бегуна.В тот момент, когда нажата левая клавиша со стрелкой, игрок перемещается влево, камера следует за ним, и наземные плитки под игроком разрушаются, когда они выходят за пределы мира справа и воссоздаются перед тем, как они попадают в границы мира.налево.Это позволяет ему продолжать работать вечно, не выбегая из земли.Мой код работает отлично, но с одной проблемой: я хочу, чтобы игрок работал справа от игры, а НЕ слева.Обратите внимание: мне не нужно, чтобы игрок мог двигаться в обоих направлениях.Я могу заставить камеру следовать за игроком вправо, а не влево, выполнив следующее: я удаляю негатив из -this в

this.world.setBounds(-this.player.yChange, 0, ...);

, чтобы он стал

this.world.setBounds(this.player.yChange, 0, ...);

Теперьпри нажатии клавиши со стрелкой вправо камера следует за игроком, когда он бежит направо, но наземные плитки не восстанавливаются, и он выбегает из земли.В общем, мне нужно изменить направление, в котором восстанавливается почва, но я не могу понять, как это сделать.Поскольку все работает влево, я уверен, что это несколько простых настроек, возможно, некоторые негативы, которые нужно сделать положительными?Я был на этом в течение нескольких дней и не могу понять это.Кто-нибудь может увидеть очевидное решение?Я был бы так благодарен.

Мой код указан ниже или см. Ссылку на кодовый блок: https://codepen.io/clownhead/pen/BqyqOm

    var Jumper = function() {};
Jumper.Play = function() {};

Jumper.Play.prototype = {

  preload: function() {
    this.load.image( 'hero', 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/836/dude.png' );
    this.load.image( 'pixel', 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/836/pixel_1.png' );
  },

  create: function() {
    // background color
    this.stage.backgroundColor = '#6bf';

    // scaling
    this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
    this.scale.maxWidth = this.game.width;
    this.scale.maxHeight = this.game.height;
    this.scale.pageAlignHorizontally = true;
    this.scale.pageAlignVertically = true;
    this.scale.setScreenSize( true );

    // physics
    this.physics.startSystem( Phaser.Physics.ARCADE );

    // camera and platform tracking vars
    this.cameraXMin = 99999;
    this.platformXMin = 99999;

    // create platforms
    this.platformsCreate();

    // create hero
    this.heroCreate();

    // cursor controls
    this.cursor = this.input.keyboard.createCursorKeys();
  },

  update: function() {
    // this is where the main magic happens
    // the x offset and the width of the world are adjusted
    // to match the furthest point the hero has reached
    this.world.setBounds(-this.hero.xChange, 0, this.world.width + this.hero.xChange, this.game.height);

    // the built in camera follow methods won't work for our needs, we create a custom one

    this.cameraXMin = Math.min( this.cameraXMin, this.hero.x - this.game.width + 130 );
    this.camera.x = this.cameraXMin;

    // hero collisions and movement
    this.physics.arcade.collide( this.hero, this.platforms );
    this.heroMove();

     // these are pooled so they are very performant
    this.platforms.forEachAlive( function( elem ) {
      this.platformXMin = Math.min( this.platformXMin, elem.x );
      if( elem.x > this.camera.x + this.game.width ) {
        elem.kill();
        this.platformsCreateOne( this.platformXMin - 70, this.world.height - 50, 50 );
      }
    }, this );
  },

  shutdown: function() {
    // reset everything, or the world will be messed up
    this.world.setBounds( 0, 0, this.game.width, this.game.height );
    this.cursor = null;
    this.hero.destroy();
    this.hero = null;
    this.platforms.destroy();
    this.platforms = null;
  },

  platformsCreate: function() {
    // platform basic setup
    this.platforms = this.add.group();
    this.platforms.enableBody = true;
    this.platforms.createMultiple( 10, 'pixel' );

    // create a batch of platforms that start to move across the level
    for( var i = 0; i < 9; i++ ) {
      this.platformsCreateOne( this.world.width - 70 - 70 * i, this.world.height - 50, 50);
    }
  },

  platformsCreateOne: function( x, y, width ) {
    // this is a helper function since writing all of this out can get verbose elsewhere
    var platform = this.platforms.getFirstDead();
    platform.reset( x, y );
    platform.scale.x = width;
    platform.scale.y = 16;
    platform.body.immovable = true;
    return platform;
  },

  heroCreate: function() {
    // basic hero setup
    this.hero = game.add.sprite( this.world.centerX, this.world.height - 69, 'hero' );
    this.hero.anchor.set( 0.5 );

    // track where the hero started and how much the distance has changed from that point
    this.hero.xOrig = this.hero.x;
    this.hero.xChange = 0;

    // hero collision setup
    // disable all collisions except for down
    this.physics.arcade.enable( this.hero );
    this.hero.body.gravity.y = 500;
    this.hero.body.checkCollision.up = false;
    this.hero.body.checkCollision.left = false;
    this.hero.body.checkCollision.right = false;
  },

  heroMove: function() {
    // handle the left and right movement of the hero
    if( this.cursor.left.isDown ) {
      this.hero.body.velocity.x = -400;
    } else if( this.cursor.right.isDown ) {
      this.hero.body.velocity.x = 400;
    } else {
      this.hero.body.velocity.x = 0;
    }

    // handle hero jumping
    if( this.cursor.up.isDown && this.hero.body.touching.down ) {
      this.hero.body.velocity.y = -350;
    } 

    // wrap world coordinated so that you can warp from top to bottom
    this.world.wrap( this.hero, this.hero.width / 2, false );

    // track the maximum amount that the hero has travelled
    this.hero.xChange = Math.max( this.hero.xChange, Math.abs( this.hero.x - this.hero.xOrig ) );

  }
}

var game = new Phaser.Game( 500, 300, Phaser.CANVAS, '' );
game.state.add( 'Play', Jumper.Play );
game.state.start( 'Play' );

1 Ответ

0 голосов
/ 30 сентября 2018

Таким образом, соответствующий бит вашего кода по существу таков:

this.camera.x = this.cameraXMin;

Если мы посмотрим, как код ведет себя, он отслеживает, где находится герой, а затем учитывает, гдегерой был.

this.cameraXMin = Math.min( this.cameraXMin, this.hero.x - this.game.width + 130 );

Это прекрасно работает, пока герой движется влево, так как x продолжает уменьшаться.Однако, как только вы начнете двигаться вправо, то, где они впервые начали (скажем, 0), всегда будет ниже, чем куда они идут (что будет становиться все выше и выше).

Итак, вместо отслеживания Math.minвам нужен Math.max.Вам потребуется реорганизовать свой код больше, чем этот, но внесение следующих изменений поможет вам выбрать правильный путь.

В create вам придется установить лучшее значение по умолчанию:

// Instead of setting this to a high number, I would start it where the camera starts. Or just set it to 0.
this.cameraXMin = this.camera.x;

Теперь у вас есть update, имейте это Math.max:

this.cameraXMin = Math.max( this.cameraXMin, this.hero.x - this.game.width + 130 );

Код вашей платформы также нужно будет изменить, но приведенный выше должен дать вам представление о том, что должно бытьизмененное.

...