在Phaser中如何在没有移动后强制精灵物理被激活/启用
In Phaser how to force sprite physics be active / enabled after no movement
Phaser JS 新手,正在尝试构建 "simple" 游戏。如果您能想象游戏中的碎砖机——只有底座和球。我希望能够将底座向上移动并让球仍然坐在底座上。我还希望能够倾斜底座并根据倾斜的一侧使球 "roll" 向下。
最初球掉落并落在底座上,如果我立即移动底座,一切都会按我预期的方式进行。但我的问题是在球停在底座上之后,我不能在球不穿过底座的情况下向上移动底座 - 我也不能在那种状态下倾斜底座,因为球在底座移动时不会移动倾斜。
也许我需要以某种方式将球精灵(在 Phaser 中使用 Box2d 物理)设置为启用/激活,以便物理引擎考虑精灵而不是忽略它(一旦它 "timed out")?
更新: 根据@philipp 的建议,使用 Phaser 的默认 Arcade Physics,我现在能够让底座向上移动以保持球位于顶部(尽管我想避免发生一些短暂的重叠,但目前不确定如何防止这种情况发生?);在倾斜底座时,我无法让球 "roll" 向下任何一侧。似乎即使旋转了底座,碰撞区域也没有移动,球也不知道它需要 "roll" 向下。这是一个带有调试信息的移相器 sanbox 示例(向左或向右移动以查看底座旋转):http://phaser.io/sandbox/WVVnswOt/play
更新 2:
这是我的 Box2d Phaser 尝试的代码笔。如果您立即使用箭头键将底座向上、向下、向左、向右移动(同时与盒子碰撞),那么物理将按预期工作。如果你在盒子停在底座上后等待几秒钟,移动底座对盒子没有任何影响;我希望即使在最初的等待之后盒子也能受到基地的影响:http://codepen.io/mgalpy/pen/wWRBpo
;
更新 3:
终于能够达到我的目的了。使基地 "static" 但可以通过使用运动学(而不是静态的)移动并在每次更新时将基地的速度归零。现在有左右旋转。这是一个带有 Box2d Phaser 物理的 codepen,移动底部精灵,顶部精灵静止,并让顶部精灵的物理响应 - 即使它处于非活动状态或静止状态:http://codepen.io/mgalpy/pen/qNLVdA
// JavaScript source code
var game = new Phaser.Game(800, 600, Phaser.CANVAS, '', {
preload: function () {
this.scale.pageAlignHorizontally = true;
this.game.stage.backgroundColor = "#FFFFFF";
this.game.load.image('boxImg', boxImg);
},
create: function () {
this.game.physics.startSystem(Phaser.Physics.BOX2D);
this.game.physics.box2d.gravity.y = 500;
this.game.physics.box2d.setBoundsToWorld();
var vertices = [[-57, 51.5, 54.5, 53, -55, 53.5]];
this.box2 = this.game.add.sprite(420, 50, 'boxImg');
this.game.physics.box2d.enable(this.box2);
this.createPolygon(this.box2, vertices);
this.box = this.game.add.sprite(420, 450, 'boxImg');
this.game.physics.box2d.enable(this.box);
this.createPolygon(this.box, vertices);
this.box.body.fixedRotation = true;
this.box.body.kinematic = true;
this.cursors = this.game.input.keyboard.createCursorKeys();
},
createPolygon: function (piece, vertices) {
piece.body.clearFixtures();
for (var i = 0; i < vertices.length; i++) {
piece.body.addPolygon(vertices[i]);
}
},
render: function () {
this.game.debug.box2dWorld();
},
update: function () {
this.box.body.velocity.x = 0;
this.box.body.velocity.y = 0;
this.box.body.angularVelocity = 0;
if (this.cursors.left.isDown) {
this.box.body.rotateLeft(30);
}
else if (this.cursors.right.isDown) {
this.box.body.rotateRight(30);
}
if (this.cursors.up.isDown) {
this.box.body.moveUp(200);
}
else if (this.cursors.down.isDown) {
this.box.body.moveDown(200);
}
}
});
var boxImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABYCAYAAAB4fpBOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxOEM2MTA5OTk0RERFNDExOUExQUVFOUVENUM1REE4RiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEOTVEQzI2N0UxNDAxMUU0OUExNUE5MDkzOTc2MzE0MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEOTVEQzI2NkUxNDAxMUU0OUExNUE5MDkzOTc2MzE0MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI1MkE0QTFEMjlFMUU0MTFBM0I1RDA2NTA2MjUxOTkyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4QzYxMDk5OTREREU0MTE5QTFBRUU5RUQ1QzVEQThGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+p0NIbgAAA29JREFUeNrsnTuPEzEQx+3dTUKSI3dClEjUiALRUHENLYJ6KyRKvsOVNPAF0oYqafkMUF1PARINAgnRXAL3IMk+GOe8y9jaSIDWPs76jzTSxLvO4zeT8fgRRU6nU9EgN0nvk+6TLlj7nLTU9jHpWts/Sc+0vdbXhL53zvp/J821fUK6Yv1PxSWUNE3/6v7EejwgHZM+ucDPUGjHNDn5B2mm7TPtKNvJhRUkC93W5OQqSDL93JUcbQkSFRRLbavnOZnNZsrOCfziTz6ctCL81QXDDkUWOkjekL4lZ7ysLkTspiFgtya7pHukj0hf0LfgdVNK2ec9vi5G4svRnujEed3WTfL6251EhYjkuR2RHUfapraE92G2ei4pz+1407/Qdrl5HLA8JujPKdIPOPC7/I756UB8/Hbd+zuT5LBOXBhOqpys2qV2snJQLJud3EksJ1fRFTMny99Olpv+BQusjPWn1xTsNevAKlh/YQTmFnlGepD8b6FQllKssrh+zO3LItU3+cGt92LUr8Z1cY2i/DYHvsM7rfMImfgfZZ3HdfBYEnGqsRlpAOdCoi22ykyg4xj4VaQUv8AhnoF3jfl1CV+4Bt7nF/ICORwpJTDgQzPCY9BxDDwxczjguAaOpO0Z+KhpegrBoBkM8A6/0LDwAnFZh2cFgh8pJTDgA6MOx+KV3xxeIIcjpYQGfBd1OCIcdTjEUZWCOhwpJSjg1m4P/OAaeBc1OFJK0MCNtfAM03rnwI0cUmLzxznwxKzBAcY18KGZUjCtx6AZGPArRh2OstA58J5Rh2Pig5QSGnDjbDgWrtwDt35ughzueeID8Ty1Rx2OQTMw4Fie9QwcGxBIKWEDtxav4AfXwM3lWayHI6WEBtw45rbK4AdEeGDAcczNM3Acc0NKwUwT0iJwrKUgpYQNHOvhnoFjx8czcOxpega+gzocg2bQwI2jbjh55bkOx9lCpBTU4ZA263AU4p7rcOxpeq7DsWuPQTPsOhxloXPgxk9OsAGBlBIUcCxceQaOpVnPwBHSnoFb/26CaT0GzcCAW79CRg53Kepc+CfeMOitxMM770CmBel3V3bTBwVc/eXsIem9TcjLUgx7S9BqXw7TNF1WOXwMHs5lzAfNCelTHemQliNbsaXonlQ5XDDoEz2I3gCnVuSzSiO84ZcAAwDMgAEnYKuw5QAAAABJRU5ErkJggg==';
Phaser.js 有自己的 Physics 模块,所以在这种情况下你不需要使用 Box2d。 Here您可以找到一个基本教程来创建一个使用物理的简单平台游戏,因此这可能会让您对相位器的物理引擎的用法有一个基本的了解。
使用物理的基本方法是,将物理世界中对象转换的控制权交给物理引擎。如果你想 "move" 或 "rotate" 这个 "world" 中的对象,你需要对它们施加力,而不是直接设置值,因为那是物理引擎会做的给你。
Phaser JS 新手,正在尝试构建 "simple" 游戏。如果您能想象游戏中的碎砖机——只有底座和球。我希望能够将底座向上移动并让球仍然坐在底座上。我还希望能够倾斜底座并根据倾斜的一侧使球 "roll" 向下。
最初球掉落并落在底座上,如果我立即移动底座,一切都会按我预期的方式进行。但我的问题是在球停在底座上之后,我不能在球不穿过底座的情况下向上移动底座 - 我也不能在那种状态下倾斜底座,因为球在底座移动时不会移动倾斜。
也许我需要以某种方式将球精灵(在 Phaser 中使用 Box2d 物理)设置为启用/激活,以便物理引擎考虑精灵而不是忽略它(一旦它 "timed out")?
更新: 根据@philipp 的建议,使用 Phaser 的默认 Arcade Physics,我现在能够让底座向上移动以保持球位于顶部(尽管我想避免发生一些短暂的重叠,但目前不确定如何防止这种情况发生?);在倾斜底座时,我无法让球 "roll" 向下任何一侧。似乎即使旋转了底座,碰撞区域也没有移动,球也不知道它需要 "roll" 向下。这是一个带有调试信息的移相器 sanbox 示例(向左或向右移动以查看底座旋转):http://phaser.io/sandbox/WVVnswOt/play
更新 2: 这是我的 Box2d Phaser 尝试的代码笔。如果您立即使用箭头键将底座向上、向下、向左、向右移动(同时与盒子碰撞),那么物理将按预期工作。如果你在盒子停在底座上后等待几秒钟,移动底座对盒子没有任何影响;我希望即使在最初的等待之后盒子也能受到基地的影响:http://codepen.io/mgalpy/pen/wWRBpo
;
更新 3: 终于能够达到我的目的了。使基地 "static" 但可以通过使用运动学(而不是静态的)移动并在每次更新时将基地的速度归零。现在有左右旋转。这是一个带有 Box2d Phaser 物理的 codepen,移动底部精灵,顶部精灵静止,并让顶部精灵的物理响应 - 即使它处于非活动状态或静止状态:http://codepen.io/mgalpy/pen/qNLVdA
// JavaScript source code
var game = new Phaser.Game(800, 600, Phaser.CANVAS, '', {
preload: function () {
this.scale.pageAlignHorizontally = true;
this.game.stage.backgroundColor = "#FFFFFF";
this.game.load.image('boxImg', boxImg);
},
create: function () {
this.game.physics.startSystem(Phaser.Physics.BOX2D);
this.game.physics.box2d.gravity.y = 500;
this.game.physics.box2d.setBoundsToWorld();
var vertices = [[-57, 51.5, 54.5, 53, -55, 53.5]];
this.box2 = this.game.add.sprite(420, 50, 'boxImg');
this.game.physics.box2d.enable(this.box2);
this.createPolygon(this.box2, vertices);
this.box = this.game.add.sprite(420, 450, 'boxImg');
this.game.physics.box2d.enable(this.box);
this.createPolygon(this.box, vertices);
this.box.body.fixedRotation = true;
this.box.body.kinematic = true;
this.cursors = this.game.input.keyboard.createCursorKeys();
},
createPolygon: function (piece, vertices) {
piece.body.clearFixtures();
for (var i = 0; i < vertices.length; i++) {
piece.body.addPolygon(vertices[i]);
}
},
render: function () {
this.game.debug.box2dWorld();
},
update: function () {
this.box.body.velocity.x = 0;
this.box.body.velocity.y = 0;
this.box.body.angularVelocity = 0;
if (this.cursors.left.isDown) {
this.box.body.rotateLeft(30);
}
else if (this.cursors.right.isDown) {
this.box.body.rotateRight(30);
}
if (this.cursors.up.isDown) {
this.box.body.moveUp(200);
}
else if (this.cursors.down.isDown) {
this.box.body.moveDown(200);
}
}
});
var boxImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABYCAYAAAB4fpBOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxOEM2MTA5OTk0RERFNDExOUExQUVFOUVENUM1REE4RiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEOTVEQzI2N0UxNDAxMUU0OUExNUE5MDkzOTc2MzE0MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEOTVEQzI2NkUxNDAxMUU0OUExNUE5MDkzOTc2MzE0MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI1MkE0QTFEMjlFMUU0MTFBM0I1RDA2NTA2MjUxOTkyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4QzYxMDk5OTREREU0MTE5QTFBRUU5RUQ1QzVEQThGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+p0NIbgAAA29JREFUeNrsnTuPEzEQx+3dTUKSI3dClEjUiALRUHENLYJ6KyRKvsOVNPAF0oYqafkMUF1PARINAgnRXAL3IMk+GOe8y9jaSIDWPs76jzTSxLvO4zeT8fgRRU6nU9EgN0nvk+6TLlj7nLTU9jHpWts/Sc+0vdbXhL53zvp/J821fUK6Yv1PxSWUNE3/6v7EejwgHZM+ucDPUGjHNDn5B2mm7TPtKNvJhRUkC93W5OQqSDL93JUcbQkSFRRLbavnOZnNZsrOCfziTz6ctCL81QXDDkUWOkjekL4lZ7ysLkTspiFgtya7pHukj0hf0LfgdVNK2ec9vi5G4svRnujEed3WTfL6251EhYjkuR2RHUfapraE92G2ei4pz+1407/Qdrl5HLA8JujPKdIPOPC7/I756UB8/Hbd+zuT5LBOXBhOqpys2qV2snJQLJud3EksJ1fRFTMny99Olpv+BQusjPWn1xTsNevAKlh/YQTmFnlGepD8b6FQllKssrh+zO3LItU3+cGt92LUr8Z1cY2i/DYHvsM7rfMImfgfZZ3HdfBYEnGqsRlpAOdCoi22ykyg4xj4VaQUv8AhnoF3jfl1CV+4Bt7nF/ICORwpJTDgQzPCY9BxDDwxczjguAaOpO0Z+KhpegrBoBkM8A6/0LDwAnFZh2cFgh8pJTDgA6MOx+KV3xxeIIcjpYQGfBd1OCIcdTjEUZWCOhwpJSjg1m4P/OAaeBc1OFJK0MCNtfAM03rnwI0cUmLzxznwxKzBAcY18KGZUjCtx6AZGPArRh2OstA58J5Rh2Pig5QSGnDjbDgWrtwDt35ughzueeID8Ty1Rx2OQTMw4Fie9QwcGxBIKWEDtxav4AfXwM3lWayHI6WEBtw45rbK4AdEeGDAcczNM3Acc0NKwUwT0iJwrKUgpYQNHOvhnoFjx8czcOxpega+gzocg2bQwI2jbjh55bkOx9lCpBTU4ZA263AU4p7rcOxpeq7DsWuPQTPsOhxloXPgxk9OsAGBlBIUcCxceQaOpVnPwBHSnoFb/26CaT0GzcCAW79CRg53Kepc+CfeMOitxMM770CmBel3V3bTBwVc/eXsIem9TcjLUgx7S9BqXw7TNF1WOXwMHs5lzAfNCelTHemQliNbsaXonlQ5XDDoEz2I3gCnVuSzSiO84ZcAAwDMgAEnYKuw5QAAAABJRU5ErkJggg==';
Phaser.js 有自己的 Physics 模块,所以在这种情况下你不需要使用 Box2d。 Here您可以找到一个基本教程来创建一个使用物理的简单平台游戏,因此这可能会让您对相位器的物理引擎的用法有一个基本的了解。
使用物理的基本方法是,将物理世界中对象转换的控制权交给物理引擎。如果你想 "move" 或 "rotate" 这个 "world" 中的对象,你需要对它们施加力,而不是直接设置值,因为那是物理引擎会做的给你。