• JAVA之坦克大战系列9-高效雷达(上)


    前言

    本篇之前的内容介绍了瞄准策略,让大家明白了如何能让我们的雷达更好的锁定到敌人,本篇将分享给大家一个非常高效的雷达,供大家参考。

    主要内容复习

    第一, heading 角度系

    如图所示,所谓heading角,即从Y轴出发,然后顺时针绕回Y轴的这么个角度区间,取值范围: [0,360]

    第二, bearing角度系

    所谓bearing 角,即从Y轴顺、逆时针出发,绕半圈回到Y轴所形成的两个角度区间,取值范围:顺时针[0,180) ;逆时针[0,-180]

    好的,我们已近复习了两角度系,下面我们来学习这个非常高效的雷达

    public void onScannedRobot(ScannedRobotEvent e) {

    //注意 这里的计算都以弧度为单位

    double absBearing=0d;

    //雷达转动角度

    double radarTurnAngle=0d;

    //得到绝对角度差

    absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

    //根据absBearing角算出Radar要调整的角度

    radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());

    //转动雷达,注意是向右

    setTurnRadarRightRadians(radarTurnAngle);

    }

    分析:

    说明:

    e.getBearingRadians(),如图中的∠FBC所示

    是敌机(Enemy)与自己车头方向(你使用setAhead(正值)前进的方向即为车头方向,如BC箭头所示)所成的角,因为是以BC为Y轴的bearing角,所以这个角在这个例子中是个负值。

    getHeadingRadians(),如图中∠ABC所示

    是以自己的车头方向与屏幕垂直正上方为Y轴所成的heaing角。

    absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

    所以absBearing角即为∠FBA,即自己与敌机的连线,与Y轴所成的bearing角,取值范围为[-180,180)。

    ∠FBE=absBearing - getRadarHeadingRadians(),在这里计算出来为负值。即雷达需要转动的角度。

    最后通过Math.sin(absBearing - getRadarHeadingRadians())进行角度修正得到最终值radarTurnAngle。

    因为setTurnRadarRightRadians(radarTurnAngle)是向右旋转,所以若radarTurnAngle为负则雷达向左旋转。

    下一期将会给大家带来一个具体的实例供大家参考。

    好啦,本期内容就到这里喽,我是不会玩游戏却非得写游戏的陈老师,一起来学习JAVA吧!

  • 相关阅读:

    Qt5开发实战学习——遇到的知识
    VS2017+Qt5.9.3,VS无法打开纯Qt工程(pro文件)
    QT的OpenGL
    QT之pro文件
    虚拟机网卡还原默认设置
    qt编译QOCI驱动连接oracle数据库
    关于数据库Oracle的创建、连接和Qt的小结
    联想G50-70恢复出厂设置
    移植解决方案到中标麒麟(一)——遇到的一些问题
  • 原文地址:https://www.cnblogs.com/qfchen/p/11321936.html
Copyright © 2020-2023  润新知