В момента внедрявам проста гравитационна система в моята игра, използвайки LibGDX. Открих обаче, че начинът, по който умножавате вектори с вектори и вектори със скалари, е малко по-различен.
В Unity бих приложил гравитацията по следния начин:
public Vector3 velocity;
public Vector3 acceleration;
private void FixedUpdate()
{
transform.position += velocity*Time.fixedDeltaTime;
Vector3 force = Physics.gravity*GetComponent<Rigidbody>().mass;
acceleration = force/GetComponent<Rigidbody>().mass;
velocity = velocity + acceleration*Time.fixedDeltaTime;
}
}
Векторното умножение е много просто.
В LibGDX опитвам следното:
import com.badlogic.gdx.math.Vector2;
final protected Vector2 _gravity = new Vector2(0f, -9.82f);
final protected float _mass = 1f;
protected Vector2 _velocity;
protected Vector2 _acceleration;
public void Update(float deltaTime)
{
// Transform is a class containing a Vector2 called Position
Transform.Position.add(_velocity.scl(deltaTime));
Vector2 force = _gravity.scl(_mass);
_acceleration = force.scl(1f/_mass);
_velocity = _velocity.add(_acceleration.scl(deltaTime));
System.out.println(_velocity);
// _velocity gets smaller and smaller and finally hits 0.
}
Това не работи, тъй като методът scl() на Vector2 директно променя самия вектор, както може да се види в класа Vector2 на LibGDX:
public Vector2 scl (float scalar) {
x *= scalar;
y *= scalar;
return this;
}
Предполагам, че искам да върне нов Vector2, вместо да променя директно самия вектор.
Как мога да направя това? Или напълно греша? Има ли по-лесен начин в LibGDX за умножаване на вектори със скалари с помощта на оператора "*"?