调整具有自定义物理文件的精灵的大小? (P2/Phaser)
Resizing a sprite that has a custom physics file? (P2/Phaser)
我有一个带有 Lime / Corona JSON 物理文件(从 PhysicsEditor 导出)的圆形精灵(弹球)。这个文件的目的是让碰撞箱实际上是圆形的。
它工作正常(对于那些不熟悉 coffeescript 的人,@
就意味着 this
)
# in preload
@load.physics 'ball_physics', @Assets.ball_physics
# in create
@ball = @add_p2_sprite @ball_start_x, @ball_start_y, 'ball'
@ball.body.clearShapes()
@ball.body.loadPolygon 'ball_physics', 'ball'
问题是我无法在不弄乱碰撞箱的情况下缩放或调整球的大小。它似乎总是以原始尺寸为准。有什么方法可以动态更新吗?
例如,这里使用的是未调整大小的精灵:
这是一个缩放到 0.5、0.5 的精灵:
除了为 sprite 创建新的 png 和 JSON 文件之外,还有什么方法可以做到这一点吗?
这是对评论的回应,打开调试模式,这样我就可以在应用物理文件之前看到勾勒出的碰撞框并缩放球:
@ball = @add.sprite @ball_start_x, @ball_start_y, 'ball'
@ball.scale.x = 2
@ball.scale.y = 2
@physics.p2.enable @ball, true
@add_physics_file(@ball, 'ball_physics', 'ball')
@collide_world_bounds(@ball)
碰撞箱没有重新缩放:
我找到了一个megmut用户代码,我试过了,效果很好,你可以试试:
function resizePolygon(originalPhysicsKey, newPhysicsKey, shapeKey, scale){
var newData = [];
var data = this.game.cache.getPhysicsData(originalPhysicsKey, shapeKey);
for (var i = 0; i < data.length; i++) {
var vertices = [];
for (var j = 0; j < data[i].shape.length; j += 2) {
vertices[j] = data[i].shape[j] * scale;
vertices[j+1] = data[i].shape[j+1] * scale;
}
newData.push({shape : vertices});
}
var item = {};
item[shapeKey] = newData;
game.load.physics(newPhysicsKey, '', item);
}
只需使用:
function preload() {
game.load.image('contra2', 'contra2.png');
game.load.physics('physicsData', 'sprites.json');
}
function create() {
game.physics.startSystem(Phaser.Physics.P2JS);
var scale = 1.5;
resizePolygon('physicsData', 'robot', 'contra2', scale)
contra = game.add.sprite(400, 300, 'contra2');
contra.scale.setTo(scale, scale);
game.physics.p2.enable(contra, true);
contra.body.clearShapes();
contra.body.loadPolygon('robot', 'contra2');
}
我有一个带有 Lime / Corona JSON 物理文件(从 PhysicsEditor 导出)的圆形精灵(弹球)。这个文件的目的是让碰撞箱实际上是圆形的。
它工作正常(对于那些不熟悉 coffeescript 的人,@
就意味着 this
)
# in preload
@load.physics 'ball_physics', @Assets.ball_physics
# in create
@ball = @add_p2_sprite @ball_start_x, @ball_start_y, 'ball'
@ball.body.clearShapes()
@ball.body.loadPolygon 'ball_physics', 'ball'
问题是我无法在不弄乱碰撞箱的情况下缩放或调整球的大小。它似乎总是以原始尺寸为准。有什么方法可以动态更新吗?
例如,这里使用的是未调整大小的精灵:
这是一个缩放到 0.5、0.5 的精灵:
除了为 sprite 创建新的 png 和 JSON 文件之外,还有什么方法可以做到这一点吗?
这是对评论的回应,打开调试模式,这样我就可以在应用物理文件之前看到勾勒出的碰撞框并缩放球:
@ball = @add.sprite @ball_start_x, @ball_start_y, 'ball'
@ball.scale.x = 2
@ball.scale.y = 2
@physics.p2.enable @ball, true
@add_physics_file(@ball, 'ball_physics', 'ball')
@collide_world_bounds(@ball)
碰撞箱没有重新缩放:
我找到了一个megmut用户代码,我试过了,效果很好,你可以试试:
function resizePolygon(originalPhysicsKey, newPhysicsKey, shapeKey, scale){
var newData = [];
var data = this.game.cache.getPhysicsData(originalPhysicsKey, shapeKey);
for (var i = 0; i < data.length; i++) {
var vertices = [];
for (var j = 0; j < data[i].shape.length; j += 2) {
vertices[j] = data[i].shape[j] * scale;
vertices[j+1] = data[i].shape[j+1] * scale;
}
newData.push({shape : vertices});
}
var item = {};
item[shapeKey] = newData;
game.load.physics(newPhysicsKey, '', item);
}
只需使用:
function preload() {
game.load.image('contra2', 'contra2.png');
game.load.physics('physicsData', 'sprites.json');
}
function create() {
game.physics.startSystem(Phaser.Physics.P2JS);
var scale = 1.5;
resizePolygon('physicsData', 'robot', 'contra2', scale)
contra = game.add.sprite(400, 300, 'contra2');
contra.scale.setTo(scale, scale);
game.physics.p2.enable(contra, true);
contra.body.clearShapes();
contra.body.loadPolygon('robot', 'contra2');
}