我正在使用
Wasm4开发一个
pong-like
游戏。我有不同的移动方法的重要实体,一个是 Player
,它是桨,另一个是 Ball
,它们两者之间的主要区别是玩家通过用户输入移动,存储它的位置使用 i32 并且 Ball 有一个 speed
和一个 direction
向量,它每帧更新它的位置。
球码
export class Ball extends Entity {
private position: Position<f32> = new Position<f32>();
private speed: u8 = 2;
public spawn(x: i32, y: i32): void {
this.position.x = x;
this.position.y = y;
let angle = <f32>randomInRangeFloat(30, 150);
angle = angle * <f32>(Math.PI / 180);
this.direction.x = <f32>Math.cos(angle);
this.direction.y = <f32>Math.sin(angle);
}
public update(): Ball {
this.position.x += this.direction.x * this.speed;
this.position.y += this.direction.y * this.speed;
// ...
}
public draw(): Ball {
w4.oval(
<i32>this.position.x,
<i32>this.position.y,
this.size,
this.size
);
}
}
问题是,当我使用
f32
的位置时,运动看起来很漂亮 glitchy 但准确的产卵方向,但是当我将位置更改为 i32
时,运动非常流畅,但运动很奇怪,例如,它不适用于较小的速度。
我是游戏开发的新手,所以我不知道我的公式是否有问题,或者我应该在某处添加另一个元素。
希望有人能帮助我。 (如果我没有提供足够的信息,请要求我,我会加强答案)
不幸的是,看起来你没有做错任何事,但你开始触及游戏开发中更深层次的主题之一:抗锯齿。
关于 rasterization 的维基百科文章有一个很好的 animation 关于它。如果这是您的游戏中发生的那种事情,那么可能是引入抗锯齿过滤器的时候了。不幸的是,我不是游戏开发专家,所以我只能指导您使用最简单的算法,例如 Bresenham。维基百科的文章也应该让你进入这个广阔的领域。
当然,Handmade Hero 始终是一个很好的学习资源。