单击图块并在 libGdx 中更改其颜色
Clicking on a tile and changing its color in libGdx
我正在尝试单击图块并更改其颜色。到目前为止我有这个:
if(Gdx.input.isTouched()){
Vector3 click = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(click);
Cell clicked = path.getCell((int)click.x, (int)click.y);
clicked.getTile();
}
一旦 clicked
有了它的图块坐标(假设我做对了),我现在想在那个图块上画一个蓝色方块。我该怎么做?如果有帮助,我的资产文件夹中有 testTile.png
。我使用 batch.draw();
将其他图片绘制到屏幕上。如果需要更多信息,请随时询问。
path
是 TiledMapTileLayer。
我解决这个问题的方法是有一个自定义列表 class 存储需要绘制蓝色方块的位置和需要绘制的精灵。 (在列表中存储精灵会给你更多的灵活性)
所以基本上在您的渲染方法中,您将通过循环列表来绘制这些图块。
示例代码:(想不出比 SpriteMap 更好的名字)
public class SpriteMap {
int posX;
int posY;
Sprite sprite;
public SpriteMap(int posX, int posY, Sprite sprite) {
this.posX = posX;
this.posY = posY;
this.sprite = sprite;
}
//ignoring getters
}
假设您的 class 中有一个 SpriteMap 列表,您将在其中进行渲染,并且还可以在 isTouched() 方法中访问该列表。
List<SpriteMap> spriteMapList = new ArrayList<SpriteMap>();
现在在你的 isTouched 里面
if(Gdx.input.isTouched()){
Vector3 click = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(click);
spriteMapList.add(new SpriteMap((int)click.x, (int)click.y, new Sprite(THE_BLUE_BOX_TEXTURE));
}
现在在您的渲染方法中,您所要做的就是循环列表并从 SpriteMap 对象的列表中绘制每个精灵。
//Pseudo code inside render after batch.begin();
for(SpriteMap spriteMap : spriteMapList) {
spriteMap.sprite().setPosition(spriteMap.posX, spriteMap.posY);
spriteMap.draw(batch);
}
注意 Re-use 蓝框纹理。还要确保在绘制地图后绘制蓝色框,否则它会隐藏在地图后面。
另一个注意事项 可能需要调整单击位置的 x 和 y,以便在确切的图块上绘制精灵。所以请相应地改变它。我已经直接使用了来自 click 的 X 和 Y,但您可能需要更改它们。
希望对您有所帮助。
我正在尝试单击图块并更改其颜色。到目前为止我有这个:
if(Gdx.input.isTouched()){
Vector3 click = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(click);
Cell clicked = path.getCell((int)click.x, (int)click.y);
clicked.getTile();
}
一旦 clicked
有了它的图块坐标(假设我做对了),我现在想在那个图块上画一个蓝色方块。我该怎么做?如果有帮助,我的资产文件夹中有 testTile.png
。我使用 batch.draw();
将其他图片绘制到屏幕上。如果需要更多信息,请随时询问。
path
是 TiledMapTileLayer。
我解决这个问题的方法是有一个自定义列表 class 存储需要绘制蓝色方块的位置和需要绘制的精灵。 (在列表中存储精灵会给你更多的灵活性) 所以基本上在您的渲染方法中,您将通过循环列表来绘制这些图块。
示例代码:(想不出比 SpriteMap 更好的名字)
public class SpriteMap {
int posX;
int posY;
Sprite sprite;
public SpriteMap(int posX, int posY, Sprite sprite) {
this.posX = posX;
this.posY = posY;
this.sprite = sprite;
}
//ignoring getters
}
假设您的 class 中有一个 SpriteMap 列表,您将在其中进行渲染,并且还可以在 isTouched() 方法中访问该列表。
List<SpriteMap> spriteMapList = new ArrayList<SpriteMap>();
现在在你的 isTouched 里面
if(Gdx.input.isTouched()){
Vector3 click = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(click);
spriteMapList.add(new SpriteMap((int)click.x, (int)click.y, new Sprite(THE_BLUE_BOX_TEXTURE));
}
现在在您的渲染方法中,您所要做的就是循环列表并从 SpriteMap 对象的列表中绘制每个精灵。
//Pseudo code inside render after batch.begin();
for(SpriteMap spriteMap : spriteMapList) {
spriteMap.sprite().setPosition(spriteMap.posX, spriteMap.posY);
spriteMap.draw(batch);
}
注意 Re-use 蓝框纹理。还要确保在绘制地图后绘制蓝色框,否则它会隐藏在地图后面。
另一个注意事项 可能需要调整单击位置的 x 和 y,以便在确切的图块上绘制精灵。所以请相应地改变它。我已经直接使用了来自 click 的 X 和 Y,但您可能需要更改它们。
希望对您有所帮助。