2016-03-26 7 views
0

私はPhaser jsで小さな2d-minecraftクローンを作成しています。これまでのところ、私は選手の動きと無作為なレベルの種子を手に入れました。Phaser JSはタイルベースの階段を歩いて

私は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; 

enter image description here

=====================編集================ =====

私は今、世界を生成するときにエッジピースの斜面を作成しようとしました。しかし、後でブロックをハッキングする機能を追加すると、これによって世界が再生成されなくてはならないことがわかりました。したがって、これは解決策ではありません。私はいくつかの衝突の検出を行う必要があり、私がエッジを打つときにプレイヤーを移動する必要があると思う。しかし、私はフェイザーでこれをどうやって行うのかについてはあまりよく分かりません。どんな助けもまだ評価されています。

!!!ここで何をしないのイメージです!

enter image description here

答えて

1

エマヌエーレFeronatoはpost on replicating the game Magick in Phaserを持っています。

ここでは、障壁/壁に衝突するブロックのケースをカバーし、ブロックが1レベル上に登ることができます。

チュートリアルを確認できますが、彼が行っているように見えるのは、対角線のタイルが空であるかどうかを確認することです(言い換えれば、単に「ステップアップ」です)。そうであれば、ジャンプ(jump) '機能を使用しています。

キャラクターの歩み方によっては、次のタイル(x軸上)だけでなく、後ろのタイルも高さを確認することができます。

たとえば、右に移動して次のタイルがフラットで、2番目のタイルに段差がある場合は、文字をy軸上に移動し始めることがあります。

関連する問題