gpt4 book ai didi

javascript - Phaser JS 走上瓷砖楼梯

转载 作者:行者123 更新时间:2023-12-03 07:20:41 26 4
gpt4 key购买 nike

我正在用 Phaser js 创建一个小型的 2d-minecraft 克隆,作为我自己的学习经验。到目前为止,我已经让玩家移动和随机关卡种子工作正常。

我正在使用 Phasers P2JS 引擎,并且拥有基于盒子的 Sprite 。我现在正在努力解决的是,我希望玩家能够不受阻碍地走上小高地(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

======================编辑======================

我现在尝试在生成世界时创建边缘部分的斜坡。但当我后来添加了破解方 block 的功能时,我意识到这让我必须重新生成世界。因此这不是解决方案。我想我需要进行一些碰撞检测,并在碰到边缘时将玩家向上移动。但我不太确定如何在移相器中做到这一点。仍然感谢任何帮助。

!!!这是不该做的事情的图片!!!

enter image description here

最佳答案

Emanuele Feronato 有一个 post on replicating the game Magick in Phaser .

在那里,他介绍了一个方 block 与障碍物/墙壁碰撞的情况,并且该方 block 能够爬上一层。

你可以查看教程,但他似乎正在做的是检查对 Angular 线图 block 是否为空(换句话说,它是否只是向上的“一步”),如果是,则运行“跳跃” ' 函数,看起来更像是一次攀爬。

根据您希望 Angular 色如何迈步,您可能会查看下一个图 block (在 x 轴上)及其后面的图 block 来检查高度。

例如,如果向右移动并且下一个图 block 是平坦的,但第二个图 block 有台阶,您可能会开始在 y 轴上向上移动 Angular 色。

关于javascript - Phaser JS 走上瓷砖楼梯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com