簡體   English   中英

移相器JS走上瓷磚台階

[英]Phaser JS walk up tile based stairs

我將自己作為學習經驗,在Phaser js中創建一個小型的2D-minecraft克隆。 到目前為止,我已經獲得了玩家的移動和隨機的種子來正常工作。

我正在使用Phasers P2JS引擎,並且具有基於盒子的精靈。 我現在正在苦苦掙扎的是,我希望玩家能夠不受阻礙地走上較小的海拔高度(1瓦高),但是我對如何實現這一點並不了解。

我嘗試過更改播放器的邊界框,使其底部有一個坡度,但這使我在爬牆時遇到了很多麻煩。 我想要一種可以做到盡可能無縫的方法。 優選地,通過爬上台階,玩家速度不會改變太多。

我正在考慮編寫某種碰撞檢測函數來處理此問題,但是我不確定這是否是實現此目標的最佳方法。

謝謝你的幫助。

以下是我的代碼和一張圖像,該圖像顯示了我希望能夠走的那種步驟。 它是圖像左側的第一個標高。

var pablo = require('../generators/pablo.js');
var destiny = {};
var socket;
var player;
var jumpButton;
var levelCollisionGroup;
var playerCollisionGroup;


destiny.create = function () {
  console.info("game loaded");

  // World
  this.game.world.setBounds(0, 0, 4000, 1000);
  this.game.physics.startSystem(Phaser.Physics.P2JS);
  this.game.physics.p2.gravity.y = 600;
  this.game.physics.p2.applySpringForces= false;
  this.game.physics.p2.applyDamping= false;
  this.game.physics.p2.restitution = 0;
  this.game.physics.p2.friction = 0.01;

  // Player
  playerCollisionGroup = this.game.physics.p2.createCollisionGroup();
  player = this.game.add.sprite(this.game.world.centerX, 800, 'player');
  this.game.physics.p2.enable(player,true);
  player.body.fixedRotation = true;
  player.body.setCollisionGroup(playerCollisionGroup);
  player.body.mass = 2;

  // Camera
  this.game.camera.follow(player);
  this.game.camera.deadzone = new Phaser.Rectangle(200, 0, 400, 100);

  // Controls
  jumpButton = this.game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);
  leftButton = this.game.input.keyboard.addKey(Phaser.Keyboard.A);
  rightButton = this.game.input.keyboard.addKey(Phaser.Keyboard.D);

  // Level
  levelCollisionGroup = this.game.physics.p2.createCollisionGroup();
  this.game.physics.p2.updateBoundsCollisionGroup();
  for (i = 0; i < 280; i = i + 1) {
    var block;
    var height = pablo.getHeight(i);
    for(j = 0; j < height; j = j + 1){
      if(j === height-1){
        block = this.game.add.sprite(15*i, 993-15*j, 'grass');
      } else {
        block = this.game.add.sprite(15*i, 993-15*j, 'dirt');
      }
      block.width = 15;
      block.height = 15;
      this.game.physics.p2.enable(block);
      block.body.static=true;
      block.body.immovable = true;
      block.body.collides([levelCollisionGroup, playerCollisionGroup]);
      block.body.setCollisionGroup(levelCollisionGroup);
      if(j == height){

      }
    }
  }
  player.body.collides(levelCollisionGroup);
  this.game.stage.backgroundColor = "#5599CC";

};

destiny.update = function() {

    player.body.velocity.x=0;

    if (leftButton.isDown) {
        player.body.velocity.x = -200;
    } else if (rightButton.isDown) {
        player.body.velocity.x = 200;
    }

    if (jumpButton.isDown && this.checkIfCanJump()) {
      player.body.velocity.y = -400;
    }
};

destiny.render = function() {
  this.game.debug.cameraInfo(this.game.camera, 32, 32);
  this.game.debug.spriteCoords(player, 32, 550);
};

destiny.checkIfCanJump = function() {

    var result = false;

    for (var i=0; i < this.game.physics.p2.world.narrowphase.contactEquations.length; i++) {
        var c = this.game.physics.p2.world.narrowphase.contactEquations[i];
        if (c.bodyA === player.body.data || c.bodyB === player.body.data) {
            var d = p2.vec2.dot(c.normalA, p2.vec2.fromValues(0, 1));

            if (c.bodyA === player.body.data) {
                d *= -1;
            }

            if (d > 0.5) {
                result = true;
            }
        }
    }
    return result;
};

module.exports = destiny;

在此處輸入圖片說明

=====================編輯=====================

我現在嘗試在生成世界時創建邊緣片段的坡度。 但是我意識到,這使我不得不在以后添加用於破解數據塊的功能時重新生成世界。 因此,這不是解決方案。 我認為我需要進行一些碰撞檢測,並在碰到邊緣時向上移動播放器。 但是我不太確定如何在移相器中執行此操作。 任何幫助仍然表示贊賞。

!!! 這是什么都不做的圖片!

在此處輸入圖片說明

Emanuele Feronato 在復制移相器中的Magick游戲中張貼了一個帖子

他在那里報道了一個木塊與障礙物/牆壁碰撞的情況,該木塊具有向上爬升的能力。

您可以查看本教程,但他似乎正在做的工作是檢查對角線是否為空(換句話說,是否只是“上一步”),如果是,則運行“跳轉”功能,看起來更像是攀登。

根據您希望角色如何走動,您可能會同時查看下一個圖塊(在x軸上)以及在它之后的下一個圖塊以檢查高度。

因此,例如,如果向右移動並且下一個圖塊是平坦的,但是第二個圖塊有一個台階,則您可能會開始在y軸上向上移動角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM