你如何调用另一个类中定义的函数?

时间:2015-08-12 20:25:57

标签: ios xcode swift sprite-kit

我创建了一个SpriteKit项目并在GameScene.swift文件中定义了一个函数。所述函数创建一个SKSpriteNode,并且在它的类中调用时没有问题。

#import <Foundation/Foundation.h>

@interface Person: NSObject
@property int age;
@property int weight;
- (void)print;
@end

@implementation Person : NSObject
- (void)print {
    printf("Age: %i, weight: %i", self.age, self.weight);
}
@end


 int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *don = [[Person alloc] init];
        don.weight = 130;
        don.age = 23;
        [don print];

    }
    return 0;
}

现在,在我的ViewController中,我创建了一个简单的按钮并将其连接到swift文件。我在下面的代码之前做了一些事情,但这是我遇到问题的部分。

func generateShip() {
    self.removeAllChildren()
    let SKSprite1 = SKSpriteNode(imageNamed: "Spaceship")
    SKSprite1.size = CGSize(width: CGFloat(arc4random_uniform(UInt32(200))), height: CGFloat(arc4random_uniform(UInt32(200))))
    SKSprite1.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2)
    self.addChild(SKSprite1)
}
//if I called it here with touchesBegan, it worked.

当我运行应用程序并单击按钮时,没有任何反应。我需要做些什么来改变/做功能......好吧......功能?

链接:Full CodeIphone

4 个答案:

答案 0 :(得分:2)

理论上,Swift应该能够自动链接项目内部的所有文件,因此您的代码应该能够独立工作。但是,唯一可能出现的问题是因为您现在也依赖于StoryBoard,因此您必须确保正确链接。 确保its linked correctly.

有关与Swift链接的详细信息,请查看this question

编辑:另外,请查看您的代码。你在类本身上调用太空飞船的函数而不是它的实例,所以这就是为什么它可能不起作用。您需要首先初始化gameScene然后使用该场景来调用方法。我认为这可能会有更多的工作,所以我的建议是将所有内容保存在gameScene类中,并在其中创建一个spriteNode按钮。

答案 1 :(得分:2)

问题在于此代码:

gameScene

您的gameScene属性与您呈现的场景不同。这是两个独立的对象。你需要做两件事。

  1. 将您的let gameScene = GameScene(fileNamed: "GameScene") 声明更改为您在演示代码中创建的新声明。像这样:

    viewDidLoad
  2. GameScene中,提供skView.presentScene(gameScene) 个对象,而不是创建一个新对象,如下所示:

    GameScene
  3. 通过这种方式,您可以创建一个generateShip()对象,显示它,并在同一个对象上调用<div id="wrapper"> <div id="auto-width"></div> <div id="changing-width"></div> </div>

答案 2 :(得分:1)

你的代码对我来说似乎很好。

如果来自未知类/模块等的代码存在任何“访问”问题,您将收到编译器警告。情况似乎并非如此。

我的猜测:你的按钮没有正确接线! 双击按下按钮时@IBAction func newShip(sender: AnyObject)真正被调用:在newShip函数内设置一个断点。

编辑:如果确实停在那里:使用调试器进入该功能。

答案 3 :(得分:0)

您在视图控制器中错误地使用了两个不同的GameScene实例!一个添加到视图层次结构中,并在点击按钮时调用OTHER实例。

这不能从原始问题的代码中看出,而是从您在评论中提供的代码中看出:screenshot of full code

在您的视图控制器中,您首先要创建一个GameScene:

let gameScene = GameScene()

但是您正在创建GameScene的第二个实例并将其添加到视图层次结构中:

skView.presentScene(GameScene(fileNamed:"GameScene"))

并且您的按钮操作会调用generateShip()中存储的第一个对象上的gameScene方法,该方法尚未由SKView显示。

所以解决方法是将上面的代码更改为:

let gameScene = GameScene(fileNamed:"GameScene"))

以后:

skView.presentScene(gameScene)