游戏视野计算

游戏地图是矩形的,将矩形分割成一个个紧邻的大小相等的方形格子,地图中每个对象必然归属于一个格子,每个格子维护了在这个格子里的所有对象。
将每个格子都放入从左下角到右上角的坐标系,设横轴是x,纵轴是y。
假设地图中所有格子共有row行,column列,那左下角格子的坐标是(0,0),右上角格子的坐标是(column-1,row-1)。

现在有1个对象,要搜集它视野中(也就是与之在一定距离内)的所有对象。
因为对象是用格子管理的,可以先搜集其所在格子周围的格子,然后再判断这些格子里的对象与之的距离是不是在视野距离内。

每个格子周围的格子与其的偏移量都是相同的,可以先算出周围所有格子的偏移量来,确定某个格子后就可以快速计算出周围所有格子的坐标了。
可以用这段程序来计算偏移:

struct offset_node
{int offx;int offy;offset_node(int x, int y):offx(x), offy(y){}
};// vision表示视野有几个格子(的边长)
// offsets中依次是由内而外视野内所有格子相对于当前格子的偏移
void build_offsets(std::vector<offset_node> offsets, const int vision)
{assert(vision > 0);offsets.clear();for(int i=1; i<=vision; ++i){for(int j=-i; j<i; ++j){offsets.emplace_back(j, -i);offsets.emplace_back(i, j);offsets.emplace_back(-j, i);offsets.emplace_back(-i, -j);}}
}

这段程序可以直观的展示计算过程:

void show_neighbors(const int vision)
{constexpr int N = 11; // 地图是NxN的assert(N>0 && N%2 ==1);assert(vision > 0 && vision <= N/2);char **p = new char*[N];for(int i=0; i<N; ++i){char *tmp = new char[N];for(int j=0; j<N; ++j)tmp[j] = '-';p[i] = tmp + N/2;}p += N/2;p[0][0] = 'X'; // 中心位置auto show = [p, N]{int half = N/2;for(int y=half; y>=-half; --y){for(int x=-half; x<=half; ++x)cout << p[x][y] << ' ';cout << endl;}cout << endl;};for(int i=1; i<=vision; ++i){for(int j=-i; j<i; ++j){char c = j + i + '1';p[j][-i] = c;show();p[i][j] = c;show();p[-j][i] = c;show();p[-i][-j] = c;show();}}
}

获得周围所有格子的坐标后,还要检查一下每个格子是不是超过了地图的范围:

// (from_x,from_y)是起始格子的坐标
bool check_grid_valid(int rows, int columns, int from_x, int from_y, const offset_node &offset)
{int x = from_x + offset.offx;if(x < 0 || x >= columns) return false;int y = from_y + offset.offy;if(y < 0 || y >= rows) return false;return true;
}

有时候地图格子数量比较少比如3x2(3行2列),视野距离是3的话,完整视野应是7x7的方形,但实际上x方向视野1,y方向视野2就够了,总视野5x3就可以了。可以对build_offsets函数进行一点改动:

void build_offsets(std::vector<offset_node> offsets, const int rows, const int columns, const int vision)
{assert(vision > 0);offsets.clear();auto insert = [&offsets,rows,columns](int x, int y){if(std::abs(x)<columns && std::abs(y)<rows){offsets.emplace_back(x, y);return true;}return false;};for(int i=1; i<=vision; ++i){if(i >= std::max(rows, columns)) break;for(int j=-i; j<i; ++j){insert(j, -i);insert(i, j);insert(-j, i);insert(-i, -j);}}
}

这个过程同样可以比较直观的展示出来:

