sprite-kit - 在 SpriteKit 中管理 UI 的最佳实践
问题描述
在 SpriteKit 中,我的所有 UI 都使用 SKNodes、SKShapeNodes 和 SKLabelNodes。它适用于我制作的小游戏,但是,一个小界面(例如“游戏结束”提示)可能包含超过 100 行代码,而这仅仅是声明和定义节点属性。所有这些提示和其他 UI 都在各自独立的函数中声明,并在整个游戏场景中需要时调用,但我无法摆脱管理 UI 有更好实践的感觉。也许是我可以调用“getGameOverPromptUI”或“getScoreLabel”函数的类?我会将这样的课程限制在游戏场景中吗?或者包括菜单场景的用户界面?
编辑:
澄清一下,游戏结束提示包括覆盖场景的褪色背景、文本后面作为提示框的矩形、游戏结束标题的标签、当前分数、最高分数、再次播放按钮、返回菜单等。
代码如此之大的原因是每个组件几乎都是这样创建的
let gameOverNode = SKNode()
gameOverNode.position = CGPoint(x: 0, y: screenSize.height / 16)
addChild(gameOverNode)
// Faded Background
let fadedBackgroundNode = SKShapeNode(rectOf: screenSize)
fadedBackgroundNode.fillColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.6)
fadedBackgroundNode.zPosition = 1
fadedBackgroundNode.position = CGPoint(x: -gameOverNode.position.x, y: -gameOverNode.position.y)
gameOverNode.addChild(fadedBackgroundNode)
// Prompt Background
let gameOverGradientNode = SKShapeNode(rectOf: gameOverGradientNodeSize, cornerRadius: gameOverGradientCornerRadius)
gameOverGradientNode.fillColor = .white
gameOverGradientNode.strokeColor = .clear
let gameOverCropNode = SKCropNode()
gameOverCropNode.maskNode = gameOverGradientNode
gameOverCropNode.addChild(helper.getBackgroundNode2(nodeSize: gameOverGradientNode.frame.size))
gameOverCropNode.zPosition = 2
gameOverNode.addChild(gameOverCropNode)
// Title Label
let gameOverLabel = SKLabelNode(fontNamed: "")
gameOverLabel.name = "gameOverLabel"
gameOverLabel.text = "Game Over"
gameOverLabel.position = CGPoint(x: 0, y: gameOverGradientNode.frame.height / 4 + gameOverGradientNode.frame.height / 8)
gameOverLabel.fontSize = 160
gameOverLabel.fontColor = .white
gameOverLabel.zPosition = 3
gameOverLabel.numberOfLines = 2
gameOverLabel.horizontalAlignmentMode = .center
gameOverNode.addChild(gameOverLabel)
解决方案
推荐阅读
- php - 如何在 Laravel 中实现组合的交叉和内连接?
- javascript - 异步等待实用程序功能同步?
- amazon-web-services - 如何保护从 Windows 服务器机器流式传输的视频文件?
- javascript - 使用 $refs 回调时如何监听 vue 事件
- python - 如何进行从 k 到给定数字并返回零的无限循环?
- python - Python matplotlib 圆环图,一个楔子上的宽度较小
- java - Firebase 实时数据库无法为 child() 中的参数“pathString”传递 null
- python - Flask-Restplus 中间件
- c# - 为什么我的相关数据没有更新并在我的 ASP.NET Core 应用程序中出现空引用错误?
- html - 单击按钮获取用户输入数据