将错误的精灵图形分配给切片

时间:2013-05-15 15:33:55

标签: java swing 2d sprite tile

我现在正在关注YouTube上的一系列视频教程,特别是TheChernoProject的游戏编程教程。我得到了第36集,这是关于从瓷砖渲染一个级别。我不会详细介绍,但我遇到了一个没有人遇到的奇怪问题(至少没有人请求帮助)。
更确切地说:我有一个Sprite类,一个Tile类(有两个扩展它的类:GrassTile和VoidTile)和一个Level类。 Tiles的级别cosists,由精灵组成。你可以在这里看到瓷砖:

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);

sprite的两个构造函数:

(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是相同的,即使我创建grass和voidTile类时,它们也会分配不同的sprite。奇怪的是,分配的精灵取决于我创建它们的顺序。现在所有的tile都有一个voidSprite图形,因为我最后创建了VoidTile。当我交换它们(使GrassTile最后)时,它们都有草精灵。我尝试了所有我想到的工作,但事实并非如此。我已经上传了项目文件夹,所以你可以导入它并检查代码,也许我错过了一些东西。

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

1 个答案:

答案 0 :(得分: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变量不应该是静态的。
  • 请在此网站上发布适当的代码,这样我们就不必为您做自己应该做的scut工作,例如挖掘错误。
  • 不要不必要地混合AWT和Swing组件。

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