调整具有自定义物理文件的精灵的大小? (P2 /移相器)

时间:2017-03-27 21:35:44

标签: javascript phaser-framework

我有一个带有Lime / Corona JSON物理文件的圆形精灵(弹球)(从PhysicsEditor导出)。此文件的目的是使hitbox实际上是循环的。

它工作正常(对于那些不熟悉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'

问题在于我无法在不弄乱命中箱的情况下缩放或调整球的大小。它似乎总是与原始尺寸有关。有没有办法动态更新?

例如,这里使用的是未调整大小的精灵:

enter image description here

这里有一个sprite缩放到0.5,0.5:

enter image description here

除了为精灵创建新的png和JSON文件之外,还有什么办法吗?

这是对评论的回复,打开debugMode,所以我看到了在应用物理文件之前勾勒出的击球盒并缩放球:

@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)

hitbox没有重新缩放:

enter image description here

1 个答案:

答案 0 :(得分:1)

我找到了一个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');
   }