【问题标题】:Swift - Sprite Kit Physics - Toggle Dynamic to true and falseSwift - Sprite Kit 物理 - 将动态切换为真假
【发布时间】:2020-01-18 06:14:56
【问题描述】:

我有一个简单的应用程序,可以在其中动态创建形状。此形状具有物理特性,但一开始将其动力学设置为 false(如预期的那样)。

var dot = SKSpriteNode(imageNamed: "ShapeDot.png");

override func sceneDidLoad() {
    dot.name = "MyShapeDot";
    dot.size = CGSize(width: 10,height: 10);
    dot.position = CGPoint(x: 0, y: 0);
    dot.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(dot.size.width/2))
    dot.physicsBody?.isDynamic = false;
    dot.physicsBody?.allowsRotation = false;
    dot.physicsBody?.pinned = false;
    dot.physicsBody?.affectedByGravity = true;
    //add to spritekit scene     
    self.addChild(dot)
}

形状已成功添加到 .sks 和控制器(我在屏幕上看到)。然后在点击手势上,我正在调用一个函数来打开物理精灵节点的动态。

func MyTapGesture(){
   dot.physicsBody?.isDynamic = true;
}

正在调用 MyTapGesture(我调试它触发),但形状不会变成动态并开始使用重力...有谁知道我错过了什么???

我正在从我的 interfaceController 调用 MyTapGesture...它是这样连接起来的

let gameScene = GameScene();

@IBOutlet weak var spriteTapGestures: WKTapGestureRecognizer!

@IBAction func onSpriteTap(_ sender: Any) {
    NSLog("tap")    
    gameScene. MyTapGesture()
}

在 MyTapGesture 中,我还尝试了 print(dot),它输出以下内容:

name:'MyShapeDot' texture:[<SKTexture> 'ShapeDot.png' (128 x 128)] position:{0, 0} scale:{1.00, 1.00} size:{10, 10} anchor:{0.5, 0.5} rotation:0.00

这让我相信它应该可以工作,并且我正在调用附加到对象的类的正确引用。但它不起作用。如果我在创建点的 SpriteKit 类的更新函数中调用 MyTapGesture()

override func update(_ currentTime: TimeInterval) {
   MyTapGesture()
}

它有效并且动态更新! ...所以出于某种原因,我的点击手势一定是调用了错误的引用或什么???很困惑,因为调试显示为我创建的形状打印了正确的数据......

【问题讨论】:

  • 在阅读了这个 stackoverflow 之后:stackoverflow.com/questions/24333142/…
  • 我认为 let 'gameScene = GameScene()' 正在创建一个新实例......而不是引用旧实例......但仍然不确定如何使类本身成为全局变量(该示例仅显示如何创建全局字符串)
  • 如果没有更多关于如何在 viewcontroller 类中呈现/管理游戏场景的代码,很难确定。也许在你的 gamescene 类的 sceneDidLoad 方法中添加一个打印,以确保你只创建一个 GameScene 实例?可能是您调用 MyTapGesture() 的 GameScene 实例不是您的 SKView 中显示的实例。

标签: swift swift5.1


【解决方案1】:

为了解决这个问题 - 我意识到我的界面控制器中的 gameScene 变量没有正确的引用。所以我将它实例化为 nil:

var gameScene : GameScene?;

然后在接口控制器awake func中赋值变量

if let scene = GameScene(fileNamed: "GameScene") {
    gameScene = scene
}

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多