【发布时间】:2014-04-11 22:00:07
【问题描述】:
对于我的问题,我想要一个更具概念性的答案,而不是代码答案。
我有一个使用 Spritekit 的 iOS 应用程序。我有一个子类化 SKSpriteNode 的类,这样我就可以向节点添加其他属性。我能够成功创建 SKSpriteNode 并将其显示在我的 SKSpriteNode 背景上并使用操作将其删除。但是,当我运行任何操作时,例如:
SKAction * moveAction = [SKAction moveTo:CGPointMake(100, 100) duration: 1];
它不会为我的子类执行操作。但是,如果我对另一个 SKSpriteNode 应用相同的操作而不是执行该操作。这些是在每 5 秒运行一次的计时器上创建的。
一些示例代码如下:
MyScene.m:
-(void) timeTest {
MySubclass * subclassTest = [[MySubclass alloc] initWithImage:@"myImage"];
SKSpriteNode *test = [SKSpriteNode spriteNodeWithImageNamed:@"myImage"];
subclassTest.position = CGPointMake(0, 0);
test.position = CGPointMake(0, 100);
[self.background addChild:subclassTest];
[self.background addChild:test];
SKAction * moveAction = [SKAction moveTo:CGPointMake(300, 300) duration: 2];
[subclassTest runAction: moveAction];
[test runAction: moveAction];
}
MySubclass.h
#import <SpriteKit/SpriteKit.h>
@interface MySubclass : SKSpriteNode
-(MySubclass *) initWithImage: (NSString *) image
@end
MySubclass.m
@implementation MySubclass
-(MySubclass *) initWithImage: (NSString *) image
{
self = [MySubclass spriteNodeWithImageNamed:image];
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.dynamic = NO; // Doesnt move with physics
self.physicsBody.categoryBitMask = MySubclassCategory;
self.physicsBody.contactTestBitMask = otherCategory;
self.physicsBody.collisionBitMask = 0;
return self;
}
-(void) runAction:(SKAction *)action
{
[super runAction:action];
NSLog(@"Running action!");
}
@end
每当操作运行时,它都会记录消息“正在运行操作!”,所以我知道它正在访问该方法,只是由于某种原因不执行操作?
如果您需要更多代码或信息,请告诉我! 谢谢。
【问题讨论】:
-
我怀疑这与您的子类没有在
super上调用init(或initWith...)方法有关。 -
我同时使用了 [super initWithPicture: @"picture"] 和 [MySubclass spriteNode..] 。不知道什么是更正确的方法,但他们都做了同样的事情。对于当前的解决方法,我将 userData 用于 spritenode,到目前为止效果很好。
标签: ios7 subclass sprite-kit skspritenode skaction