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

简介: 本文以天涯明月刀 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

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

相关文章
|
芯片 内存技术
【STM32 .Net MF开发板学习-10】SPI测试之触摸屏坐标获取
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)
677 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(六)流光追影
  依稀记得《奇迹》里为了让装备炫酷“流光”而砸锅卖铁;仍旧迷恋每次的跳跃、冲刺、特写所带来的动态“追影”。岁月流淌,让无数玩家无论花费多少时间与金钱都无怨无悔,依旧那天地合一之特性装备;手握幻象残光之溢彩神器,踏着御风而行的随影擦肩而过,陶醉的不仅仅是自己,亦绝非寂寞.
1030 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(七)动画特写
  Silverlight中的HLSL不仅适用于场景与动画渲染,对于游戏中的角色,我们同样可以利用它制作动画特写。较常见的比如角色传送时的淡入淡出、扭曲变形、幻化呈现等切换动画,当然还有例如角色被DeBuff时所表现出来的放大缩小以及虚弱时的不规则体形等。
891 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(九)粒子系统
  粒子系统通常用于三维场景中进行真实环境模拟,比如第四节的天气系统。天气的实现是粒子系统最重要的应用领域之一,所有的一切无论是云、雨、雾,还是落叶、陨石及闪电,都可视作基础粒子;除此之外,游戏中常常还会用到粒子系统来渲染像发光、轨迹等抽象效果。
912 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(十)空间分层战斗系统
  提到RPG中的空战系统,首先想到的当然是3D,这方面可是它的绝活。比如以之为核心噱头的《永恒之塔》;当然,在2.5D网游中也有着类似的实现,像《西游记Online》,不过该游戏的空战仅仅是将战场(场景)变换到了空中而已,地面呈现的仅是会动的背景,类似的功能其实早就已出现在《大话西游》系列等著名的2D游戏中。
1032 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(十二)魔法系统
  世界首款Silverlight – MMORPG:震撼登场!伴着与XNA合体后的Silverlight 5 强势发布,一波Silverlight网游研发海啸即将席卷全球!    多磨的好事依旧让人激动,于是一不小心写下10款全新的魔法效果旨在祝贺。
1059 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(五)圣赞之HLSL渲染动画
  或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供Direct3D使用。Silverlight无比幸运,从第二个版本开始便已获得了这把旷世利器,虽然目前仅能发挥其不到3层之功力,不过前辈Moonlight近期已向世界宣布全面突破技术壁垒,HLSL的威力提升至7层左右。
1104 0
一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(四)天气系统
  如同动态光影一样,天气系统同样为2.5D RPG游戏所不可或缺的元素之一。从视觉角度讲,天气系统让游戏场景空间层次分明,立体感更强;从用户角度讲,天气系统赋予游戏更贴近现实的亲历体验,试想下游戏中的花花草草随风而动,云雾缭绕风雨雷电一切来得自然而平滑,玩家即似身临其境般享受;从功能角度讲,不同的气候状况会对角色及魔法效果产生各异影响,极大的提升游戏趣味性。
1233 0
一起谈.NET技术,Silverlight 游戏开发小技巧:传说中的透视跑马灯
  昨夜元宵佳节,各种灯会热闹非凡,伴随烟火灿烂好不热闹,可惜一点也没看着T_T,那就写一个跑马灯吧,可是跑马灯并不稀奇,各位高手们已经写过而且都各有特点,所以,写也要写点有特色的才好,游戏中经常能看到一种带有透视的选人界面,上次写的是一个固定效果,那么这次带上点动画,结合一个Silverlight的MVC开发小技巧快速完成它。
926 0
一起谈.NET技术,Silverlight 游戏开发小技巧:昼夜交替动画
  记得在WP7上玩一个游戏有段动画很有趣,是背景在进行昼夜交替,一会儿白天太阳出来白天了,一会儿月亮蹦出来夜晚了,在以前做C++程序的时候曾经实现过类似的效果,今天早上移植了一下到Silverlight当中效果还是不错,当然了,有了Blend神器,就完全不用通过代码的方式实现,真的方便了很多。
1077 0