Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图都是随机生成的.
至于如何在生成地图时兼顾随机性和一定模式,网上有很多不错的建议.你也可以从Delve的源代码中找到答案(如果学习目的需要源代码的可以@我,或者自行度娘)
这里只是谈一下源代码中有一个小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的进行下一关了:
Bug消除了,我们又可以找到出口到下一关愉快的玩耍啦 ;)
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved