使用Handler类创建游戏对象时如何直接调用对象的方法
解决方案
你不需要为每个Beat实例单独声明变量名,Handler已经存储了所有游戏对象的引用,直接通过类型/ID筛选即可调用Beat实例的属性和方法,以下是可直接落地的实现方案:
方案1:给Handler扩展查询方法(最通用)
利用GameObject自带的ID枚举属性,在Handler类中新增筛选玩家和Beat的工具方法,直接在原有Handler代码基础上新增以下方法即可:
// 获取全局唯一的玩家实例 public Player getPlayer() { for (GameObject obj : object) { if (obj.getId() == ID.Player) { return (Player) obj; } } return null; } // 获取当前所有存活的Beat实例 public List<Beat> getAllBeats() { List<Beat> beatList = new ArrayList<>(); for (GameObject obj : object) { if (obj.getId() == ID.Beat) { beatList.add((Beat) obj); } } return beatList; }
方案2:按键判定逻辑实现
在按键监听的触发逻辑中,调用上面的方法获取所有Beat,和玩家位置做判定即可:
// 按键按下时的得分判定逻辑示例 private void handleKeyPress() { Player player = handler.getPlayer(); List<Beat> beats = handler.getAllBeats(); // 判定容忍范围,单位像素,可根据游戏难度调整 final int JUDGE_THRESHOLD = 45; // 优先判定离玩家最近的Beat for (Beat beat : beats) { int posDiff = Math.abs(beat.getY() - player.getY()); if (posDiff <= JUDGE_THRESHOLD) { // 命中成功,加分 totalScore += 100; // 移除被击中的节拍块 handler.removeObject(beat); break; // 单次按键仅命中一个Beat } } }
可选性能优化(Beat数量较多时推荐)
如果游戏中同时存在的Beat数量很多,每次遍历所有GameObject筛选会有冗余开销,可以在Handler中单独维护Beat的子列表,增删对象时同步更新:
public class Handler { LinkedList<GameObject> object = new LinkedList<GameObject>(); // 新增:单独维护Beat的子列表 LinkedList<Beat> beatList = new LinkedList<>(); public void addObject(GameObject object){ this.object.add(object); // 新增Beat时同步加入子列表 if (object.getId() == ID.Beat) { beatList.add((Beat) object); } } public void removeObject(GameObject object){ this.object.remove(object); // 移除Beat时同步从子列表删除 if (object.getId() == ID.Beat) { beatList.remove((Beat) object); } } // 此时获取Beat无需遍历所有对象,直接返回即可 public List<Beat> getAllBeats() { return new ArrayList<>(beatList); } // 其余原有tick、render、getPlayer方法保持不变 }
内容的提问来源于stack exchange,提问作者SourOddity
相关产品推荐
相关产品推荐

