Phaser Box2d - 在一个方向上锁定拖动
Phaser Box2d - Lock drag in one direction
我正在开发 Phaser's Box2d 插件来构建游戏。在游戏中,可以用鼠标拖动对象。但我想修复拖动方向,即对象应该只在水平或垂直方向移动。
我查看了官方示例和文档。找不到任何符合目的的东西。
This example 使用 sprite.input.allowVerticalDrag = false
显示运动方向锁定,但它不适用于 Box2d 的拖动。
我正在关注 this example 以启用拖动。我已经尝试在 mouseDragMove
和 update
函数中将 sprite.body.y
设置为固定值,如 300,以便它确实向 y
方向移动。但结果并不顺利。它仍然朝那个方向摇晃了一下。
我可以做什么来实现它?我是否缺少插件的任何内置选项?
我们在制作的游戏中遇到了类似的问题,虽然我们的游戏不使用物理,但我们制作的游戏可能对您有用。整个想法是在拖动对象时使用补间设置对象的位置(而不是直接设置它的位置) - 这样你可以 运行 你的检查并在补间执行时手动设置你的约束,如果你的输入是你的对象不应该在的地方,你根本不对那个位置执行补间。
我找到了解决办法。我所做的是在传递给框架的 mouseDragMove
处理程序的 mousePointer
参数中覆盖特定轴中的精灵位置。
这是它的工作原理 -
var isDragging = false,
activeSpriteX=0,
activeSpriteY=0;
function mouseDragStart(e) {
isDragging = true;
//get the clicked sprite
var currentSprite = game.physics.box2d.getBodiesAtPoint(e.x, e.y);
//save the position of clicked sprite
if (currentSprite.length > 0) {
activeSpriteX = game.input.mousePointer.x;
activeSpriteY = game.input.mousePointer.y;
}
game.physics.box2d.mouseDragStart(game.input.mousePointer);
}
function mouseDragMove() {
mousePointer = game.input.mousePointer;
//if sprite is being dragged
if (isDragging) {
//HERE IS THE WHOLE TRICK -
//just override the vertical position of `mousePointer` to sprite's initial position, when it was clicked
//To fix the sprite in horizontal direction, just override the `x`
mousePointer.y = activeCarY;
}
game.physics.box2d.mouseDragMove(mousePointer);
}
function mouseDragEnd(e) {
game.physics.box2d.mouseDragEnd();
isDragging = false;
}
我正在开发 Phaser's Box2d 插件来构建游戏。在游戏中,可以用鼠标拖动对象。但我想修复拖动方向,即对象应该只在水平或垂直方向移动。
我查看了官方示例和文档。找不到任何符合目的的东西。
This example 使用 sprite.input.allowVerticalDrag = false
显示运动方向锁定,但它不适用于 Box2d 的拖动。
我正在关注 this example 以启用拖动。我已经尝试在 mouseDragMove
和 update
函数中将 sprite.body.y
设置为固定值,如 300,以便它确实向 y
方向移动。但结果并不顺利。它仍然朝那个方向摇晃了一下。
我可以做什么来实现它?我是否缺少插件的任何内置选项?
我们在制作的游戏中遇到了类似的问题,虽然我们的游戏不使用物理,但我们制作的游戏可能对您有用。整个想法是在拖动对象时使用补间设置对象的位置(而不是直接设置它的位置) - 这样你可以 运行 你的检查并在补间执行时手动设置你的约束,如果你的输入是你的对象不应该在的地方,你根本不对那个位置执行补间。
我找到了解决办法。我所做的是在传递给框架的 mouseDragMove
处理程序的 mousePointer
参数中覆盖特定轴中的精灵位置。
这是它的工作原理 -
var isDragging = false,
activeSpriteX=0,
activeSpriteY=0;
function mouseDragStart(e) {
isDragging = true;
//get the clicked sprite
var currentSprite = game.physics.box2d.getBodiesAtPoint(e.x, e.y);
//save the position of clicked sprite
if (currentSprite.length > 0) {
activeSpriteX = game.input.mousePointer.x;
activeSpriteY = game.input.mousePointer.y;
}
game.physics.box2d.mouseDragStart(game.input.mousePointer);
}
function mouseDragMove() {
mousePointer = game.input.mousePointer;
//if sprite is being dragged
if (isDragging) {
//HERE IS THE WHOLE TRICK -
//just override the vertical position of `mousePointer` to sprite's initial position, when it was clicked
//To fix the sprite in horizontal direction, just override the `x`
mousePointer.y = activeCarY;
}
game.physics.box2d.mouseDragMove(mousePointer);
}
function mouseDragEnd(e) {
game.physics.box2d.mouseDragEnd();
isDragging = false;
}