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

Java+LibGDX愤怒小鸟类游戏小球抛射计算错误排查求助

问题分析与修复方案

问题1:小球未朝拖拽反方向运动

当前代码中速度分量直接使用拖拽角度计算,和愤怒小鸟「拖拽反方向发射」的核心逻辑相反。需要对速度分量取反,同时注意LibGDX的MathUtils.cos()/MathUtils.sin()接收的是弧度值,如果inputProcessor.getAngle()返回的是角度制数值,必须先转成弧度。

修改速度计算部分:

// 转换角度为弧度(若getAngle()返回角度)
float radianAngle = MathUtils.degreesToRadians(angle);
// 取反速度分量,实现拖拽反方向发射
float velocityX = -power * BALL_SPEED * MathUtils.cos(radianAngle);
float velocityY = -power * BALL_SPEED * MathUtils.sin(radianAngle);

如果getAngle()返回的已是弧度,去掉MathUtils.degreesToRadians()转换即可。

问题2:小球新X位置距离初始点过近

你现在用的time = (2 * power * MathUtils.sin(angle)) / 9.8f是抛物线落地的时间公式,但测试阶段强制newBallY=0,这个公式完全不适用,会导致位移计算异常。

测试阶段可以直接简化逻辑:用拖拽力度power结合发射角度计算位移,不需要依赖飞行时间。比如:

// 测试阶段:直接计算X方向位移,可调整系数让位移更明显
float displacementScale = 50; // 可根据需求修改这个值
float newBallX = initialBallX + velocityX * displacementScale;

同时检查inputProcessor.getPower()的返回值范围,如果拖拽时长对应的power数值过小,也会导致位移不足,确保其返回的是合理量级(比如拖拽1秒返回1,而非0.1)。

额外问题:向上拖拽却向下运动

这是方向未取反的连锁问题——向上拖拽时,原始角度对应的是向下的方向,速度Y分量为正,导致小球向下运动。取反速度分量后,Y方向速度变为负(假设你的坐标系Y轴向上),就能实现向上拖拽时小球向上发射。

修正后的核心代码片段

private void renderGame() {
    batch.begin();
    batch.draw(background, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    if (inputProcessor.isShotCompleted()) {
        float power = inputProcessor.getPower();
        float angle = inputProcessor.getAngle();
        float initialBallX = inputProcessor.getBallX();
        
        // 角度转弧度(若需要)
        float radianAngle = MathUtils.degreesToRadians(angle);
        // 反方向速度计算
        float velocityX = -power * BALL_SPEED * MathUtils.cos(radianAngle);
        
        // 测试阶段直接计算位移
        float displacementScale = 50;
        float newBallX = initialBallX + velocityX * displacementScale;
        float newBallY = 0;
        
        // 更新位置
        inputProcessor.setBallX(newBallX);
        inputProcessor.setBallY(newBallY);
        ballX = newBallX;
        ballY = newBallY;
        inputProcessor.isShotCompleted = false;
    } else {
        // 修正else块的变量赋值问题,确保全局变量拿到最新位置
        ballX = inputProcessor.getBallX();
        ballY = inputProcessor.getBallY();
    }
    // 更新旋转角度
    rotationAngle = (rotationAngle + Gdx.graphics.getDeltaTime() * 100) % 360;
    // 绘制小球
    batch.draw(playerCharacter, ballX - BALL_RADIUS, ballY - BALL_RADIUS,
            BALL_RADIUS, BALL_RADIUS, BALL_RADIUS * 2,
            BALL_RADIUS * 2, 1, 1, rotationAngle);
    batch.end();
}

注意:原else块中定义了局部的ballX/ballY但未赋值给全局变量,会导致绘制时使用旧位置,已在代码中修正。


内容的提问来源于stack exchange,提问作者sammy medawar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:03:13