131 个版本 (73 个破坏性更新)
0.79.3 | 2024 年 4 月 19 日 |
---|---|
0.79.1 | 2023 年 12 月 28 日 |
0.78.2 | 2023 年 11 月 22 日 |
0.54.1 | 2023 年 7 月 21 日 |
0.27.0 | 2022 年 11 月 29 日 |
#14 in 游戏
每月 188 次下载
54KB
1K SLoC
这是 Oort 的 API 参考文档。有关更多信息,请参阅 wiki。
入门代码
Oort 预期您的代码有一个 Ship
类型,具有一个 tick
方法。每个教程都提供了一些入门代码,包括这些
use oort_api::prelude::*;
pub struct Ship {}
impl Ship {
pub fn new() -> Ship {
Ship {}
}
pub fn tick(&mut self) {
}
}
当创建船只时,游戏将调用您的 new
函数,然后在模拟期间每秒调用 tick
60 次。
struct Ship
适用于存储需要在 ticks 之间持续的状态。 enum Ship
也很有用,当此状态在不同船只类别之间不同时,它可能很有帮助。
语句 use oort_api::prelude::*
导入所有 API,以便您可以简单地使用它们,例如 position()
。有关导入的所有内容的详细信息,请参阅 [prelude] 模块文档。以下将介绍重要的 API。
子系统
船只执行的任何操作(如开火或扫描雷达)都在 ticks 之间发生。特别是,设置雷达航向或无线电频道将在下一个 tick 影响扫描结果或接收到的消息。
船只状态和控制
基本状态
class() → Class
:获取船只类别(战斗机、巡洋舰等)。position() → Vec2
:获取当前以米为单位的位置。velocity() → Vec2
:获取当前以米每秒(m/s)为单位的速度。heading() → f64
:获取当前以弧度为单位的航向。angular_velocity() → f64
:获取当前以弧度每秒(radians/s)为单位的角速度。health() → f64
:获取当前生命值。fuel() → f64
:获取当前燃料(delta-v)。
引擎控制
accelerate(acceleration: Vec2)
:加速飞船。单位是m/s²。turn(speed: f64)
:旋转飞船。单位是弧度每秒(radians/s)。torque(acceleration: f64)
:角加速度。单位是弧度每秒平方(radians/s²)。
引擎限制
max_forward_acceleration() -> f64
:最大前进加速度。max_backward_acceleration() -> f64
:最大后退加速度。max_lateral_acceleration() -> f64
:最大横向加速度。max_angular_acceleration() -> f64
:最大角加速度。
武器
fire(index: usize)
:发射武器(枪或导弹)。aim(index: usize, angle: f64)
:瞄准武器(用于炮塔上的武器)。reload_ticks(index: usize) -> u32
:武器准备好发射前需要的时间(tick数量)。explode()
: 自毁。
雷达
在Oort中的雷达被建模为一个可以指向任何方向,且波束宽度在1/720到1/4圆周之间(驱逐舰和巡洋舰至少为1/3600)。被此波束照亮的敌舰会反射与其雷达横截面积成比例的能量(大型舰艇横截面积更大)。雷达每次扫描可以返回一个接触。雷达方向/宽度/滤波器的任何更改将在下一个扫描周期生效。
返回的接触位置和速度将具有与信号强度成反比的误差。
基本操作
set_radar_heading(angle: f64)
: 将雷达指向给定的方向。set_radar_width(width: f64)
: 调整波束宽度(以弧度为单位)。scan() → Option<ScanResult>
: 获取信号强度最高的雷达接触。struct ScanResult { position: Vec2, velocity: Vec2, class: Class }
: 由scan
返回的结构。
高级滤波
set_radar_min_distance(dist: f64)
: 设置最小距离过滤器。set_radar_max_distance(dist: f64)
: 设置最大距离过滤器。
电子对抗措施(ECM)
ECM的目标是降低敌舰雷达的有效性。要使ECM生效,敌舰雷达必须指向你的船,而你的船的雷达必须指向敌舰。当ECM启用时,雷达将不会返回接触。
EcmMode
:EcmMode::None
: 无ECM,雷达将正常工作。EcmMode::Noise
: 降低敌舰雷达的信噪比,使检测目标更加困难,并降低返回接触的精度。
set_radar_ecm_mode(mode: EcmMode)
: 设置ECM模式。
检索当前状态
radar_heading() -> f64
: 获取当前雷达方向。radar_width() -> f64
: 获取当前雷达宽度。radar_min_distance() -> f64
: 获取当前最小距离过滤器。radar_max_distance() -> f64
: 获取当前最大距离过滤器。
无线电
无线电可以用于在每个计时周期发送或接收一个[f64; 4]
消息。有10个频道可用(0到9),由所有队伍共享。
set_radio_channel(channel: usize)
: 更改无线电频道。将在下一个计时周期生效。get_radio_channel() -> usize
: 获取无线电频道。send(data: [f64; 4])
: 在一个频道上发送消息。receive() -> Option<[f64; 4]>
: 从频道接收消息。返回信号最强的消息。send_bytes(data: &[u8])
: 以字节形式在一个频道上发送消息,数据将被填充或截断到32字节长度。receive_bytes() -> Option<[u8; 32]>
: 与接收类似,但消息将以字节数组的形式返回。select_radio(index: usize)
: 选择使用后续API调用控制的无线电。驱逐舰有4个无线电,巡洋舰有8个。
特殊能力
一些船类具有独特的特殊能力。这些能力需要激活,激活后将在短时间内发挥作用,然后需要重新加载。可以通过API提前取消激活能力。如果能力被激活且从未被取消激活,则在重新加载时间过后,它将自动重新启动。
activate_ability(ability: Ability)
:激活特殊能力。deactivate_ability(ability: Ability)
:取消激活船的特殊能力。active_abilities() → ActiveAbilities
:返回船的激活能力。- 可用能力
Ability::Boost
:仅适用于战斗机和导弹。施加100 m/s²的前向加速度2秒。10秒后重新加载。Ability::Decoy
:仅适用于鱼雷。模仿巡洋舰的雷达特征0.5秒。10秒后重新加载。Ability::Shield
:仅适用于巡洋舰。防御1秒内的伤害。5秒后重新加载。
标量数学
查看Rust文档获取f64方法的完整列表。
矢量数学
二维浮点矢量(Vec2)在Oort中无处不在,用于表示位置、速度、加速度等。
vec2(x: f64, y: f64) → Vec2
:创建一个矢量。v.x, v.y → f64
:获取矢量的一个分量。v1 +- v2 → Vec2
:矢量之间的基本算术。v */ f64 → Vec2
:矢量和标量之间的基本算术。-v → Vec2
:取矢量的相反数。v.length() → f64
: 长度。v.normalize() → Vec2
: 归一化为单位向量。v.rotate(angle: f64) → Vec2
: 逆时针旋转。v.angle() → f64
: 向量的角度。v1.dot(v2: Vec2) → f64
: 点积。v1.distance(v2: Vec2) → f64
: 两个点之间的距离。
整个maths_rs包也是可用的。
调试
在UI中点击一艘船会显示状态信息,以及表示其加速度、雷达锥等的图形。您可以使用以下函数添加内容。
debug!(...)
: 添加状态文本。draw_line(v0: Vec2, v1: Vec2, color: u32)
: 绘制直线。draw_triangle(center: Vec2, radius: f64, color: u32)
: 绘制三角形。draw_square(center: Vec2, radius: f64, color: u32)
: 绘制正方形。draw_diamond(center: Vec2, radius: f64, color: u32)
: 绘制菱形。draw_polygon(center: Vec2, radius: f64, sides: i32, angle: f64, color: u32)
: 绘制正多边形。draw_text!: Vec2, color: u32, ...)
: 绘制文本。
按下 'g' 键进入调试模式也会显示所有舰船的调试图形。
杂项
current_tick() → u32
: 返回自模拟开始以来经过的tick数。current_time() → f64
: 返回自模拟开始以来经过的秒数。angle_diff(a: f64, b: f64) → f64
: 返回两个角度之间的最短(可能为负)距离。rand(low: f64, high: f64) → f64
: 获取一个随机数。seed() → u128
: 返回一个用于初始化随机数生成器的种子。scenario_name() → &str
: 返回当前场景的名称。world_size() → f64
: 返回世界的宽度(米)。id() → u32
: 返回一个舰船ID,该ID在团队内是唯一的。TICK_LENGTH
: 单个游戏tick的长度(秒)。每秒有60个tick。
额外箱子
以下箱子可用于您的代码
舰船类别
Fighter
: 小型、快速、轻装甲。- 健康值:100
- 加速度:前进:60 m/s²,横向:30 m/s²,后退:30 m/s²,角加速度:2π rad/s²
- 武器 0:枪,速度:1000 m/s,装弹:66ms
- 武器 1:导弹,装弹:5s
Frigate
: 中等大小,拥有重装甲和极其强大的主炮。- 健康值:10000
- 加速度:前进:10 m/s²,横向:5 m/s²,后退:5 m/s²,角加速度:π/4 rad/s²
- 武器 0:枪,速度:4000 m/s,装弹:2秒
- 武器 1:枪,速度:1000 m/s,装弹:66ms,可转向
- 武器 2:枪,速度:1000 m/s,装弹:66ms,可转向
- 武器 3:导弹,装弹:2s
巡洋舰
:大型、缓慢且装甲厚重。配备快速发射导弹发射器和破坏性鱼雷。- 生命值:20000
- 加速度:前进:5 m/s²,侧向:2.5 m/s²,倒退:2.5 m/s²,角加速度:π/8 rad/s²
- 武器 0:枪械,速度:2000 m/s,弹夹容量:6,装弹时间:5s,可旋转炮塔
- 武器 1:导弹,装弹时间:1.2s
- 武器 2:导弹,装弹时间:1.2s
- 武器 3:鱼雷,装弹时间:3s
导弹
:高度机动但无装甲。接触或调用explode
后爆炸。- 生命值:20
- 燃料:2000 m/s
- 加速度:前进:300 m/s²,倒退:0 m/s²,侧向:100 m/s²,角加速度:4π rad/s²
鱼雷
:装甲更好,弹头更大,但比导弹机动性差。接触或调用explode
后爆炸。- 健康值:100
- 燃料:3000 m/s
- 加速度:前进:70 m/s²,倒退:0 m/s²,侧向:20 m/s²,角加速度:2π rad/s²
依赖项
~435–640KB
~14K SLoC