【问题标题】:SceneKit Project User InteractionSceneKit 项目用户交互
【发布时间】:2018-02-06 06:39:57
【问题描述】:

我一直在用 SceneKit 开发一个游戏,其中涉及一个用户可以使用箭头键控制的飞机。飞机可以飞,但是方向键对飞机没有影响。当我运行测试以查看箭头键功能是否正常工作时,我可以看到箭头键有效地改变了飞机的速度,但飞机并没有增加或减少速度。代码如下:

import SceneKit
import QuartzCore
class GameViewController: NSViewController {
var height = 0
var speed = 0 //I should be able to change this value by pressing the up arrow key during the simulation
override func keyDown(with theEvent: NSEvent) {
    if(theEvent.keyCode == 123){//left
    }
    if(theEvent.keyCode == 124){//right
    }
    if(theEvent.keyCode == 125){//down
    }
    if(theEvent.keyCode == 126){//up
        speed+=1
        print(speed)
    }
}
override func viewDidLoad(){
    super.viewDidLoad()
    let scene = SCNScene(named: "art.scnassets/Plane.scn")!
    let cameraNode = scene.rootNode.childNode(withName: "camera", recursively: true)!
    let plane = scene.rootNode.childNode(withName: "plane", recursively: true)!
    plane.runAction(SCNAction.repeatForever(SCNAction.moveBy(x: 0, y: CGFloat(height), z: CGFloat(speed), duration: 1)))
    cameraNode.runAction(SCNAction.repeatForever(SCNAction.moveBy(x:0, y:CGFloat(height), z: CGFloat(speed), duration:1)))

    let scnView = self.view as! SCNView
    }

}

【问题讨论】:

  • 在场景中使用按键事件,而不是在视图控制器中。
  • 当我将 keyDown 的函数移动到 viewDidLoad 函数中并从 keyDown 函数中删除覆盖时,计算机根本不响应按键。如果保留覆盖部分,则计算机返回错误。
  • 哎呀!?您的场景视图有 viewDidLoad?只有视图控制器有 viewDidLoad。
  • 读取事件是视图(NSView、SCNView...)的工作。
  • 那么让我看看你的场景视图。

标签: swift macos scenekit


【解决方案1】:

一旦您创建了一个带有依赖于speed 变量的参数的SCNAction 对象,对speed 的任何更改都不会更新操作。

这是因为 speed 是一个值类型 (Int),SCNAction 实例和视图控制器的 speed 实例变量之间没有任何联系。这不是 SceneKit 特有的问题,任何将 Int 作为参数的 API 的行为方式都相同。

【讨论】:

  • 现在我知道问题出在哪里了,你能告诉我如何解决这个问题吗?我应该更改变量类型吗?如何更新操作以使其响应?谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2020-09-03
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
相关资源
最近更新 更多