You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:36:04