首页 > 编程语言 >RTS游戏核心技术 流场寻路算法详解

RTS游戏核心技术 流场寻路算法详解

时间:2024-02-19 14:26:07浏览次数:20  
标签:dx cur int 路径 vector RTS 流场 寻路

 

 

 

流场寻路技术是实时战略游戏(RTS)中常用的路径规划算法,通过模拟流体在地图上的流动来为单位寻找最优路径。这种技术能够有效处理大规模地图、大量单位和动态环境变化的路径规划问题,提高游戏的实时性和可玩性。

下面详细介绍 RTS 游戏中流场寻路技术的实现步骤和关键技术点:

生成流场:

地图离散化:将地图分割成网格,每个网格表示一个位置,每个位置有一个流速向量。

初始化流场:为每个网格初始化一个流速向量,可以设定初始值或根据地形、障碍物等因素进行动态调整。

流场更新:根据地图的实时情况(如单位位置、障碍物位置)更新流场,使得流场能够动态适应环境变化。

流场更新方法包括基于力的模型(如斥力、引力)、基于梯度的模型等。

寻找路径:

路径搜索算法:使用路径搜索算法(如A*算法)在流场中搜索最优路径。

起点和终点设定:初始化起点和终点,并将起点加入到开放列表中。

节点扩展:从开放列表中选择代价最小的节点进行扩展,计算其相邻节点的代价并加入开放列表。

路径生成:根据流场中的流速向量调整路径生成的方向,使得路径更加自然和合理。

路径平滑:

路径优化:对搜索得到的路径进行优化和平滑处理,使得路径更加平滑和自然。

路径平滑方法包括B样条曲线、样条插值等。

实时更新:

流场和路径实时更新:在游戏中,流场和路径需要实时更新以适应动态环境变化。

更新策略:可以通过定时更新或事件触发更新来保持流场和路径的实时性。

碰撞检测与避障:

碰撞检测:在路径搜索和移动过程中,需要进行碰撞检测,避免单位相互碰撞或与障碍物碰撞。

避障策略:根据流场信息和碰撞检测结果,调整单位的移动方向和速度,避开障碍物。

流场寻路技术的优点在于能够处理大规模地图和大量单位的路径规划问题,能够适应动态环境变化,生成的路径更加自然和合理。然而,该技术也存在挑战,如算法复杂性较高、性能消耗较大等。

 

下面是一个更详细的C++版本的流场寻路算法示例代码: .

 

#include <iostream>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

// 定义地图大小
const int mapWidth = 10;
const int mapHeight = 10;

// 定义流速向量结构体
struct FlowVector {
int dx;
int dy;
};

// 生成流场
vector<vector<FlowVector>> generateFlowField() {
vector<vector<FlowVector>> flowField(mapWidth, vector<FlowVector>(mapHeight));

// 在这里可以根据地形、障碍物等因素来生成流场
// 这里简单地初始化为一个向右的流速向量
for (int i = 0; i < mapWidth; i++) {
for (int j = 0; j < mapHeight; j++) {
flowField[i][j].dx = 1;
flowField[i][j].dy = 0;
}
}

return flowField;
}

// 定义节点结构体
struct Node {
int x, y;
double cost;
bool operator<(const Node& other) const {
return cost > other.cost;
}
};

// A*路径搜索
vector<pair<int, int>> findPath(vector<vector<FlowVector>>& flowField, pair<int, int> start, pair<int, int> target) {
vector<pair<int, int>> path;
priority_queue<Node> pq;
vector<vector<double>> cost(mapWidth, vector<double>(mapHeight, INFINITY));
vector<vector<pair<int, int>>> parent(mapWidth, vector<pair<int, int>>(mapHeight, make_pair(-1, -1)));

pq.push({start.first, start.second, 0});
cost[start.first][start.second] = 0;

while (!pq.empty()) {
Node cur = pq.top();
pq.pop();

if (cur.x == target.first && cur.y == target.second) {
// 从终点回溯路径
pair<int, int> currPos = {cur.x, cur.y};
while (currPos != start) {
path.push_back(currPos);
currPos = parent[currPos.first][currPos.second];
}
path.push_back(start);
reverse(path.begin(), path.end());
break;
}

for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) continue;
int nx = cur.x + dx;
int ny = cur.y + dy;
if (nx >= 0 && nx < mapWidth && ny >= 0 && ny < mapHeight) {
double newCost = cur.cost + sqrt(dx*dx + dy*dy) + sqrt(flowField[cur.x][cur.y].dx*dx + flowField[cur.x][cur.y].dy*dy);
if (newCost < cost[nx][ny]) {
cost[nx][ny] = newCost;
parent[nx][ny] = {cur.x, cur.y};
pq.push({nx, ny, newCost});
}
}
}
}
}

return path;
}

