绘制等距游戏世界

技术标签: 2D.  等距

在2D游戏中绘制等距瓷砖的正确方法是什么?

我读过参考文献(例如 这个)这表明Tiles以在地图的2D阵列表示中ZAG ZAG的方式呈现。我想他们应该以钻石时尚绘制更多,那里被绘制到屏幕的内容更接近2D阵列看起来像什么,刚刚旋转一点。

任一方法是否有优点或缺点?

看答案

更新:纠正映射呈现算法,添加了更多的插图,更改了格式化。

也许是“Zig-zag”技术来映射到屏幕的“Zig-zag”技术的优势可以说瓷砖的 xy 坐标位于垂直和水平轴上。

“用钻石画画”方法:

通过使用“钻石中的绘图”绘制等距图,我认为是指通过使用嵌套呈现地图 for - 播充在二维阵列上,例如此示例:

tile_map[][] = [[...],...]

for (cellY = 0; cellY < tile_map.size; cellY++):
    for (cellX = 0; cellX < tile_map[cellY].size cellX++):
        draw(
            tile_map[cellX][cellY],
            screenX = (cellX * tile_width  / 2) + (cellY * tile_width  / 2)
            screenY = (cellY * tile_height / 2) - (cellX * tile_height / 2)
        )

优势:

这种方法的优势在于它是一个简单的嵌套 for - 相当直的前向逻辑,整个瓷砖始终工作。

坏处:

这种方法的一个缺点是 xy 地图上的划线的坐标将在对角线上增加,这可能会使屏幕上的位置映射到表示为阵列的地图更难以使屏幕上的位置更加困难:

Image of tile map

但是,实现上述示例代码的缺陷 - 渲染顺序将导致要在面部顶部的图块顶部绘制的特定图块后面的图块:

Resulting image from incorrect rendering order

为了修改这个问题,内在 for-loop的订单必须颠倒 - 从最高值开始,并呈现为较低的值:

tile_map[][] = [[...],...]

for (i = 0; i < tile_map.size; i++):
    for (j = tile_map[i].size; j >= 0; j--):  // Changed loop condition here.
        draw(
            tile_map[i][j],
            x = (j * tile_width / 2) + (i * tile_width / 2)
            y = (i * tile_height / 2) - (j * tile_height / 2)
        )

通过上述修复,应纠正地图的渲染:

Resulting image from correct rendering order

“Zig-ZAG”方法:

优势:

也许“Zig-ZAG”方法的优势在于,渲染的地图可能看起来比“钻石”方法更垂直紧凑:

Zig-zag approach to rendering seems compact

坏处:

从尝试实现Zig-ZAG技术,缺点可能是写入渲染代码有点难以,因为它不能写入简单的嵌套 for - 在数组中的每个元素遍历:

tile_map[][] = [[...],...]

for (i = 0; i < tile_map.size; i++):
    if i is odd:
        offset_x = tile_width / 2
    else:
        offset_x = 0

    for (j = 0; j < tile_map[i].size; j++):
        draw(
            tile_map[i][j],
            x = (j * tile_width) + offset_x,
            y = i * tile_height / 2
        )

此外,由于渲染顺序的交错性质,尝试弄清楚瓦片的坐标可能有点困难:

Coordinates on a zig-zag order rendering

注意:在此答案中包含的插图是以呈现的图形渲染代码的Java实现创建,其中包含以下内容 int 数组作为地图:

tileMap = new int[][] {
    {0, 1, 2, 3},
    {3, 2, 1, 0},
    {0, 0, 1, 1},
    {2, 2, 3, 3}
};

瓷砖图像是:

  • tileImage[0] -> 一个盒子里面有一个盒子。
  • tileImage[1] -> 一个黑匣子。
  • tileImage[2] -> 一个白色的盒子。
  • tileImage[3] -> 一个盒子里有一个高大的灰色物体。

有关瓷砖宽度和高度的注释

变量 tile_widthtile_height 用于上面的代码示例中使用的是指代表图块的图像中的地块的宽度和高度:

Image showing the tile width and height

只要图像尺寸和瓦片尺寸匹配,使用图像的尺寸就会起作用。否则,可以在图块之间使用间隙呈现瓷砖地图。


智能推荐

《游戏改变世界》读后感

作为一个沉迷游戏多年的玩家。突然明白了原来我们喜欢玩游戏竟然是因为: 1,喜欢挑战 在现实世界中其实早就充满挑战。我们可以尝试挑战更难的工作,更快的速度。并且紧跟满是变化的世界。 2,强而有力的社交联系 就像跟别人分享自己的知识 跟朋友一起攻克的难关。跟同事一起完成的工作。 3‘’有明确的目标,规则,反馈机制。 因此我们可以自己制定规则:看一本书给自己的加分,以及达到一定积...

