SpriteKit游戏Delve随机生成地牢地图一个Bug的修复
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图都是随机生成的.
至于如何在生成地图时兼顾随机性和一定模式,网上有很多不错的建议.你也可以从Delve的源代码中找到答案(如果学习目的需要源代码的可以Q我,或者自行度娘)
这里只是谈一下源代码中有一个小bug,我们看如何修复它!
随机生成地图是放在LevelHelper.swift文件中,其中结构tileMap里有一个实例方法generateMap,全部都在这里了.
该方法的主要功能为,使用不同随机分布器建立一定随机模式,然后从主角开始位置根据模式一点点开始生成随机地图,接着最后在创建一个过关的楼梯,只要主角进入该楼梯则表示此关胜利,调整难度,进入下一关!
在多次运行后发现,偶尔随机地图生成器没有生成过关的楼梯,导致游戏关卡不能完成.大概每10次就有1次.
检查代码发现放置过关楼梯的条件是在最后一个模式位置,不过在这之前做了一个有效性检查,如果为该位置有效才可以放置,如果无效那么你就过不了关了 ;)
if isValidTile(position: newPosition){
if getTile(position: newPosition) <= 3{ currentLocation = newPosition
if i == 0 && j == 0{
setTile(position: currentLocation, toValue: EndPos)
}else{
setTile(position: currentLocation, toValue: Ground)
}
}
}
注意只有当currentLocation有效且i和j都为0的情况下,才会设置EndPos!
为了修正该Bug,我们首先建立2个变量:
//最后一个有效的位置
var lastVaildPos = CGPointZero
//是否设置过过关楼梯
var isEndSeted = false
然后将代码修改如下:
if isValidTile(position: newPosition){
if getTile(position: newPosition) <= 3{
lastVaildPos = currentLocation
currentLocation = newPosition
if i == 0 && j == 0{
setTile(position: currentLocation, toValue: 5)
isEndSeted = true
}else{
setTile(position: currentLocation, toValue: 3)
}
}
}
}
}
if !isEndSeted{
setTile(position: lastVaildPos, toValue: 5)
}
现在如果最后一个位置没有设置结束点则会在方法结束前找到一个有效位置设置结束楼梯,这样无论如何总会有一个退出楼梯,玩家可以很happy的进行下一关了:
SpriteKit游戏Delve随机生成地牢地图一个Bug的修复的更多相关文章
- 趣图:快下班了,剩一个bug,修复一下再走
趣图:当我给老板展示我修复了那个 bug 时 趣图:当我以为这是最后一个Bug时……
- 【Python图像特征的音乐序列生成】关于mingus一个bug的修复,兼改进情感模型
mingus在输出midi文件的时候,使用这样的函数: from mingus.containers import NoteContainer from mingus.midi import midi ...
- yarn client中的一个BUG的修复
org.apache.spark.deploy.yarn.Client.scala中的monitorApplication方法: /** * Report the state of an applic ...
- 印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
前言 最近,我们部门负责项目运维的小王频频接到甲方的反馈,运行的项目使用谷歌浏览器登录后,每次点击处理2秒后,浏览器自动闪退崩溃.小王同学折腾了一个星期,还没找到问题的原因.甲方客户都把问题反馈给项目 ...
- Swift - 在界面上生成81个随机红,灰色圆点(SpriteKit游戏开发)
下面是生成一个“围住神经猫”游戏的初始场景: 1,界面下方会生成9*9共81个圆点,同时圆点内部添加文本标签显示索引 2,默认圆点为灰色,每行随机取两个点变为红色 3,奇数行和偶数行有一定的错位,错位 ...
- c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;
网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...
- roguelike地图的随机生成算法
如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...
- 2D地图随机生成
2D地图随机生成基础绘图 海陆分布
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
随机推荐
- enumerate给列表加序号
#coding=utf-8#给列表加上序号,enumerate(l1),默认从0开始l1=['money','house','joo']for item in enumerate(l1,1): #pr ...
- Centos常用命令之:文件操作
在centos中,常用的文件操作命令有: ◇touch:建置新文件或者修改文件时间◇cat:从第一行开始显示文件内容◇tac:从最后一行开始显示文件内容,和cat相反◇nl:显示的时候,顺道输出行号◇ ...
- [SCOI2009]生日快乐
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy ,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的 ...
- ●BZOJ 1444 [Jsoi2009]有趣的游戏
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1444题解.1: 概率dp,矩阵乘法,快速幂. 对所有串建立AC自动机, 那么如果在trie树 ...
- ●BZOJ 4310 跳蚤
●赘述题目 给出一个字符串,要求分成k个子串,然后求出每个子串的字典序最大的子串(我称它为子子串),要使这k个子子串中的字典序最大的那个串(即魔力串)最小.输出该魔力串. (本题个人感觉很好,比较综合 ...
- bzoj 4518: [Sdoi2016]征途
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- hdu 5592 BestCoder Round #65(树状数组)
题意: ZYB有一个排列PP,但他只记得PP中每个前缀区间的逆序对数,现在他要求你还原这个排列. (i,j)(i < j)(i,j)(i<j)被称为一对逆序对当且仅当A_i>A_jA ...
- 【Git】Git工具常用命令
GitHub使用指南 一.把本地代码上传到GitHub 0. 提前配置好上传地址 [git config --global user.name "username"] [git c ...
- STM8操作LCD5110总结
附上一小段代码: void LCD_init(void) { // 产生一个让LCD复位的低电平脉冲 //LCD_RST = 0; GPIO_WriteLow(LCD_PORTG, LCD_RST); ...
- SVN与Git
一:SVN是什么?SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到S ...