5 个版本

0.1.4 2023年6月16日
0.1.3 2023年6月14日
0.1.2 2023年6月13日
0.1.1 2023年6月12日
0.1.0 2023年6月12日

#205游戏

每月 23 次下载

MIT 许可证

165KB
3K SLoC

Workflow Status Version Maintenance

subtr-actor

subtr-actor

subtr-actor 是一个灵活的库,旨在简化与 Rocket League 回放交互和提取数据的流程。它利用强大的 boxcars 库进行解析,通过简化(或“subtracts”,正如其名称所暗示的)回放文件的底层基于演员的结构,使其更易于访问和操作。

主要组件概述

Collector 实现方式

subtr-actor 还包括 Collector 特性的实现。

示例

获取JSON

fn get_json(filepath: std::path::PathBuf) -> anyhow::Result<String> {
    let data = std::fs::read(filepath.as_path())?;
    let replay = boxcars::ParserBuilder::new(&data)
        .must_parse_network_data()
        .on_error_check_crc()
        .parse()?;
    Ok(subtr_actor::ReplayDataCollector::new()
        .get_replay_data(&replay)
        .map_err(|e| e.variant)?
        .as_json()?)
}

获取::ndarray::Array2

在下面的示例中,我们将展示如何使用boxcarsNDArrayCollectorFrameRateDecorator编写一个函数,该函数接受回放文件路径和特征添加器集合,并返回一个ReplayMetaWithHeaders以及一个::ndarray::Array2。生成的::ndarray::Array2适合在机器学习环境中使用。请注意,ReplayProcessor在此处也隐式使用,在Collector::process_replay方法中。

use subtr_actor::*;

fn get_ndarray_with_info_from_replay_filepath(
    filepath: std::path::PathBuf,
    feature_adders: FeatureAdders<f32>,
    player_feature_adders: PlayerFeatureAdders<f32>,
    fps: Option<f32>,
) -> anyhow::Result<(ReplayMetaWithHeaders, ::ndarray::Array2<f32>)> {
    let data = std::fs::read(filepath.as_path())?;
    let replay = boxcars::ParserBuilder::new(&data)
        .must_parse_network_data()
        .on_error_check_crc()
        .parse()?;

    let mut collector = NDArrayCollector::new(feature_adders, player_feature_adders);

    FrameRateDecorator::new_from_fps(fps.unwrap_or(10.0), &mut collector)
        .process_replay(&replay)
        .map_err(|e| e.variant)?;

    Ok(collector.get_meta_and_ndarray().map_err(|e| e.variant)?)
}

fn get_ndarray_with_default_feature_adders(
    filepath: std::path::PathBuf,
) -> anyhow::Result<(ReplayMetaWithHeaders, ::ndarray::Array2<f32>)> {
    get_ndarray_with_info_from_replay_filepath(
        filepath,
        vec![
            InterpolatedBallRigidBodyNoVelocities::arc_new(0.003),
            CurrentTime::arc_new(),
        ],
        vec![
            InterpolatedPlayerRigidBodyNoVelocities::arc_new(0.003),
            PlayerBoost::arc_new(),
            PlayerAnyJump::arc_new(),
            PlayerDemolishedBy::arc_new(),
        ],
        Some(30.0),
    )
}

使用NDArrayCollector::from_strings

在第二个函数中,我们看到了InterpolatedPlayerRigidBodyNoVelocities等特征添加器的使用。与subtr_actor一起提供的所有特征添加器都可以在crate::collector::ndarray模块中找到。也可以通过字符串名称访问这些特征添加器,这在实现其他语言的绑定时可能很有用,因为那些语言可能无法轻松或根本无法访问rust结构体并实例化它们。

pub static DEFAULT_GLOBAL_FEATURE_ADDERS: [&str; 1] = ["BallRigidBody"];

pub static DEFAULT_PLAYER_FEATURE_ADDERS: [&str; 3] =
    ["PlayerRigidBody", "PlayerBoost", "PlayerAnyJump"];

fn build_ndarray_collector(
    global_feature_adders: Option<Vec<String>>,
    player_feature_adders: Option<Vec<String>>,
) -> subtr_actor::SubtrActorResult<subtr_actor::NDArrayCollector<f32>> {
    let global_feature_adders = global_feature_adders.unwrap_or_else(|| {
        DEFAULT_GLOBAL_FEATURE_ADDERS
            .iter()
            .map(|i| i.to_string())
            .collect()
    });
    let player_feature_adders = player_feature_adders.unwrap_or_else(|| {
        DEFAULT_PLAYER_FEATURE_ADDERS
            .iter()
            .map(|i| i.to_string())
            .collect()
    });
    let global_feature_adders: Vec<&str> = global_feature_adders.iter().map(|s| &s[..]).collect();
    let player_feature_adders: Vec<&str> = player_feature_adders.iter().map(|s| &s[..]).collect();
    subtr_actor::NDArrayCollector::<f32>::from_strings(
        &global_feature_adders,
        &player_feature_adders,
    )
}

依赖关系

~11MB
~305K SLoC