我创建了一个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.
当我运行应用程序并单击按钮时,没有任何反应。我需要做些什么来改变/做功能......好吧......功能?
答案 0 :(得分:2)
理论上,Swift应该能够自动链接项目内部的所有文件,因此您的代码应该能够独立工作。但是,唯一可能出现的问题是因为您现在也依赖于StoryBoard,因此您必须确保正确链接。 确保its linked correctly.
有关与Swift链接的详细信息,请查看this question。
编辑:另外,请查看您的代码。你在类本身上调用太空飞船的函数而不是它的实例,所以这就是为什么它可能不起作用。您需要首先初始化gameScene然后使用该场景来调用方法。我认为这可能会有更多的工作,所以我的建议是将所有内容保存在gameScene类中,并在其中创建一个spriteNode按钮。
答案 1 :(得分:2)
问题在于此代码:
gameScene
您的gameScene
属性与您呈现的场景不同。这是两个独立的对象。你需要做两件事。
将您的let gameScene = GameScene(fileNamed: "GameScene")
声明更改为您在演示代码中创建的新声明。像这样:
viewDidLoad
在GameScene
中,提供skView.presentScene(gameScene)
个对象,而不是创建一个新对象,如下所示:
GameScene
通过这种方式,您可以创建一个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)