int main() {
// 生成流场
vector<vector<FlowVector>> flowField = generateFlowField();

// 设置起点和终点
pair<int, int> start = make_pair(0, 0);
pair<int, int> target = make_pair(9, 9);

// 寻找路径
vector<pair<int, int>> path = findPath(flowField, start, target);

// 打印路径
for (auto p : path) {
cout << "(" << p.first << ", " << p.second << ") ";
}

 

在上述示例代码中,我们首先生成了一个简单的流场,然后使用A*算法来搜索起点到终点的最优路径。在路径搜索过程中,根据流场中的流速向量调整路径的生成方向,使得路径更加自然和合理。

希望这个更详细的示例能帮助你理解流场寻路算法的实现。 

 

标签:dx,cur,int,路径,vector,RTS,流场,寻路
From: https://www.cnblogs.com/rainy1unity/p/18020993

相关文章

  • 使用Echarts绘图
    案例1参考代码如下<!-- 此示例下载自https://echarts.apache.org/examples/zh/editor.html?c=bar-histogram--><!DOCTYPEhtml><htmllang="en"style="height:100%"><head><metacharset="utf-8"></head&g......
  • echarts自适应问题,echarts中怎么改变字体单位实现自适应
    参考文档:https://blog.csdn.net/MFWSCQ/article/details/102522944最初想着怎么给echarts设置vw单位或者rem,echart中怎么把legend的单位设置为vw或者rem来使表格自适应,后面发现行不通。项目中使用px-to-vw包,将所有px转为对应的vw,所有可以根据相同比例进行缩放,做到自适应效果。但......
  • v-if后的echarts显示已有dom解决方法
    控制台报错:Thereisachartinstancealreadyinitializedonthedom. 核心思路:先判断dom是否存在,如存在就调用销毁方法,再初始化正常操作。echarts内:if(this.myChart!=null&&this.myChart!=""&&this.myChart!=undefined......
  • 记一次 Macports 安装过程
    问题描述在官网下载了Macports的pkg安装包,安装卡在“正在运行软件包脚本”解决方案断网安装Macports安装成功后修改Macports为国内源:sudovim/opt/local/etc/macports/sources.conf注释以下内容rsync://rsync.macports.org/macports/release/tarballs/ports.tar[......
  • 对MMORTS可能存在形式的设想
    对于很多休闲玩家来说,因为缺少玩家间的互动,即时战略游戏对战模式的游戏体验不是很好,比方说很孤独、很难进步等。很多厂商都在试着解决这个问题,比如岩石壁画工作室前几年做了几款多人合作的RTS网游,再比如微软给帝国时代系列加入了大逃杀模式。但目前,这些努力达成的效果都十分有限。......
  • vue3整合echarts
    Vue3是一个流行的前端框架,而ECharts是一个功能强大的图表库。将ECharts整合到Vue3项目中可以方便地展示各种图表。以下是将ECharts整合到Vue3项目中的基本步骤:安装ECharts:使用npm或yarn安装ECharts:bash复制代码npminstallecharts--save或......
  • 2024年世界体育界的第一大丑闻:利昂内尔·梅西 (The biggest scandal in the world of s
    无德球员,梅西亲日辱华,不顾球迷感受,拒绝在中国的比赛中上场,并以所谓的伤病为借口,却在3天后的日本比赛中完全恢复如初,并进行了30分钟的高强度的对抗比赛并射门,可以说梅西的这一行径就是对中国亿万百姓的侮辱,一个不懂得尊重中国人的人比不配得到中国人的尊重。Theunethicalpla......
  • Vue中使用Echarts
    第一步:安装echarts模块cnpminstallecharts-S第二步:在main.js中全局引入importechartsfrom'echarts'Vue.prototype.$echarts=echarts//全局引入后面用this.$echarts就能直接使用了使用方式:template中<template><el-cardclass="box-card"style=&quo......
  • 华为云软件开发生产线CodeArts开发者实践8件套——开发者的进阶宝典!
    华为云软件开发生产线CodeArts是一站式DevSecOps平台,集华为多年研发实践,前沿研发理念,领先研发工程能力于一体,覆盖软件开发全生命周期,开箱即用,为您提供软件开发的一切。为帮助开发者快速上手CodeArts,我们汇聚了精品视频课程、在线动手实验、职业认证及丰富示例代码,助您扫平产品使用......
  • RTSS 降帧 减少游戏卡顿
    原理:降低帧数,减少CPU/GPU的负担,让GPU可以比较平均地产出视频帧,均匀的帧数可以减少卡顿感。使用方法:下载安装MSIAfterburnerhttps://www.msi.com/Landing/afterburner/graphics-cards(会附带RTSS)打开MSIAfterburner,设置监控功能,对应想要监控的勾选OSD选项,方便查看效果......