LibGDX复刻吃豆人:如何永久移除被吃掉的豆粒?
解决LibGDX吃豆人豆粒被吃后重新出现的问题
你的问题根源在于每次渲染时都重新生成并绘制所有符合条件的豆粒,没有记录哪些豆粒已经被吃掉。要实现永久移除的效果,需要把豆粒的状态保存下来,只渲染未被吃掉的豆粒。具体步骤如下:
1. 用集合存储所有有效豆粒
首先,在类的成员变量中声明一个集合来保存所有初始存在的豆粒(推荐用LibGDX的Array,比Java原生集合更适合游戏场景):
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.math.Rectangle; // 类成员变量 private Array<Rectangle> pellets = new Array<>(); private Texture pellet; // 你的豆粒纹理 private Array<Rectangle> walls; // 你的墙碰撞集合
2. 初始化阶段生成并保存豆粒
把原来渲染时的豆粒生成逻辑移到初始化方法(比如create()或show())中,只执行一次:
// 初始化豆粒(只执行一次) for (int y = 0; y < 你的地图行数; y++) { // 补充外层y循环,你原来的代码里应该有这层 for (int x = 1; x < 27; x++) { Rectangle pelletRect = new Rectangle(); pelletRect.x = (x * 70) + 25; pelletRect.y = (y * 70) + 25; // 设置豆粒的碰撞大小(和纹理尺寸一致) pelletRect.width = pellet.getWidth(); pelletRect.height = pellet.getHeight(); // 检查是否和墙重叠 boolean isOnWall = false; for (Rectangle wall : walls) { if (pelletRect.overlaps(wall)) { isOnWall = true; break; } } if (!isOnWall) { pellets.add(pelletRect); } } }
3. 渲染阶段只绘制存在的豆粒
在render()方法中,遍历集合绘制剩余的豆粒,同时直接用集合大小作为剩余豆粒数:
// 渲染豆粒 batch.begin(); for (Rectangle p : pellets) { batch.draw(pellet, p.x, p.y); } // 剩余豆粒数直接取集合大小 pelletCount = pellets.size; batch.end();
4. 碰撞检测时移除被吃掉的豆粒
在更新逻辑(比如update(float delta)方法)中,检查吃豆人与豆粒的碰撞,移除被吃掉的豆粒:
// 假设pacmanRect是吃豆人的碰撞矩形 Iterator<Rectangle> pelletIterator = pellets.iterator(); while (pelletIterator.hasNext()) { Rectangle currentPellet = pelletIterator.next(); if (pacmanRect.overlaps(currentPellet)) { // 移除被吃掉的豆粒 pelletIterator.remove(); // 这里可以添加吃豆得分逻辑,比如score += 10; } }
为什么原来的代码会失效?
你之前的代码每次渲染都会重新计算所有x/y位置的豆粒,只要位置不在墙上就会绘制——完全没有记录哪些豆粒已经被吃。当吃豆人离开后,该位置的豆粒会被重新绘制,所以看起来是“重新出现”。而用集合保存豆粒状态,移除后就不会再被渲染,自然实现永久消失的效果。
内容的提问来源于stack exchange,提问作者ADLStudios
相关产品推荐
相关产品推荐

