本文以天涯明月刀 OL 游戏的云上之城探索玩法为例,介绍如何使用 .NET 在游戏地图中标记大量关键坐标点。

1. 背景

大概很多程序员都是喜欢玩游戏的吧,我也不例外。我们经常会看到电视剧中的各路游戏大神,要么是有只有他一个人会的骚操作,要么就是头脑堪比超算的厉害数学家,在各种紧张激烈的即时对决中公式算的飞起。对于程序员玩游戏呢,可能也有些不一样的地方吧,他们往往喜欢自己写辅助工具。不过,那些说写各种挂的,正经开发哪会这种操作啊,我看是真刑。

我主要玩的游戏是《天涯明月刀OL》端游,近期的云上之城玩法又更新了,又有一堆的地图坐标要去探索一番。唉,采集和对话应该是游戏的基本玩法吧,虽然如果不看剧情的话,是真的无聊。不过这个云上之城的剧情还可以吧,有些人生的感悟和探索,就像我一直想了解的世界的真相。

探索类玩法需要去各种隐藏的坐标点进行操作,能有一个坐标点的攻略必然是事半功倍。很幸运的是,通过天刀茶话会的攻略拿到了其整理的坐标点信息 EXCEL。但是一个个输入坐标点去探索,真的是太麻烦了。最好是能有张地图可以显示大概的位置,然后去自行规划路线一片区域一片区域的探索,这样才是探索正确的打开方式。

2. 画图思路

应该大多数游戏的地图都类似,是由一个 X 和 Y 的坐标点表示,地图的左下角为 (0,0)坐标。整个程序实现起来也没什么难度,首先整理好坐标点和标注信息,将其保存为 csv 文档,毕竟文本文件这样容易读取操作。然后使用程序打开地图图片,使用 Graphics 类的 DrawEllipse 方法在图像上绘制一个指定大小的圆,表示坐标点。

3. 地图获取

游戏中探索区域是地图的一部分,主要集中在右上角。该部分需要探索的坐标点均大于 (2000,2000),小于(4000,4000)。

首先地图使用了 2000x2000 大小的透明 PNG 作为地图,代码读取了 CSV 文件后进行左边点的绘制,在绘制坐标点时,实际的位置做了一些调整:

  • 地图的左下角为 (0,0)坐标,代码绘制时的(0,0)坐标为左上角,需要修正调整
  • 地图为部分区域位置,X 和 Y 坐标可以均减去 2000

游戏中的地图肯定不是一比一绘制的,此时我在 CSV 文件中记录了2个 NPC 的坐标点(位置已在上图用红圈圈出)记为 F1 和 F2,其在地图中也有关键标记。拿到程序运行后输出的坐标点图,然后截取游戏地图,使用 Photoshop 进行简单的处理:放大地图图层并调整位置,使其与刚刚记录的关键坐标点重合。

最后取消坐标点的图层,将文件另存就是一个 (2000,2000)到(4000,4000)坐标区间的 1:1 大小的地图了,可以使用程序直接读取,在上面绘制坐标点。

4. 代码实现

首先定义一个坐标点的类,这里需要存储 X 和 Y 坐标位置信息,还需要存储坐标点的描述信息。

class MapPoint
{public int X { get; set; }public int Y { get; set; }public string Annotation { get; set; }public MapPoint(int x, int y, string annotation){this.X = x;this.Y = y;this.Annotation = annotation;}
}

接着从 CSV 文件读取坐标点,并将其保存到坐标点列表。

// 存储坐标点的列表
List<MapPoint> points = new List<MapPoint>();// 修正坐标点,因为是地图中的一部分,所以减去一个固定的数值
int PointFix = 2000;// 读取csv文件的每一行
foreach (string line in File.ReadAllLines("points.csv"))
{// 将行解析为x、y和注释的值string[] values = line.Split(',');int x = int.Parse(values[0]);int y = int.Parse(values[1]);string annotation = values[2];// 创建坐标点对象MapPoint point = new MapPoint(x, y, annotation);// 将坐标点添加到列表中points.Add(point);
}

最后读取地图,在地图上绘制坐标信息,需要注意初始坐标点不一致的问题。

// 读取图像文件
Image image = Image.FromFile("map.png");// 创建Graphics对象
using (Graphics g = Graphics.FromImage(image))
{// 设置绘图颜色Pen pen = new Pen(Color.Red, 3);SolidBrush brush = new SolidBrush(Color.Blue);// 遍历坐标点foreach (var point in points){// 绘制坐标点g.DrawEllipse(pen, point.X - PointFix, image.Height-(point.Y - PointFix), 10, 10);// 绘制坐标点的注释g.DrawString($"({point.X},{point.Y}){point.Annotation}", new Font("Arial", 8), brush, point.X + 15 - PointFix, image.Height - (point.Y - PointFix) - 8);}
}// 保存图像
image.Save("map-with-annotations.png", ImageFormat.Png);

