【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)

VIP【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)
轴向坐标:以菱形网格对角方向为基准轴,记作(q, r)菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)
开通可读全文 ·973 人阅读
最低0.47元/天 解锁文章

在这里插入图片描述
在ROK、SOS、WOS等SLG游戏中,都是使用菱形瓦片(也称为斜方格或轴对称网格)进行地图布局。

它的实际角度为arctan(1/2),由于它是一个菱形,所以这里我们称它为菱形瓦片。

他的坐标系布局主要有下面两种

  • diamond
  • staggered
    在这里插入图片描述

但是我们在屏幕里的视野,就是一个标准正交坐标系,所以很多场景下我们需要进行做一个转换

在这里插入图片描述

一、坐标系定义

1. 菱形网格坐标系

  • 轴向坐标:以菱形网格对角方向为基准轴,记作 (q, r)
  • 特征参数:菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)

2. 笛卡尔坐标系

  • 标准正交坐标系,记作 (x, y)
  • 菱形网格中心点对齐笛卡尔坐标原点
    在这里插入图片描述

二、正向转换(菱形→笛卡尔)

公式:

在这里插入图片描述

几何解释:

  • 横向位移由 q 和 r 共同驱动,纵向位移由两者差值决定
  • 参数 a 为基本单位长度(例如像素尺寸)

示例:

若 a=1,菱形坐标 (3,2) 对应笛卡尔坐标:

在这里插入图片描述


三、逆向转换(笛卡尔→菱形)

公式:

在这里插入图片描述

运算步骤:

在这里插入图片描述

转换代码

// 轴向坐标系(q, r)与笛卡尔坐标系(x, y)互转
public class CoordinateConverter {
   
   
    private static final float TILE_SIZE = 64.0f; // 菱形瓦片边长
    
    // 轴向坐标转像素坐标
    public static Point2D.Float toPixel(int q, int r) {
   
   
        float x = TILE_SIZE * (q + r);
        float y = TILE_SIZE * (r - q) * 0.5f;
        return new Point2D.Float(x, y);
    }

    // 像素坐标转轴向坐标
    public static int[] toAxial(float x, float y) {
   
   
        float qf = (x / TILE_SIZE - y / (TILE_SIZE * 0.5f)) * 0.5f;
        float rf = (x / TILE_SIZE + y / (TILE_SIZE * 0.5f)) * 0.5f;
        return new int[]{
   
   Math.round(qf), Math.round(rf)};
    }
}


九宫格AOI实战

在这里插入图片描述

1. 网格划分策略

将地图划分为菱形网格,每个网格的边界由 轴向坐标范围 定义:

// 菱形网格定义
public class DiamondGrid {
   
   
    private final int qMin, qMax;  // 轴向坐标q范围
    private final int rMin, rMax;  // 轴向坐标r范围
    private final ConcurrentHashMap<Integer, Entity> entities = new ConcurrentHashMap<>(); // 网格内实体
    
    public DiamondGrid(int qMin, int qMax, int rMin, int rMax) {
   
   
        this.qMin = qMin;
        this.qMax = qMax;
        this.rMin = rMin;
        this.rMax = rMax;
    }

