gpt4 book ai didi

java - 如何使 slick2D 显示我的 Sprite 的运动

转载 作者:行者123 更新时间:2023-12-01 13:16:06 26 4
gpt4 key购买 nike

我需要 Java Slick2D 库的一些帮助,根据我使用该库编码的经验,我了解到扩展 BasicGameState 的类将在无限循环中调用 update() 和 render() 方法,我的问题是找到一种调用 render() 方法中某些方法的方法,该方法具有 Sprite 的一些移动,例如我有这个方法:

public void move(Graphics g, Image sprite, int X, int Y){
for(int i = 0; i < 32; i++)
g.drawImage(sprite, X+i, Y);
}

当我在 render() 方法中调用 move(g, sprite, posX, PosY) 时,我的 sprite 将传送到接下来的 32 个像素而不显示动画。我应该怎么做才能解决这个问题并使我的 Sprite 正确移动?

最佳答案

你的问题的答案就在于onesixtyfourth所说的一些内容。

您需要依赖更新间隔。在 slick 中,人们容易犯的一个常见错误是将逻辑代码放入渲染方法中。这违背了许多游戏制作规则,因为渲染方法需要尽可能轻,以确保良好的帧速率。话虽如此,在光滑的 render() 方法中使用 move() 方法有点低效/未优化。因此,在 render() 方法中对图像的坐标进行逻辑运算可以被视为一项繁重的操作,特别是如果您对所有移动对象执行此操作(想象一下物理引擎运行时会有多严重)在渲染方法中)。

为了解释您所看到的内容(即时“传送”到接下来的 32 个像素),您只需遵循代码的运行方式即可。让我们看一下:

  1. 调用 update() 方法,检查输入(我猜,因为我不知道你的所有代码)
    • 发现玩家按下了移动按钮
  2. 调用了 render() 方法
    • 删除屏幕(双缓冲区的东西)
    • move 被按下,所以调用 move();图像当前位置 = (x, y)
    • 通过循环将 i 应用于 x 坐标
      • g.drawImage 在所有 i+x 位置
    • 全部打印到屏幕
  3. 调用了 update(),未找到输入
  4. 调用了 render()
    • 擦屏(双缓冲)
    • 在 x 和 y 位置绘制 Sprite
    • 不会循环调用 move(),因为没有按下任何输入

请注意,当您循环执行 move() 方法时,您告诉图形对象在该 x+i 坐标上多次绘制该种图像(不将图像视为它自己的对象,即一个实例)。这发生在一帧中。因此,到下一帧时,您不会注意到绘制了任何图像,因为当双缓冲区“清理”屏幕时,它发生得太快了(请注意“删除屏幕”发生的时间)。

修复:

要解决这个问题,如果您有一个实体类(某种具有自己图像的“玩家类”),您可以像这样设置它:

update() {
if(input is a direction of movement) {
player.direction = direction of move
} else { player.direction = player.IDLE; }

player.update(delta)
}
render() {
player.draw();
}

这样,您会注意到我在渲染方法中所做的就是绘制玩家的图像。看看这与在 render 方法中执行逻辑相比轻了多少?从中你还可以看到一种新的处理输入的方式。至于玩家等级

class player {
private final int LEFT = 0;
private final int RIGHT = 1;
private final int IDLE = -1;
Image img;
int x, y;
int direction;

public player() {
x = 0;
y = 0;
img = new Image("myplayerimage.png");
}

public void draw() {
img.draw(position.x, position.y);
}
public void update(int delta) {
move();
}
public void move() {
if(direction == LEFT) {
x -= 1;
}
else if(direction == RIGHT) {
x += 1;
}
else if(direction == IDLE) {
// Do nothing
}
}
}

虽然这个播放器类可能不是很高级,但它至少允许您观察每个帧更新上的移动增量(每个 render() 调用被视为帧更新)如何给出运动效果。这是一种线性类型的运动,就像在我的 move() 方法中一样,每次调用更新时我只增加 1。这看起来可能不是很大的移动,但如果您的 FPS 为 60,您将在一秒钟内移动 60 个像素。

总之,为了获得您想要的效果,您需要在每个游戏周期更新您的位置,并在每次 update()/render() 调用的位置绘制图像,以呈现任何类型的运动.

关于java - 如何使 slick2D 显示我的 Sprite 的运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454357/

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