我正在使用 Javascript 制作基于瓦片的 RPG,使用 perlin 噪声高度图,然后根据噪声的高度分配瓦片类型。
map 最终看起来像这样(在小 map View 中)。
我有一个相当简单的算法,它从图像上的每个像素中提取颜色值,并将其转换为整数 (0-5),具体取决于它在 (0-255) 之间的位置,对应于平铺字典中的平铺。然后将此 200x200 数组传递给客户端。
然后引擎根据数组中的值确定图 block 并将它们绘制到 Canvas 上。因此,我最终得到了具有逼真特征的有趣世界:山脉、海洋等。
现在我想做的下一件事是应用某种混合算法,使瓷砖无缝融入其邻居,如果邻居不是同一类型。上面的示例 map 是玩家在他们的小 map 中看到的。在屏幕上,他们会看到由白色矩形标记的部分的渲染版本;其中瓷砖与其图像一起渲染,而不是作为单色像素。
这是用户将在 map 中看到的示例,但它与上面的视口(viewport)显示的位置不同!
正是在这个 View 中,我希望发生转换。
我想出了一个简单的算法,它可以在视口(viewport)内遍历 map ,并在每个图 block 的顶部渲染另一个图像,前提是它位于不同类型的图 block 旁边。 (不改变 map !只是渲染一些额外的图像。)该算法的想法是分析当前图 block 的邻居:
这是一个引擎可能必须渲染的示例场景,当前图 block 是标有 X 的图 block 。
创建了一个 3x3 数组,并读入它周围的值。因此对于本例,该数组如下所示。
[
[1,2,2]
[1,2,2]
[1,1,2]
];
然后我的想法是为可能的图 block 配置制定一系列案例。在一个非常简单的层面上:
if(profile[0][1] != profile[1][1]){
//draw a tile which is half sand and half transparent
//Over the current tile -> profile[1][1]
...
}
这给出了这个结果:
这是从 [0][1] 到 [1][1] 的过渡,而不是从 [1][1] 到 [2][1],保留硬边。所以我认为在那种情况下必须使用 Angular 落瓷砖。我创建了两个 3x3 的 Sprite 表,我认为它们可以包含所有可能需要的图 block 组合。然后我为游戏中的所有图 block 复制了这个(白色区域是透明的)。对于每种类型的图 block ,这最终是 16 个图 block (不使用每个 Sprite 表上的中心图 block 。)
因此,使用这些新图 block 和正确的算法,示例部分将如下所示:
我所做的每一次尝试都失败了,算法中总是存在一些缺陷,并且模式最终变得奇怪。我似乎无法正确处理所有情况,总体而言,这似乎是一种糟糕的方式。
所以,如果有人可以提供一个替代解决方案来说明我如何创建这种效果,或者编写分析算法的方向,那么我将非常感激!
最佳答案
该算法的基本思想是使用预处理步骤找到所有边缘,然后根据边缘的形状选择正确的平滑瓦片。
第一步是找到所有边。在下面的示例中,标有 X 的 边缘图 block 都是绿色图 block ,其中一个棕褐色图 block 作为其八个相邻图 block 中的一个或多个。对于不同类型的地形,如果该图 block 具有较低地形编号的邻居,则此条件可能会转化为边缘图 block 。
一旦检测到所有边缘图 block ,接下来要做的就是为每个边缘图 block 选择正确的平滑图 block 。这是我对您的平滑图 block 的表示。
请注意,实际上没有那么多不同类型的图 block 。我们需要 3x3 方格中的一个方格中的 8 个外部方格,但只需要另一个方格中的四个 Angular 方格,因为在第一个方格中已经找到了直边方格。这意味着我们必须区分总共 12 种不同的情况。
现在,查看一个边缘图 block ,我们可以通过查看其最近的四个相邻图 block 来确定边界转向的方向。与上面一样用 X 标记边缘图 block ,我们有以下六种不同的情况。
这些情况用于确定对应的平滑图 block ,我们可以相应地对平滑图 block 进行编号。
对于每种情况,仍然可以选择 a 或 b。这取决于草在哪一侧。确定这一点的一种方法可能是跟踪边界的方向,但可能最简单的方法是在边缘旁边选择一个图 block 并查看它的颜色。下图显示了 5a) 和 5b) 两种情况,可以通过例如检查右上图 block 的颜色来区分它们。
原始示例的最终枚举将如下所示。
在选择相应的边缘图 block 后,边框看起来像这样。
作为最后一点,我可能会说,只要边界有点规则,这将起作用。更准确地说,没有恰好两个边缘瓦片作为它们的邻居的边缘瓦片将不得不分开处理。这将发生在 map 边缘的边缘瓦片将有一个边缘邻居,以及非常狭窄的地形,其中相邻边缘瓦片的数量可能是三个甚至四个。
关于javascript - map 平铺算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901987/
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法
Enumerable#each和Enumerable#map的区别在于返回的是接收者还是映射后的结果。回到接收者是微不足道的,你通常不需要在each之后继续一个方法链,比如each{...}.another_method(我可能没见过这样的案例。即使你想回到接收者那里,你也可以通过tap来实现)。所以我认为所有或者大部分使用Enumerable#each的情况都可以用Enumerable#map代替。我错了吗?如果我是对的,each的目的是什么?map是否比each慢?编辑:我知道当您对返回值不感兴趣时使用each是一种常见的做法。我对这种做法是否存在不感兴趣,但感兴趣的是,除了从
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
map遍历数组是否比each更快?两者有速度差异吗?mapresult=arr.map{|a|a+2}每个result=[]arr.eachdo|a|result.push(a+2)end 最佳答案 我认为是的。我试过这个测试require"benchmark"n=10000arr=Array.new(10000,1)Benchmark.bmdo|x|#Mapx.reportdon.timesdoresult=arr.map{|a|a+2}endend#Eachx.reportdon.timesdoresult=[]arr.each
我想念Ruby中的Hash方法来仅转换/映射散列值。h={1=>[9,2,3,4],2=>[6],3=>[5,7,1]}h.map_values{|v|v.size}#=>{1=>4,2=>1,3=>3}你如何在Ruby中归档它?更新:我正在寻找map_values()的实现。#moreexamplesh.map_values{|v|v.reduce(0,:+)}#=>{1=>18,2=>6,3=>13}h.map_values(&:min)#=>{1=>2,2=>6,3=>1} 最佳答案 Ruby2.4引入了方法Hash#tran
假设我有一个函数defodd_or_evennifn%2==0return:evenelsereturn:oddendend我有一个简单的可枚举数组simple=[1,2,3,4,5]然后我用我的函数在map中运行它,使用一个do-endblock:simple.mapdo|n|odd_or_even(n)end#=>[:odd,:even,:odd,:even,:odd]如果不首先定义函数,我怎么能做到这一点?例如,#doesnotworksimple.mapdo|n|ifn%2==0return:evenelsereturn:oddendend#Desiredresult:#=>[
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s