首页 > 其他分享 >剩余任务功能分解

剩余任务功能分解

时间:2024-10-17 11:21:12浏览次数:1  
标签:剩余 CustomConfigPath Script TEXT ConfigManager 任务 分解 GConfig MissileSimulation

航弹院项目:

  • 解决移动问题

  • 界面-图表-指令发送界面-配置等等

  • 使用套接字发送指令与图片,并且为飞机类每个人配置一个套接字用于发送指令

  • 了解一下如何获取和写入数据到GameINstance而不是在gamemode中

  • 如何直接平滑调动pawn还是没有头绪. 最坏情况下,改用character,再次测试为什么不动

  • 功能分解:

    • 指令控制功能:

      • 设计指令数据包.
      • 写到配置文件里并实时读取配置
      • 在飞机里增加套接字,用于针对性的发送指令
      • 写一个下拉菜单调用发送指令的功能
    • 实验科目功能

      • 读取配置文件,初始化实验场地
      • 在gamemode蓝图中?进行读取并放置的操作
  • 通信配置界面功能

    • 配置基础通信(基本实现)
    • 配置每架飞机的ip和端口.如何设置?动态获取飞机对象列表,然后调用其中的套接字的设置.
  • 数据显示界面

    • 接受外部信息 动力学 节点数量 需要单开一个套接字
    • 数据存在哪里?gamemode还是GameINstance?
    • 读取图片并显示
  • 一期未完成功能

    • 平滑移动 已经解决
    • 轨迹与飞机重叠
    • 卡顿问题
    • 地图问题(增加一个海洋,已有解决方案)

平滑移动问题:

  • 目前思路:
    • 所有myactor类继承到character中

    • 看看先用默认的controller类控制它们

    • 使用之前项目里的那种,计算当前位置和下一个点的向量差, 然后根据数据点之间的时间算出来一个速度,然后算出来一个vectoi加到当前的charactor上看看

    • 新建一个继承自character的类看看要补什么函数

    • 插值法

    • c++里增加四个变量和一个定时器

    • c++去实现movetolocation和updatelocation

    • 在接收到移动指令的movetotransfoembyinterp里,调用一个movetolocation,然后执行后面的update等功能

一期功能测试:

  • 场景设计
  • udp通信
  • 态势显示
  • 仿真回放 基本完成
  • 视角切换

1.三维仿真运行是实时的,和飞机导弹等同步展示
2.三维场景下的飞机只需要展示飞机的状态轨迹携带两种弹药的数量 没写这个飞机携带的弹药数量
3.弹药显示出飞行状态轨迹,自己的类型(a还是b), a还是b没有区分弹药种类
4.生成的目标具有5种类型(常见的地面目标就行,建筑坦克车辆等) 好像只写了坦克,需要增加种类
5.用不同颜色显示出地面站画出来的各种区域 实现

void UConfigManager::LoadConfig()
{
// 定义自定义配置文件路径(可以是项目的Config目录下)
FString CustomConfigPath = FPaths::ProjectConfigDir() / TEXT("CustomConfig.ini");

// 使用 FConfigCacheIni 读取自定义配置文件
GConfig->LoadFile(CustomConfigPath);

// 从自定义配置文件中读取数据
GConfig->GetString(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("LocalIP"), LocalIP, CustomConfigPath);
GConfig->GetString(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("MulticastIP"), MulticastIP, CustomConfigPath);
GConfig->GetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("Port"), Port, CustomConfigPath);
GConfig->GetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("MultiPort"), MultiPort, CustomConfigPath);


GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("LatitudeOffset"), LatitudeOffset, CustomConfigPath);
GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("LongitudeOffset"), LongitudeOffset, CustomConfigPath);
GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("Scale"), GeoScale, CustomConfigPath);

GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("XOffset"), XOffset, CustomConfigPath);
GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("YOffset"), YOffset, CustomConfigPath);
GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("ZOffset"), ZOffset, CustomConfigPath);
GConfig->GetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("XYZScale"), XYZScale, CustomConfigPath);



GConfig->GetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("AircraftCount"), AircraftCount, CustomConfigPath);
GConfig->GetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("MissileCount"), MissileCount, CustomConfigPath);
AircraftConfigs.Empty();

