zoukankan      html  css  js  c++  java
  • 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吧!

  • 相关阅读:
    PHP学习
    python获取命令行参数 启动文件
    SQLServer中char、varchar、nchar、nvarchar的区别
    VBA
    python 爬虫资料
    python乱码问题之爬虫篇
    angularjs component
    通过jQuery Ajax使用FormData对象上传文件
    directive完成UI渲染后执行JS
    交易日志
  • 原文地址:https://www.cnblogs.com/qfchen/p/11321936.html
Copyright © 2011-2022 走看看