- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 SpriteKit 游戏,使用 GKStateMachine 在多个场景之间进行转换。我正在使用一个包含 StateMachine 实例的类,该实例具有多个状态。状态本身可以通过初始值设定项属性访问当前 SKView。 State 负责呈现场景,因此它们有一个 scene 属性,该属性将在 didEnter-Method 上呈现。现在我有一个 MainMenuState,它有一个带有 3 个按钮的场景。为了将按钮事件传递给状态,我编写了一个自定义委托(delegate)。 MainMenuState 实现委托(delegate)协议(protocol)并将场景的委托(delegate)属性设置为“self”。因此,当用户点击按钮时,操作将转发到委托(delegate)方法。我想使用委托(delegate)方法转换到下一个状态(例如 SettingsState)。但是,当我尝试访问委托(delegate)函数中的 GKStates StateMachine 属性时,它始终为零。我认为我这里有一个设计问题,而且我不知道如何解决。
MainMenuState 的代码
import Foundation
import GameplayKit
class MainMenuState : GKState, MenuSceneDelegate {
var view: SKView
var scene: GKScene?
init(view: SKView) {
self.view = view;
self.scene = GKScene(fileNamed: "MenuScene")
super.init()
}
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
return stateClass is MultiplayerHostState.Type ||
stateClass is MultiplayerSearchState.Type ||
stateClass is SettingsState.Type
}
override func didEnter(from previousState: GKState?) {
super.didEnter(from: previousState)
// Load 'GameScene.sks' as a GKScene. This provides gameplay related content
// including entities and graphs.
if let scene = self.scene {
// Get the SKScene from the loaded GKScene
if let sceneNode = scene.rootNode as! MenuScene? {
// Set delegate
sceneNode.menuDelegate = self
// Copy gameplay related content over to the scene
sceneNode.entities = scene.entities
sceneNode.graphs = scene.graphs
// Set the scale mode to scale to fit the window
sceneNode.scaleMode = .aspectFill
sceneNode.size = view.bounds.size
// Present the scene
if let view = self.view as SKView? {
view.presentScene(sceneNode)
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}
}
}
override func willExit(to nextState: GKState) {
super.willExit(to: nextState)
}
func hostGameClicked() {
if let stateMachine = self.stateMachine {
stateMachine.enter(MultiplayerHostState.self)
}
}
func joinGameClicked() {
if let stateMachine = self.stateMachine {
stateMachine.enter(MultiplayerSearchState.self)
}
}
func settingsClicked() {
// <-- Here the StateMachine is nil -->
if let stateMachine = self.stateMachine {
stateMachine.enter(SettingsState.self)
}
}
}
最佳答案
经过一番研究,我发现此行为是由 Swifts ARC 系统引起的。保存状态机引用的类仅在整个 ViewController 的函数中声明。因此,在存在该函数之后,类和状态机被释放。我在 View Controller 中解决了它:
class ViewController {
var classWithStateMachine: ClassWithStateMachine?
func initializeClassWithStateMachine {
self.classWithStateMachine = ClassWithStateMachine()
}
}
此代码片段只是概念演示,没有真正的代码。
关于swift - GK状态 : Why is StateMachine == nil on delegate call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780715/
我现在真的很纠结于 Game Center。可能是因为整个 GK 整天都在大便(凸版刚刚发布!),但我无法获得身份验证对话框: - (void) authenticateLocalPlayer {
有没有办法获取所有具有成就状态(锁定、解锁或百分比)的 GKAchievementDescription 列表? 我刚刚记录了 [GKAchievementDescription loadAchiev
一些示例,在主循环内直接 gtk2 我目前正在尝试在按键事件中添加代码 如果我在 guy 代码中出错,gui 线程将在 repl 中挂起,我仍然可以取回 repl 但我没有找到一种方法来继续 gui
我刚刚将 xcode 和我的设备更新到 8.4。游戏中心会通过 5008 错误表示它无法验证,但在设备屏幕上它会正常验证。然而,排行榜是空的,有那么一刻我以为 Game Center 服务器宕机了。
我想将邪恶中的 j k 运动分别映射为 gj 和 gk。这是人们通常在 vim 中进行的常见重新映射。我怎样才能在 Emacs 中做到这一点。我想我只需要找到这些与 gj 和 gk Action 相对
我是一名优秀的程序员,十分优秀!