// 读取每个飞机的配置
for (int32 i = 1; i <= AircraftCount; ++i)
{
    FString SectionName = FString::Printf(TEXT("Aircraft_%d"), i);
    int32 ID, Type;
    FString PositionStr, RotationStr;
    FVector Position;
    FRotator Rotation;

    GConfig->GetInt(*SectionName, TEXT("ID"), ID, CustomConfigPath);
    GConfig->GetInt(*SectionName, TEXT("Type"), Type, CustomConfigPath);
    GConfig->GetString(*SectionName, TEXT("Position"), PositionStr, CustomConfigPath);
    GConfig->GetString(*SectionName, TEXT("Rotation"), RotationStr, CustomConfigPath);

    FDefaultValueHelper::ParseVector(PositionStr, Position);
    FDefaultValueHelper::ParseRotator(RotationStr, Rotation);

    FAircraftConfig NewConfig = { ID, Type, Position, Rotation };
    AircraftConfigs.Add(NewConfig);
}

}

void UConfigManager::SaveConfigToFile()
{
// 定义自定义配置文件路径(可以是项目的Config目录下)
FString CustomConfigPath = FPaths::ProjectConfigDir() / TEXT("CustomConfig.ini");

// 使用 FConfigCacheIni 读取自定义配置文件
GConfig->LoadFile(CustomConfigPath);
// 写入网络配置
GConfig->SetString(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("LocalIP"), *LocalIP, CustomConfigPath);
GConfig->SetString(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("MulticastIP"), *MulticastIP, CustomConfigPath);
GConfig->SetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("Port"), Port, CustomConfigPath);
GConfig->SetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("MultiPort"), MultiPort, CustomConfigPath);

// 写入地图设置
GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("LatitudeOffset"), LatitudeOffset, CustomConfigPath);
GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("LongitudeOffset"), LongitudeOffset, CustomConfigPath);
GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("Scale"), GeoScale, CustomConfigPath);

GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("XOffset"), XOffset, CustomConfigPath);
GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("YOffset"), YOffset, CustomConfigPath);
GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("ZOffset"), ZOffset, CustomConfigPath);
GConfig->SetFloat(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("XYZScale"), XYZScale, CustomConfigPath);

// 写入飞机数量
GConfig->SetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("AircraftCount"), AircraftCount, CustomConfigPath);
GConfig->SetInt(TEXT("/Script/MissileSimulation.ConfigManager"), TEXT("MissileCount"), MissileCount, CustomConfigPath);


// 写入每个飞机的配置
for (int32 i = 1; i <= AircraftCount; ++i)
{
    FString SectionName = FString::Printf(TEXT("Aircraft_%d"), i);
    const FAircraftConfig& Config = AircraftConfigs[i - 1];

    GConfig->SetInt(*SectionName, TEXT("ID"), Config.ID, CustomConfigPath);
    GConfig->SetInt(*SectionName, TEXT("Type"), Config.Type, CustomConfigPath);

    FString PositionStr = FString::Printf(TEXT("%f,%f,%f"), Config.Position.X, Config.Position.Y, Config.Position.Z);
    FString RotationStr = FString::Printf(TEXT("%f,%f,%f"), Config.Rotation.Pitch, Config.Rotation.Yaw, Config.Rotation.Roll);

    GConfig->SetString(*SectionName, TEXT("Position"), *PositionStr, CustomConfigPath);
    GConfig->SetString(*SectionName, TEXT("Rotation"), *RotationStr, CustomConfigPath);
}

// 保存配置到文件
GConfig->Flush(false, GGameIni);

}

点击查看代码


import socket
import struct
import math
import time
from threading import Timer

# UDP 目标 IP 和端口
TARGET_IP = "192.168.1.105"
TARGET_PORT = 12345

# 创建 UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 导弹编队行列数
formation_rows = 10
formation_columns = 10

# 导弹数量和单包数量
total_missiles = formation_rows * formation_columns
MissileCount = 25  # 每个 UDP 包内发送的导弹数量

# 导弹生成,每个导弹的初始位置按照网格排列
config = {
    'missiles': [
        {
            'id': i * formation_columns + j + 1,
            'valid': 1,
            'movement': 'straight',
            'center': (i * 200, j * 200),  # 网格排列
            'speed': 2000,
            'start_altitude': 1500
        }
        for i in range(formation_rows)
        for j in range(formation_columns)
    ],
    'delays': {
        'missile_spawn': 3  # 导弹生成延迟时间(秒)
    }
}


def send_missile_data_batch(missiles, t):
    packet_data = b''

    for missile in missiles:
        center_x, center_y = missile['center']
        x = center_x + 0
        y = center_y + t * missile['speed']
        z = missile['start_altitude']  # 初始高度保持
        state = 1  # 发射中

        # 如果导弹有效,加入数据包
        if missile['valid'] == 1:
            data = struct.pack('=BBBBddd', 2, missile['id'], 0, state, x, y, z)
            packet_data += data

        # 如果数据包已满(即包含25个导弹),则发送
        if len(packet_data) >= MissileCount * struct.calcsize('=BBBBddd'):
            sock.sendto(packet_data, (TARGET_IP, TARGET_PORT))
            packet_data = b''

    # 发送剩余未满25导弹的数据包
    if packet_data:
        sock.sendto(packet_data, (TARGET_IP, TARGET_PORT))


