如何给多个物体添加重力'automatically'?

How to add gravity to multiple bodies 'automatically'?

我知道如何给任何给定的 object/element 添加引力。只需向下添加加速度 Y。但是“如果想让我的英雄飞起来怎么办?”或“如果我想关闭某个特定物体的重力怎么办?我会有设置 gravity = 0 显然每个人都会关闭。我还想给每个形状自己的 'gravity' 变量,但我认为这太多了,而且可能不是这样做的...

我将如何创建形状

(使用 EaseJS)

function spawnShape(x, y, w, h) {
    var shape = new createjs.Shape();
    shape.graphics.beginFill("black").drawRect(x, y, w, h);
    stage.addChild(shape);
}

spawnShape(20, 250, 600, 30);
spawnShape(200, 150, 5, 5);

stage.update();

增加引力"automatically"? (每个形状都继承向下加速度)我知道有 2D 物理引擎,但我想 do/understand 这个自己,我确实尝试使用 PhysicsJS 但没有这样做..我可能会使用一个引擎但是为了现在我想知道该怎么做 :P

您可以创建对象:

function Shape(x, y, w, h, gravity){
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.gravity = gravity;
    this.shape = new createjs.Shape();
    stage.addChild(shape);
    this.draw = function(){
        shape.graphics.beginFill("black").drawRect(x, y, w, h);
    }
}

因此,您可以将其命名为:

> x = new Shape(200, 200, 10, 10, 0.5)
Shape {x: 200, y: 200, w: 10, h: 10, gravity: 0.5}
> y = new Shape(400, 100, 50, 100, 0.75)
Shape {x: 400, y: 100, w: 50, h: 100, gravity: 0.75}
> x.gravity = 0
0
> y.gravity
0.75

我没有与 EaseJS 合作过,所以具体细节可能不准确,但总体逻辑将如上所示。

我想您了解如何为物体添加或不添加重力。正如你所说,它只是给物体加上加速度Y。

听起来你只需要稍微考虑一下你的设计。假设您有一个模块 'gravity.js' 负责将重力应用于对象。

/* gravity.js */
const DEFAULT_GRAVITY_ACCELERATION = 1.0;

function applyGravity(shape) {
  const gravity = shape.gravityAcceleration !== undefined ?
    shape.gravityAcceleration : DEFAULT_GRAVITY_ACCELERATION;

  //Do whatever you normally do to update Y acceleration. Code below
  //is just an example.
  shape.addYAcceleration(gravity);
}

如果您在某处创建一个形状并希望它不受重力影响,只需设置该对象的 .gravityAcceleration 成员即可。顺便说一句,这个 "gravityAcceleration" 名称没有什么特别的——它可以是任何你想要的。

//Assuming spawnShape returns an object.
var superman = spawnShape(20, 250, 600, 30); 
superman.gravityAcceleration = 0; //Override the default gravity.

您只需为不受重力影响的形状对象设置 .gravityAcceleration 成员。