Swift Spritekit:如何将玩家的移动限制为仅限于某些瓷砖

Swift Spritekit:如何将玩家的移动限制为仅限于某些瓷砖,swift,sprite-kit,sktilemapnode,Swift,Sprite Kit,Sktilemapnode,问题的背景: 如屏幕截图所示,我有一个24*24的tilemap和一个播放器精灵节点。目前我正试图解决的问题是,我希望限制玩家的移动范围仅限于字母A形状的红砖。 我尝试过的解决方案是: 我使用了intersects方法来逐帧检测tilemap和player sprite节点之间的冲突。但是,我希望将玩家精灵节点与字母A形状的红色瓷砖的框架进行比较,而不是与整个瓷砖贴图进行比较 func detectMapCollision(){ if player.frame.intersects(s

问题的背景: 如屏幕截图所示,我有一个24*24的tilemap和一个播放器精灵节点。目前我正试图解决的问题是,我希望限制玩家的移动范围仅限于字母A形状的红砖。

我尝试过的解决方案是: 我使用了intersects方法来逐帧检测tilemap和player sprite节点之间的冲突。但是,我希望将玩家精灵节点与字母A形状的红色瓷砖的框架进行比较,而不是与整个瓷砖贴图进行比较

func detectMapCollision(){
    if player.frame.intersects(self.mainTileMap.frame){
        print("you are on the map! yay! ")
    }
}

那么,我如何将字母A形状的红色瓷砖从整个瓷砖贴图中分离出来,然后将其框架与玩家进行比较,以便将玩家的移动限制在字母区域?

这样做的方法是为游戏的瓷砖定义一个瓷砖组和相应的瓷砖定义。这样做允许您在每个磁贴组的userData信息中定义特定标识符,以便在代码中区分它们

例如,在游戏中,您可以创建一个互动程序组,该组对应于组成字母a的所有红色互动程序。然后,您可以在userData字典中为该互动程序类型设置一个自定义键来标识它。然后,每当玩家想要移动到新的互动程序时,检查代码中的键或键值。您可以在变量的磁贴定义的属性检查器中直接设置磁贴的userData字典

要检查的代码如下所示(假设您在userData dictionary中将布尔键'letta'设置为true:

let letterTile = myTileMap.tileDefinition(atColumn: column, row: row)

if letterTile.userData?.value(forKey: "letterA") == true {
    // Allow the player to move to this tile as it's one of the letter A tiles.
}
编辑:

为了响应您的查询,您不必在代码中填充游戏地图/网格。为此,我假设您已经创建了一个游戏项目,其中已经预填充了GameSecene.sks。在此文件中,您可以从对象库中删除“平铺地图节点”,您将使用编辑器在其中添加平铺

现在,带有用户数据的磁贴将来自SpriteKit磁贴集资源文件,该文件也应添加到您的项目中。从当前的Xcode(v11.3.1)开始,默认磁贴集附带预构建的磁贴,但没有任何东西可以阻止您添加自己的自定义磁贴(字母a路由的红色磁贴)。然后,当您创建了互动程序组和互动程序定义后,您可以通过选择特定变体并在inspector窗口中添加键/值来修改其用户数据字典

如果您不确定如何完成我在前两段中概述的过程,可以在网上免费获得各种当前的SpriteKit TileMap教程。我相信它们可能会在这方面对您有所帮助


然而,必须编码的是检查特定分幅中的用户数据信息的实际逻辑,以便您可以根据自己的意愿限制玩家移动——我在最初的回答中给出了一个例子。

您的意思是我应该以编程方式创建字母A,而不是使用编辑器绘制它吗?@zoenamatata您使用SKTileMap吗?@zoenam阿塔塔,我试着对你的问题作进一步解释。请看原始回答末尾的编辑。希望有帮助!