def main():
    start_time = time.time()

    def spawn_missiles():
        while True:
            t = time.time() - (start_time + config['delays']['missile_spawn'])
            if t >= 0:
                for i in range(0, len(config['missiles']), MissileCount):
                    missile_batch = config['missiles'][i:i + MissileCount]
                    send_missile_data_batch(missile_batch, t)
            time.sleep(0.2)

    # 启动导弹生成计时器
    missile_timer = Timer(config['delays']['missile_spawn'], spawn_missiles)
    missile_timer.start()

    # 主循环运行
    while True:
        time.sleep(0.2)


if __name__ == "__main__":
    main()

标签:剩余,CustomConfigPath,Script,TEXT,ConfigManager,任务,分解,GConfig,MissileSimulation
From: https://www.cnblogs.com/aultcarius/p/18461324

相关文章

  • 基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
    本文探讨了Python脚本与动态模态分解(DMD)的结合应用。我们将利用Python对从OpenFOAM模拟中提取的二维切片数据进行DMD计算。这种方法能够有效地提取隐藏的流动模式,深化对流体动力学现象的理解。使用开源CFD软件OpenFOAM,有两种方法可以对CFD数据进行DMD计算。第一种方法是直接......
  • 数模创新算法篇 | 基于CEEMDAN分解与LSTM模型的电力负荷预测
    目录 废话不多说,直接上目录问题背景与理论1.长短期记忆网络(LSTM)理论2.CEEMDAN分解理论3.LSTM与CEEMDAN结合的优势4.应用场景与前景Python代码实操导入库和准备数据备注定义数据整理函数定义LSTM模型构建函数数据处理和模型训练评估模型性能绘制预测结果图......
  • C#线程4---Task(任务并行库TPL)
     简介:   线程池的优势与不足:使用线程池可以使我们在减少并行度花销时节省操作系统资源。我们可以认为线程池是一个抽象层,其向程序员隐藏了使用线程的细节,使我们专心处理程序逻辑,而不是各种线程问题。但使用线程池也相当复杂。从线程池的工作者线程中获取结果并不容易。......
  • Python vs Java:爬虫任务中的效率比较
    爬虫技术作为一种自动化的数据采集手段,广泛应用于数据挖掘、信息聚合、内容监控等多个领域。Python和Java是两种流行的编程语言,它们都可以用来开发高效的爬虫程序。本文将探讨Python和Java在爬虫任务中的效率,并展示如何在代码中设置代理信息以提高爬虫的可用性和安全性。......
  • 模板-质因子分解
    版本1:求n的所有质因子,时间复杂度O(sqrt(n))。//例如:12=2*2*3,那么//factor(12,1)=>{2,3}//factor(12,0)=>{2,2,3}std::vector<int>factor(intn,intremoveDup){std::vector<int>ans;for(inti=2;i<=n/i;i++){while(n%i......
  • java模拟量子加密,特别是基于量子密钥分发(QKD)的加密,是一种利用量子力学原理来保证信息
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)java模拟量子......
  • 基于离群点修正、优化分解和DLinear模型的多步风速预测方法
    翻译与总结:基于离群点修正、优化分解和DLinear模型的多步风速预测方法翻译:本文提出了一种结合离群点修正、启发式算法、信号分解方法和DLinear模型的混合风速预测模型。该模型包括三个主要步骤:首先,通过 HampelIdentifier(HI) 检测并替换风速序列中的离群点,以减少其对预测......
  • 【web服务】耗时任务基于API与worker模式
    场景:当我们爬虫或者获取数据需要很长的时间计算或者等待,这种情况情况下基于API与worker模式完成交付1.API端:用flask框架importjsonimportuuidimportredisfromflaskimportFlask,request,jsonifyapp=Flask(__name__)pool=redis.ConnectionPool(host='127.0.0......
  • Win11经常自动弹出任务栏怎么办
    Win11经常自动弹出任务栏怎么办?我们有时候在使用Win11系统的电脑玩游戏的时候会经常碰到任务栏自动弹出来,这样不仅会大大的影响游戏的体验感,还影响电脑的使用,那么我们遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧。Win11自动弹出任务栏的解决方法方法......
  • 【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
    @目录一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost分类损失函数5、样本权重更新6、AdaBoost的强分类器(二)回归算法基本思路1、最大误差的计算2、相对误差计算3、误差损失调整4、权重系数计算5、更新样本......