程序写好,当然是需要验证一下,那就跑一个采集点验证一下:

看起来位置没什么问题,接下来就可以用画图软件一片区域一片区域扫荡了和标记了。

5. 最后

完整版的代码和最终生成的地图坐标信息都放在 Github 了,地址: https://github.com/sangyuxiaowu/WuxiaYunchengMap

不说了,就这样,我去跑图收集道具了……

使用 .NET 标记游戏地图关键坐标点相关推荐

  1. echarts 折线图上标记独立坐标点

    实现下图所示功能: 在多条折线图中,给定一个独立的点坐标,在图上进行显示(图一),点击该坐标点显示该坐标的位置信息(图二) 具体实现代码: html: <div id="main&qu ...

  2. 项目记录一:用Python识别图片中指定颜色标记块并绘制其最小矩形框以及坐标点

    记录准研一小白第一次动手实践课题组师姐安排的任务,非常感谢CSDN前辈们所撰写的博客对我的帮助. 一.项目背景 如图所示,有这样一张现场勘测的图片,要实现绘制出图中三个黄色标记块的最小矩形框以及左上角 ...

  3. 计算机图形学Web前端笔记-定位并移动到指定坐标点(two.js理论及实现)

    这里先演示下效果笔记毕竟这是给理论及实践的博文. 当按下回车后 会到场景600,600中画个圆并且浏览器会移动到场景600,600的位置,并且这个位置将会是圆心. 同样,滑动滚轮进行放缩后,还是能进行 ...

  4. Pyecharts Geo在地图上添加坐标点

    Pyecharts Geo在地图上添加坐标点 添加坐标点 输入坐标点 将坐标点添加入系列并配置系列 加一点点小细节给图片美化一下 让坐标点不显示value 调整图例位置,向右靠拢 改变图例选中与非选中 ...

  5. matlab gui 鼠标选择矩形区域 返回鼠标坐标点

    1.鼠标选择矩形区域 --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, event ...

  6. 【pytorch】torch.meshgrid()==>常用于生成二维网格,比如图像的坐标点

    np.meshgrid()函数常用于生成二维网格,比如图像的坐标点. x1 ,y1 = torch.meshgrid(x,y) 输入参数: 参数是两个,第一个参数我们假设是x,第二个参数假设就是y   ...

  7. 用c++定义两个坐标点,计算两点间距离;进而计算线段的面积

    //本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...

  8. c++求两点的距离利用友元_用c++定义两个坐标点,计算两点间距离;进而计算线段的面积...

    //本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...

  9. cesium地图添加坐标点

    附上api文档链接 showPoint(){this.pointLayer= new Cesium.CustomDataSource("pointLayer");cViewer.d ...

最新文章

  1. C#多线程编程(6)--线程安全2 互锁构造Interlocked
  2. iOSUI视图面试及原理总结
  3. 变声原理:卷积和传递函数
  4. ARC_xp_20160530
  5. bzoj1923 [Sdoi2010]外星千足虫 压位+高斯消元
  6. 解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
  7. Tensorflow官方文档学习理解 (一)
  8. JDK自带的native2ascii工具完全揭密
  9. Linux: 介绍make menuconfig中的每个选项含义【转】
  10. 谷歌地图地名显示繁体字_Google Earth显示中文地名啦!
  11. 自举电容的工作原理-3句话总结
  12. 在子窗体中点击超级链接,关闭子窗体并刷新打开它的父窗体
  13. 视频编解码(一):ffmpeg编码H.264帧类型判断
  14. 八股总结(二)计算机网络与网络编程
  15. 快传号可以搬运吗,快传号搬运哪些领域容易爆文
  16. 中职计算机课题申报,中职计算机教研课题怎么申报
  17. 计算机输入法如何显示在桌面快捷方式,电脑桌面输入法图标不见了怎么办
  18. Java 和 MySQL 数据类型对照表
  19. 计算机毕业设计 移动设备的眼球追踪技术及其应用(源码+论文)
  20. 模板网站与定制网站有什么区别 定制网站好不好

热门文章

  1. 共享茶楼预订小程序开发前景
  2. Wow.js学习笔记
  3. react html编辑器,wangEditor富文本编辑器+react+antd的使用
  4. 构建完美的质量管理体系
  5. 12306官方服务器不稳定,12306官方再次出现服务器故障 无法购票
  6. android客户端经理,Teamfight Manager(团战经理)
  7. MySQL数据库创建sex字段设置男女约束
  8. 南京理工大学计算机科学与工程学院地址,南京理工大学有几个校区及校区地址...
  9. 短视频php源码,短视频平台开发,上传短视频
  10. 搜狗笔试题~求圆上的点最多可以组成多少个钝角三角形