    // 判断坐标是否在网格内 (q, r为轴向坐标)
    public boole
VIP 【Unity进阶指南】TileMap实战:从零构建2D游戏地图 本文是Unity TileMap的实战进阶指南,详细讲解了如何从零构建2D游戏地图。文章系统拆解了Grid、Sprite、Tile等核心组件,并通过完整步骤演示了从素材准备、瓦片创建到使用Tile Palette绘制地图的全过程。掌握TileMap能极大提升2D游戏地图的编辑效率与资源复用率,是Unity开发者进阶的必备技能。 开通可读全文·393 阅读·6 点赞·4 收藏 阅读全文

相关推荐

【SLG游戏服务器开发手册】常用算法与数据结构归纳。持续更新中......

一般状态数很少的,比如常见的一些城池状态切换,我都会采用状态机。而在战斗中,状态行为过多的,最好采用行为树实现层次化、动态的决策逻辑。核心原理:基于启发式搜索(如曼哈顿距离、欧几里得距离),通过评估函数(F=G+H)平衡路径代价与目标距离,优先扩展最优节点。在游戏中,为了简化物体之间的碰撞检测运算,通常会对物体创建一个规则的几何外形将其包围。FSM 是离散的数学模型,描述对象在有限个预定义状态中的切换逻辑,每个状态对应特定行为。将地图按菱形网格分块(如32x32),服务器仅同步玩家视野内的区块数据。

代码时光 1273

Unity游戏源码 305 SLG战棋游戏

Unity游戏源码 305 SLG战棋游戏

1354

【SLG游戏服务器开发手册】沙盘地图的Scale设计

特性Zoning (分区)Offloading (卸载)核心思想水平缩放 (Scale Out):通过增加机器来分担负载。垂直解耦 (Scale Up & Decouple):通过优化架构来提升单点能力或分离职责。解决主要问题数据容量和总吞吐量。将海量地图状态分布到多台机器。热点瓶颈和系统耦合。防止单个功能拖累整体。粒度粗粒度,按地理空间划分。细粒度,按功能或数据类型划分。关系基础:没有Zoning,地图根本无法承载大量用户。优化:在Zoning的基础上,让系统变得更健壮、高效。

代码时光 1371

【Unity技术积累】代码生成菱形地图

代码生成菱形地图

weixin_55474958的博客 1264

[SpriteKit] 制作瓦片地图小游戏

SpriteKit制作瓦片地图游戏,深入了解2D游戏制作过程

findhappy117的博客 2799

深度解析 SLG 大地图地形存储与性能优化:以类“万国觉醒”为例

对于《万国觉醒》这类 SLG 的超大地图,二进制 + mmap是服务器端的标准解法。极小体积:每格 1 字节,4k地图仅需 16MB。极速加载:毫秒级启动。极高性能:O(1) 索引,纳秒级读取,无 GC 负担。Python/Java/C++ 通用:二进制结构跨语言,方便做地图编辑器工具链。

代码时光 1257

DSP28335量产升级避坑指南:C2Prog串口烧录.hex文件,为什么我推荐COM1?

本文详细解析了DSP28335量产升级中C2Prog串口烧录.hex文件的最佳实践,重点推荐使用COM1端口以确保稳定性。通过实测数据和底层机制分析,揭示了Windows系统对COM1的特殊优化及C2Prog工具的时钟切换逻辑,帮助开发者规避常见陷阱,提升烧录成功率。

weixin_27066963的博客 380

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5396

mipi协议中的calibration和scramble模式

在MIPI(Mobile Industry Processor Interface)协议中,calibration(校准)和scramble(加扰)模式是两个重要的特性,它们分别用于优化数据传输的准确性和减少信号干扰。

flomingo1的专栏 2380

Python-OpenCV及cv2,numpy库最新安装教程[最全步骤]

安装教程目录前言OpenCV-Python安装教程报错解决cv2安装numpy安装opencv安装(附加)总结 前言 首先,我知道一些看到我的Blog的人已经在网上找了很多歪路子,现在已经火冒三丈了(我也是这样过来的hhhh),那么现在,深呼吸,跟着我的教程,不要着急,每一步都要读一遍。完整安装过程需要1个小时左右(仅供参考,本人第一次安装python花了一天(确信)) OpenCV-Python...

qq_45425286的博客 7420

电力电子技术文章:ACOT控制模式在Buck变换器中的频率稳定性分析

本文深入分析了ACOT控制模式在Buck变换器中实现频率稳定性的原理与优势。通过对比传统COT模式,阐述了ACOT如何通过自适应调整导通时间,将开关频率锁定在设定值,从而有效应对输入电压与负载变化。文章还探讨了其在轻载DCM模式下的高效与平滑切换特性,并提供了关键的设计考量与实战指南。

cc789的博客 1146

实战指南:将MediaPipe封装为Windows DLL,实现C++/C#高效调用

在计算机视觉和多媒体处理领域,跨平台框架为开发者提供了强大的算法模型和计算能力。其核心原理在于通过预训练的机器学习模型和优化的计算图,实现对图像、视频流中特定目标(如人脸、手势、姿态)的实时检测与分析。这项技术的价值在于能够将复杂的AI能力模块化,降低应用开发门槛。在实际工程实践中,为了突破特定语言生态的限制并优化部署流程,开发者常需将核心功能封装成独立的库。例如,将Google的MediaPipe框架封装为Windows动态链接库(DLL),就是一个典型的工程实践。此举能有效解决语言壁垒和部署简化问题,使

weixin_28691741的博客 357

手把手教你学 Simulink (1.3)--Simulink 的模块库及其模块介绍

Simulink 提供了丰富的模块库,涵盖了从基本的信号生成和处理到复杂的数学运算和系统建模的各种功能。通过熟悉这些模块库及其模块,你可以更高效地构建和仿真动态系统。

MHD0815的博客 5147

【漏洞复现】用友U9 UMWebService.asmx 任意文件读取漏洞

用友U9存在任意文件读取漏洞,未授权的攻击者可以通过该漏洞读取服务器任意文件,造成敏感信息泄露。

qq_67810151的博客 611

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 【SLG游戏服务器开发手册】命名规范篇——英文术语关键字定义约束指南
下一篇: ThreadLocal与线程池的生死博弈:内存泄漏防御全指南

双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —
颯沓如流星
博客等级 码龄6年 434粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值