我希望我的游戏从精灵中抽取硬币,然后我的主角就可以拿起它们。我正在尝试使用数组列表,但我不知道如何实现此功能。我是否需要绘制一个Sprite的数组列表,然后重新使用它?如果是这样,怎么样? 或者我还使用其他功能?我是个乞丐,如果这个问题看起来很奇怪,那就很抱歉。
答案 0 :(得分:2)
我建议使用Libgdx的Array类而不是Java ArrayList,因为它针对游戏性能进行了优化。
创建一个数组来保存所有活动的硬币。
Array<Sprite> activeCoins = new Array<Sprite>();
然后创建一个硬币池。池是帮助创建某些东西的副本而不会导致垃圾收集打嗝的帮手。您需要创建要使用的Pool的子类。它描述了如何在需要时创建新硬币。
public class CoinPool extends Pool<Sprite> {
TextureRegion coinTextureRegion;
public CoinPool(TextureRegion coinTextureRegion){
this.coinTextureRegion = coinTextureRegion;
}
protected Sprite newObject(){
return new Sprite(coinTextureRegion);
}
}
然后创建一个在游戏中使用的CoinPool实例。
现在,无论何时想要新硬币,都要从泳池中取出一枚。如有必要,它只会实例化一个新的。否则,它会从之前交给你一个回收的。一旦你得到它,在任何你想要的地方设置它的位置和其他参数。请记住,它可能仍然附有旧值,因此,如果您正在旋转硬币并移动它们或更改颜色,您需要确保重置位置和旋转以及颜色。
Sprite newCoin = coinPool.obtain();
newCoin.setPosition(x,y,z); //as desired
newCoin.setRotation(0); //if you are rotating them
newCoin.setColor(Color.WHITE); //if you have been changing their color
activeCoins.add(newCoin); //Add your new coin to the list of active coins
无论何时完成硬币(当它被收集时),您需要将其从活动硬币列表中删除并将其返回到池中:
for (Sprite coin : activeCoins){
boolean grabbed = isCoinGrabbed(coin); //however you want to do this
if (grabbed){
coinGrabbed(); //whatever you want to happen when a coin is grabbed
activeCoins.remove(coin);
coinPool.free(coin); //return it to the pool
}
}
要绘制它们,您只需将当前位于activeCoins
列表中的所有精灵提交给精灵批处理。
答案 1 :(得分:0)
我最近在Java中设计了一款2D侧滚动角色扮演游戏。游戏的一部分是四处走动,拿起剑和盔甲等物品。
我将精灵加载到游戏中的方法是通过将图标设置为图像来为JLabel提供我的图像(在游戏开始时在本地检索)。
接下来,我会随机将JLabel放在游戏地图上。我没有使用数组列表,但如果你有多种类型的剑或硬币等,你可以使用它。
数组列表可以包含剑的类型(JLabel的图标设置为精灵),例如青铜,银和金剑。
一旦你的JLabel(s)加载到你的地图你可以给他们一个命中框,如果你的角色在命中框内移动然后从地图中移除JLabel并进入玩家背包(或者不管它是什么,也许附加硬币金额?)。