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,随机地图,地牢)