void show_neighbors(const int rows, const int columns, const int vision)
{constexpr int N = 21;assert(N>0 && N%2 ==1);assert(vision > 0 && vision <= N/2);assert(rows > 0 && rows <= N-2 && columns > 0 && columns <= N-2);char **p = new char*[N];for(int i=0; i<N; ++i){char *tmp = new char[N];for(int j=0; j<N; ++j)tmp[j] = '.';p[i] = tmp + N/2;}p += N/2;p[0][0] = 'X'; // 中心位置auto show = [p, N]{int half = N/2;for(int y=half; y>=-half; --y){for(int x=-half; x<=half; ++x)cout << p[x][y] << ' ';cout << endl;}cout << endl;};auto set = [p,rows,columns](int x, int y){if(std::abs(x)<columns && std::abs(y)<rows){p[x][y] = '*';}else p[x][y] = '-';};for(int i=1; i<=vision; ++i){if(i >= std::max(rows, columns)) break;for(int j=-i; j<i; ++j){set(j, -i);show();set(i, j);show();set(-j, i);show();set(-i, -j);show();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维高级-day01

shell回顾 1、快速生成版权控制信息&#xff0c;具体的内容自己替换 [root scripts]# cat ~/.vimrc autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" func SetTitle() if expand("%:e") sh call setline(1,"#!/bin/bash")…

python:傅里叶分析,傅里叶变换 FFT

使用python进行傅里叶分析&#xff0c;傅里叶变换 FFT 的一些关键概念的引入&#xff1a; 1.1.离散傅里叶变换&#xff08;DFT&#xff09; 离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&…

go模版引擎的使用~~

go模板语句 以下是一些go语言模板引擎的一些简单知识和使用 基础语法 重要&#xff01;&#xff01;&#xff01;&#xff1a; 模板在写动态页面的网站的时候&#xff0c;我们常常将不变的部分提出成为模板&#xff0c;可变部分通过后端程序的渲染来生成动态网页&#xff0…

上手 Promethus - 开源监控、报警工具包

名词解释 Promethus 是什么 开源的【系统监控和警报】工具包 专注于&#xff1a; 1&#xff09;可靠的实时监控 2&#xff09;收集时间序列数据 3&#xff09;提供强大的查询语言&#xff08;PromQL&#xff09;&#xff0c;用于分析这些数据 功能&#xff1a; 1&#xff0…

Java Web——XML

1. XML概述 XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。XML是一种用于存储和传输数据的语言&#xff0c;它使用标签来标记数据&#xff0c;以便于计算机处理和我们人来阅读。 “可扩展”三个字表明XML可以根据需要进行扩展和定制。这意味…

【LeetCode】485. 最大连续1的个数

485. 最大连续1的个数 难度&#xff1a;简单 题目 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最…

ubuntu+Teslav100 环境配置

系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 产看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…

如何解决React子组件中的逻辑很多影响父组件回显速度的问题

前言 更新状态导致重新渲染时&#xff0c;由于子组件中的逻辑很多&#xff0c;影响到父组件的回显速度。 React18之前&#xff0c;由于渲染是同步的&#xff0c;一旦开始渲染&#xff0c;就不可被中断&#xff0c;所谓的同步&#xff0c;就是指如果react的某个组件执行时间长…

MyBatisPlus入门介绍

目录 一、MyBatisPlus介绍 润物无声 效率至上 丰富功能 二、Spring集成MyBatisPlus 三、SpringBoot集成MyBatisPlus 一、MyBatisPlus介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c…

Kafka系列 - Kafka一篇入门

Kafka是一个分布式流式处理平台。很多分布式处理系统&#xff0c;例如Spark&#xff0c;Flink等都支持与Kafka集成。 Kafka使用场景 消息系统&#xff1a;Kafka实现了消息顺序性保证和回溯消费。存储系统&#xff1a;Kafka把消息持久化到磁盘&#xff0c;相比于其他基于内存的…

如何处理git多分支

本篇文章主要处理以下两种多分支问题 如何将自己在本地的修改上传到一个新的Git分支&#xff08;比如用于测试&#xff0c;不合并进main分支&#xff09;&#xff1f;如何在一个新的本地仓库拉取一个项目的非main分支&#xff0c;并处理他们关联关系&#xff1f; 1. 将自己在…

java基于springboot公益帮学网站 新闻发布系统的设计与实现vue

以Java为开发平台&#xff0c;综合利用Java Web开发技术、数据库技术等&#xff0c;开发出公益帮学网站。用户使用版块&#xff1a;可以选择注册并登录&#xff0c;可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块&#xff1a;以管理员身份登录网站后台…

C# 读写FDX-B(ISO11784/85)动物标签源码

本示例使用的发卡器&#xff1a;EM4305 EM4469 ISO11784/85协议125K低频FXD-B动物标签读写发卡器-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using S…

rk3588配置uac功能,android13使能uac及adb的复合设备

最近&#xff0c;因新增需求需要在现有产品上增加UAC的功能&#xff0c;查阅并学习相关知识后&#xff0c;在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。 1.技术可行性预研 &#xff08;1&#…

【一起来学kubernetes】7、k8s中的ingress详解

引言配置示例负载均衡的实现负载均衡策略实现模式实现方案Nginx类型Ingress实现Treafik类型Ingress实现HAProxy类型ingress实现Istio类型ingress实现APISIX类型ingress实现 更多 引言 Ingress是Kubernetes集群中的一种资源类型&#xff0c;用于实现用域名的方式访问Kubernetes…

人工智能-注意力机制之残差连接和层规范化

残差连接和层规范化 层规范化和批量规范化的目标相同&#xff0c;但层规范化是基于特征维度进行规范化。尽管批量规范化在计算机视觉中被广泛应用&#xff0c;但在自然语言处理任务中&#xff08;输入通常是变长序列&#xff09;批量规范化通常不如层规范化的效果好。 以下代…

自建私有化证书颁发机构(Certificate Authority,CA)实战之 《0x02 Nginx 配置 https双向认证》

自建CA实战之 《0x02 Nginx 配置 https双向认证》 上一章节我们已经实现了Nginx上配置https单向认证&#xff0c;主要场景为客户端验证服务端的身份&#xff0c;但是服务端不验证客户端的身份。 本章节我们将实现Nginx上配置https双向认证&#xff0c;主要场景为客户端验证服…

C++ 实现位图

引出 面试题&#xff1a;给出 40 亿个不重复的无符号整数&#xff0c;没有排过序。给定一个无符号整数&#xff0c;如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一&#xff1a;将 40 亿个数据存放到 set 里面&#xff0c;然后再查找指定的无符号整数。…

Python基础入门例程75-NP75 使用字典计数(字典)

最近的博文: Python基础入门例程74-NP74 字典新增(字典)-CSDN博客 Python基础入门例程73-NP73 查字典(字典)-CSDN博客 Python基础入门例程72-NP72 生成字典(字典)-CSDN博客 目录 最近的博文:

论文阅读——MCAN(cvpr2019)

补充一下MCAN-VQA&#xff1a; 对图片的处理&#xff1a;首先输入图片到Faster R-CNN&#xff0c;会先设定一个判断是否检测到物体的阈值&#xff0c;这样动态的生成m∈[10,100]个目标&#xff0c;然后从检测到的对应的区域通过平均池化提取特征。第i个物体特征表示为&#xff…