2016-03-26 9 views
0

kiremit esaslı merdivenlerden yukarı yürümek. Şimdiye kadar çalışmam için oyuncu hareketi ve rastgele seviye tohumları aldım.Phaser JS bir öğrenme deneyimi olarak başıma ben Phaser js içinde, küçük bir 2d-Minecraft klon kuruyorum

Ben Fazerler P2JS motorunu kullanarak ve kutu tabanlı sprite var duyuyorum. Şu anda uğraştığım şey: Oyuncunun engelsiz küçük yükseklikleri (1-kiremit yüksekliğinde) yürümesini istiyorum ama bunu nasıl uygulayacağımı iyi bir fikrim yok.

Ben o dibinde eğim vardı ki oyuncunun sınırlama kutusunu değiştirme denedi ama bu duvar tırmanışı ile sorun bir grup beni alır. Mümkün olduğunca kesintisiz olduğu yerde bunu yapmak için bir yol istiyorum. Tercihen, oyuncunun hızı, basamaklar tırmanarak çok fazla değiştirilmez. Bunu yapmanın en iyi yolu ise bu işlemek için çarpışma algılama fonksiyonu çeşit yazma concidering am

ama şüpheliyim.

Yardımlarınız için teşekkürler.

Aşağıda benim kod ve ben yürümeyi beable istediğiniz adımın tür gösteren bir resimdir. Görüntüdeki soldaki ilk yükseklik.

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

===================== Düzenleme ================ =====

Şimdi dünya oluştururken kenar parçalarının eğimleri oluşturma çalıştılar. Ama fark ettim ki bu daha sonra blokları kesmek için bir özellik eklediğimde dünyayı yeniden canlandırmak zorunda kalıyor. Böylece çözüm bu değil. Sanırım bir çarpışma tespiti yapmalı ve bir kenara çarptığımda oyuncuyu hareket ettirmeliyim. Ama bunu fazerde nasıl yapacağımı tam olarak bilmiyordum. Herhangi bir yardım hala takdir edilmektedir.

!!! İşte ne değildir bir resimdir !!!

enter image description here

cevap

1

Emanuele Feronato bir post on replicating the game Magick in Phaser sahiptir.

Orada bir üst gruba tırmanmaya bloğun yeteneği ile, bir engel/duvar ile çarpışan bir bloğun durumda kapsar.

Öğreticiyi kontrol edebilirsiniz, ancak yaptıklarının göründüğü şey, köşegen döşemenin boş olup olmadığını (başka bir deyişle, sadece bir 'adım' olup olmadığını kontrol etmektir, eğer varsa, ' daha bir tırmanış benziyor atlama' işlevi.

Eğer karakter adıma istiyorum nasıl bağlı olarak, potansiyel olarak her iki (x-ekseni üzerinde) bir sonraki karo yanı sıra bu yükseklik için kontrol etmek sonra bir bakmak olabilir.

Yani, örneğin, sağ hareketli ve bir sonraki kiremit düzdür, ama ikinci karo bir adım vardır, sen y ekseninde Karakterinizi yukarı hareket başlayabilir.