WOW游戏世界浏览器

作为研究MMORPG类型的3D网游戏来说,WOW肯定是首选的.主要是因为国内外对其进行**的大有人在,相应的美工社区,论坛,也是一搜一大片,有这么多热心的研究者,能大大节省一个人**一款游戏的时间.但是要想仿出该游戏的带显示的真正客户端确不是件容易的事,韩国人一般常用成熟的游戏引擎作游戏,因此,要想山寨这样的客户端,你本身也要是一个 3D客户端程序员,引擎程序也要熟练掌握,然后就是对其资源的格式进...

利用R语言绘制世界航班路线图

作者简介Introduction taoyan:伪码农,R语言爱好者,爱开源。 个人博客: https://ytlogos.github.io/ 公众号:生信大讲堂 往期回顾 R语言可视化学习笔记之相关矩阵可视化包ggcorrplot R语言学习笔记之相关性矩阵分析及其可视化 ggplot2学习笔记系列之利用ggplot2绘制误差棒及显著性标记 ggplot2学习笔记系列之主题(them...

原型对象,原型链

函数都有prototype属性,它指向原型对象。 实例对象有__proto__属性,它指向对象原型 每一个原型对象都有constructor输赢,指向构造函数,每一个原型对象又具有__proto__属性,这个指向Object.prototype.在这里插入图片描述...

Node 调用 dubbo 服务的探索及实践

2.Dubbo简介 2.1 什么是dubbo Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 2.2 流程图 Provider : 暴露服务的服务提供方。 Consumer : 调用远程服务的服务消费方。 Registry : 服务注册与发现的注册中心。 Monito...

猜你喜欢

mysql总结

mysql基础入门的总结     关于数据库:     数据库是软件开发人员要掌握的基本工具,软件的运行的过程就是操作数据的过程,数据库中的数据无非就是几个操作:增-删-查-改。         Mysql安装完成后,需要配置变量环境,找到配置路径path,然后把mysql安装目录bin文件导入就可以了。 然后运行cm...

adb及monkey常用命令

adb常用命令: 查看手机是否连接:adb devices   连接设备:adb connect 设备ip:端口号  若有连接多个设备需指明设备ip及端口号 安装APP:adb install [-r] 包名  -r表示覆盖安装,首次安装可省略 卸载APP:adb uninstall 包名 列出设备中所有应用包名:adb shell pm list packages ...

PC端浏览器如何设置无图模式

以谷歌浏览器为例,注意有些浏览器并不支持该功能。 1)打开自定义与控制 2)选择设置 3)查看左边状态栏,选择高级设置--》隐私设置和安全性 4)选择内容设置 5)图片 6)选择不显示任何图片,其中也可以只禁用某些网站图片,或者只开启自己想显示图片的网站...

2021-06-08

IDEA中使用springMVC 出现 404请求的资源不可用的其他一个可能原因 如果你确认你在视图解析器中的路径设置没有问题,各种文件名都没问题,却依然出现资源不可用错误 你可以检查这个页面中是否为web部署了工件,没有的话部署一下就好了。...

树莓派连接wifi个人热点和远程windows远程登录

1.安装完系统后在该目录下新建wpa_supplicant.conf文件填入以下信息 ssid是wifi名字 psk是wifi密码 priority:连接优先级,数字越大优先级越高 2.插入sd卡开机自动连接 3.利用ssh登陆树莓派 4. 输入命令 sudo apt-get install xrdp 安装 5.利用windows远程桌面登陆   6.输入登陆用户名密码,完成...

问答精选

Correctly formatting GCM notifications?

I'm currently trying out the google cloud messaging service with its sample application "Guestbook." https://developers.google.com/cloud/samples/mbs/ I'm attempting to send notifications tha...

Are there any performance benefits of using Asynchronous functions over Synchronous in Node Js?

Now I came across an article that distinguishes between an Asynchronous function and Synchronous functions. From my understanding of the different examples and explanations, synchronous functions are ...

Python: Costing calculator output

Good day all I'm busy creating a small costing calculator for the signage department. I'm not getting the calculator to output the amount. Brief Description: You enter the height and width and then wh...

Flask-SQLAlchemy - model has no attribute 'foreign_keys'

I have 3 models created with Flask-SQLalchemy: User, Role, UserRole role.py: user.py: user_role.py: If I try (in the console) to get all users via User.query.all() I get AttributeError: 'NoneType' obj...

Seeding many PRNGs, then having to seed them again, what is a good quality approach?

I have many particles that follow an stochastic process in parallel. For each particle, there is a PRNG associated to it. The simulation must go through many repetitions to get average results. For ea...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答