0

我现在正在关注 YouTube 上的一系列视频教程,特别是 TheChernoProject 的游戏编程教程。我到了第 36 集,这是关于从瓷砖渲染关卡的。我不会对此进行太多详细介绍,但是我遇到了一个没有人遇到过的奇怪问题(至少没有人寻求帮助)。
更准确地说:我有一个 Sprite 类、一个 Tile 类(有两个扩展它的类:GrassTile 和 VoidTile)和一个 Level 类。Tiles 的关卡组件,由 sprite 组成。您可以在此处查看该图块:

public static Tile grass = new GrassTile(Sprite.grass);
public static Tile voidTile = new VoidTile(Sprite.voidSprite);

精灵是这样创建的:

public static Sprite grass = new Sprite(16, 0, 0, Spritesheet.tileset);
public static Sprite voidSprite = new Sprite(16, 0x00AAFF);

精灵的两个构造函数:这些是

(int size, int x, int y, Spritesheet sheet)
(int size, int colour)

并且级别是随机生成的,字段范围为 0-3(0 是草,其余的目前只是 VoidTile。但是它显示图形的方式有问题。我确实使用 printlns 进行了检查,我是确保大部分都有效(它确实分配了正确的 Tiles,具体取决于 ID)。你可以在那里看到它:

ID: 0 |   Tile: com.ekhart.game.level.tile.GrassTile@73d74138 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef
ID: 2 |   Tile: com.ekhart.game.level.tile.VoidTile@3ba0d916 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef
ID: 3 |   Tile: com.ekhart.game.level.tile.VoidTile@3ba0d916 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef
ID: 1 |   Tile: com.ekhart.game.level.tile.VoidTile@3ba0d916 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef

您可能会注意到,Sprite 是相同的,即使当我创建草地和 voidTile 类时,它们分配了不同的 sprite。奇怪的是,分配的精灵取决于我创建它们的顺序。现在所有的瓷砖都有一个 voidSprite 图形,因为我最后创建了 VoidTile。当我交换它们时(最后制作 GrassTile),它们都有草精灵。我尝试了我能想到的一切来完成这项工作,但事实并非如此。我已经上传了项目文件夹,所以你可以导入它并检查代码,也许我错过了一些东西。

项目网址:https ://dl.dropboxusercontent.com/u/18909657/TheGame.rar

4

1 回答 1

1

好的,我撒谎并确实查看了您的 rar 文件,并且我怀疑您正在不恰当地使用静态:

public class Tile {

public int x;
public int y;

public static Sprite sprite;

public static Tile grass = new GrassTile(Sprite.grass);
public static Tile voidTile = new VoidTile(Sprite.voidSprite);

public Tile(Sprite sprite) {
    Tile.sprite = sprite;
}

public void render(int x, int y, Screen screen) {
}

public boolean solid() {
    return false;
}

}

通过将 sprite 字段设为静态,它现在对于所有 Tile 实例都是相同的。

解决方案:

  • 不要不恰当地使用静态。sprite Sprite 变量不应该是静态的。
  • 请在此站点上发布适当的代码,这样我们就不必为您做您应该自己做的琐碎工作,例如挖掘错误。
  • 不要不必要地混合 AWT 和 Swing 组件。

请注意,如果您在将 sprite 更改为非静态时编译器向您抱怨,那么您必须修复使用 sprite 字段的其他代码,而不是再次使 sprite 成为静态。

于 2013-05-15T15:41:51.330 回答