Spritekit:如何将玩家移动限制在某些瓷砖上
Posted
技术标签:
【中文标题】Spritekit:如何将玩家移动限制在某些瓷砖上【英文标题】:Spritekit: How to limit player movement to certain tiles only 【发布时间】:2020-01-27 03:26:34 【问题描述】:问题背景: 如屏幕截图所示,我有一个 24*24 的瓷砖地图和一个玩家精灵节点。我目前要解决的问题是,我希望将玩家的移动限制在字母 A 形的红色瓷砖内。
我尝试过的解决方案: 我使用 intersects 方法逐帧检测 tilemap 和玩家精灵节点之间的碰撞。但是,我希望将玩家精灵节点仅与字母 A 形红色瓷砖的框架进行比较,而不是整个瓷砖地图。
func detectMapCollision()
if player.frame.intersects(self.mainTileMap.frame)
print("you are on the map! yay! ")
那么,我怎样才能将字母 A 形的红色瓷砖从整个瓷砖地图中分离出来,然后将其帧与玩家进行比较,以便我可以将玩家的移动限制在字母区域内?
【问题讨论】:
【参考方案1】:执行此操作的方法是为游戏的图块定义一个图块组和相应的图块定义。这样做允许您在每个图块组的 userData 信息中定义特定标识符,以便您可以在代码中区分它们。
https://developer.apple.com/documentation/spritekit/sktiledefinition/1645813-userdata
例如,在您的游戏中,您可以创建一个与构成字母 A 的所有红色图块相对应的图块组。然后您可以在 userData 字典中为该图块类型设置一个自定义键来识别它。然后,每当玩家想要移动到新瓷砖时,检查代码中的键或键的值。您可以在变体的 tile 定义中的 Attributes Inspector 中直接设置 tile 的 userData 字典。
要检查的代码是这样的(假设您在 userData 字典中将布尔键 'letterA' 设置为 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.
编辑:
在响应您的查询时,您不必在代码中填充您的游戏地图/网格。为此,我假设您已经创建了一个游戏项目,其中已经预填充了 GameScene.sks。在此文件中,您可以从对象库中删除一个“平铺地图节点”,然后您将使用编辑器添加您的平铺。
现在,带有用户数据的图块将来自 SpriteKit TileSet 资源文件,该资源文件也应该已添加到您的项目中。从当前的 Xcode (v11.3.1) 开始,默认的瓦片集带有预构建的瓦片,但没有什么能阻止您添加自己的自定义瓦片(字母 A 路线的红色瓦片)。然后,当您创建了磁贴组和磁贴定义后,您可以通过选择特定变体并在检查器窗口中添加键/值来修改其用户数据字典。
如果您不确定如何执行我在前 2 段中概述的过程,可以在线免费获得各种当前的 SpriteKit TileMap 教程。我相信他们可能会在这方面为您提供进一步的帮助。
然而,必须编码的是检查特定图块中 UserData 信息的实际逻辑,以便您可以根据需要限制玩家移动——我在原始回复中给出了一个示例。
【讨论】:
您的意思是我应该以编程方式创建字母 A 而不是使用编辑器绘制它吗? @zoenamatata 你在用SKTileMap吗? @zoenamatata,我已尝试进一步解释以回答您的问题。请参阅原始回复末尾的编辑。希望对您有所帮助!以上是关于Spritekit:如何将玩家移动限制在某些瓷砖上的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 3/SpriteKit 中限制球的敲击?