我现在正在关注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
答案 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更改为非静态时编译器向您抱怨,则必须修复使用sprite字段的其他代码,而不是再次使sprite静态。