gpt4 book ai didi

java - 沿着 LibGDX 中的路径 vector 偏移 Sprite

转载 作者:行者123 更新时间:2023-12-02 11:56:30 26 4
gpt4 key购买 nike

我目前有一个 Sprite 沿着一条路径...从转向角度来看一切都运行良好,但是我试图使其成为 Sprite 沿路径轨迹的中心,而不是角落(0 ,0) 沿着路径追踪。本质上,我希望鱼的中心沿着线移动。

下面是我已经实现的内容以及我想要实现的目标的图像。

enter image description here

此机制的核心实现位于我的 update() 方法中;如下;

private void update(float deltaTime) {
float angle = (float) Math.atan2(path.get(waypoint).y - getY(), path.get(waypoint).x - getX());
velocity.set((float) Math.cos(angle) * speed, (float) Math.sin(angle) * speed);

velocity_normal = new Vector2(-velocity.y, velocity.x).nor();

setPosition(
getX() + (velocity.x * deltaTime),
getY() + (velocity.y * deltaTime)
);
setRotation(angle * MathUtils.radiansToDegrees);

if(isWayPointReached()){
setPosition(path.get(waypoint).x, path.get(waypoint).y);
if(waypoint + 1 >= path.size){
waypoint = 0;
} else {
waypoint++;
}
}
}

特别是 setPosition 调用。我最初的想法是计算速度 vector 的法线 vector ,标准化,并将 x 和 y 分量分别乘以鱼的高度......在我看来,这将使鱼偏移其高度(150px)。尝试的代码如下;

velocity_normal = new Vector2(-velocity.y, velocity.x).nor();

setPosition(
getX() + (velocity.x * deltaTime) + velocity_normal.x * getHeight() * deltaTime,
getY() + (velocity.y * deltaTime) + velocity_normal.y * getHeight() * deltaTime
);

结果出现一些奇怪的行为,鱼逐渐远离线,看起来 vector 正在复合并添加每一帧。

我还尝试在到达每个路径点后更新法线 vector ,但这也不起作用。

我认为上述逻辑是正确的,但是我在 vector 数学中犯了根本性错误吗?

非常感谢您的帮助。

编辑:

添加到构造函数:

setPosition(
path.get(waypoint).x - 0.5f * getWidth() ,
path.get(waypoint).y - 0.5f * getHeight()
);

修改了update()方法;

private void update(float deltaTime) {
float angle = (float) Math.atan2(path.get(waypoint).y - getY(), path.get(waypoint).x - getX());
velocity.set((float) Math.cos(angle) * speed, (float) Math.sin(angle) * speed);


Vector2 velocity_normal = new Vector2();
velocity_normal.set(velocity).nor().scl( speed * deltaTime ); // multiply the speed to scale the unit vector up

translate( velocity_normal.x, velocity_normal.y );




setRotation(angle * MathUtils.radiansToDegrees);

if(isWayPointReached()){
setPosition(path.get(waypoint).x, path.get(waypoint).y);
if(waypoint + 1 >= path.size){
waypoint = 0;
} else {
waypoint++;
}
}
}

注意 setPosition 调用的省略,以及替换为;

Vector2 velocity_normal = new Vector2();
velocity_normal.set(velocity).nor().scl( speed * deltaTime );
translate( velocity_normal.x, velocity_normal.y );

我将如何影响下面提到的 pointA/pointB?

谢谢。

最佳答案

Sprite 位置是从左下角开始,原点( Sprite 旋转的地方)已设置为 Sprite 的中心。所以只有局部偏移是错误的。您必须从该位置减去一半的大小,然后 Sprite 就可以从该偏移量相对移动。

设置 Sprite 的位置:

setPosition(
path.get(waypoint).x - 0.5f * getWidth(),
path.get(waypoint).y - 0.5f * getHeight()
);

在更新方法中。因为您每帧都添加速度,所以您可以平移 Sprite 。

void update(float deltaTime){

// directional global vector
Vector2 velocity = tmp.set(path.get(waypoint)).sub(path.get(waypoint - 1)).nor().scl(speed * deltaTime);
// reference angle is relative to the right vector(1, 0)
float angle = velocity.angle();

setRotation(angle);
translate(velocity.x, velocity.y);

if (isWayPointReached()){
setPosition(
path.get(waypoint).x - 0.5f * getWidth(),
path.get(waypoint).y - 0.5f * getHeight()
);
if(waypoint + 1 >= path.size){
waypoint = 1;
} else {
waypoint++;
}
}
}

关于java - 沿着 LibGDX 中的路径 vector 偏移 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47562299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com