现在,我的班级看起来像
@interface Character : SKNode @property (nonatomic,assign) CGFloat walkingSpeed;
@implementation Character
+(Character*)characterWithLevel:(BaseLevel *)level { return [[self alloc] initWithLevel:level]; } -(id)initWithLevel:(BaseLevel*)level { if (self = [super init]) { _sprite = [SKSpriteNode spriteNodeWithImageNamed:level.heroTexture]; _sprite.position = level.heroStartingPosition; [self addChild:_sprite]; [level addChild:self]; } return self; }
问题是,当对级别中的Character节点运行操作时,由于SpriteNode是动画的,因此它不会做任何事情.我想知道你们怎么会遇到这些问题?
行动举例:
触摸事件:
CGPoint location = [[touches anyObject] locationInNode:self]; [character moveToPosition:location];
里面的角色类
-(void)move { [self runAction:[SKAction repeatActionForever:[SKAction animateWithTextures:[self walkFrames] timePerFrame:0.1f resize:NO restore:YES]] withKey:@"moving"]; return; }
这没有任何作用.只有我可以让它工作的方法是如果Character是SKSpriteNode的子类.对self.sprite运行操作似乎也有点hacky并且节点本身不会移动.
有什么建议?
解决方法
为什么使用self.sprite看起来很hacky?这完全有效.
事实上,从OOP的角度来看,聚合其他可见节点的SKNode是更通用的方法.
例如,它允许你隐藏精灵,而是让一个粒子发射器可见,如果玩家拿起一个让他看不见(或非常透明)的通电,只有几个闪闪发光的位置.
要实现这一点,您将有一个发射器作为字符节点的子节点.如果玩家精灵所在的角色节点,则无法仅将精灵变为隐形,因为这也会影响子发射器.
因此,从长远来看,最好聚合视图(可见节点)而不是子类化它们.可以将Character SKNode视为一个或多个视图的视图控制器(其子像sprite,发射器,标签等).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。