SKTextureAtlas和SKAction无法从SKSpriteNode iOS SpriteKit中移除,更不用说停止
基本上我是在尝试用SpriteKit乱搞,我花了一段时间才弄明白如何从数组中删除一系列SpriteNodes。我克服了这一点,这是一个问题,它仍然存在于公羊。我仍在试图找出obj-c对象上的一些严格标志。首先,这里是我最新的稳定git提交: 现在我正试图找出如何从我的SKSpriteNode中删除SKAction和SKTexture。将它们设置为零并不像我一直发现的那样有效。如果您下载代码,您将看到我的行走循环动画在您再次触摸时保持运行,目的是一次仅在屏幕上显示一个行走循环。其他的斯普林特诺德消失了。我猜这是这些SKAction和SKTexture仍然存在于RAM中的一个问题,但我不清楚这是如何工作的。我希望有人能明确指出这种垃圾收集的工作原理。我将粘贴我当前的MyScene.m,因为我现在正在处理它。它与上次的git更新略有不同,因为上次我成功地解决了一些问题(循环SKAction)时提交了它。因此,如果您将我的代码与git进行比较,您将看到我现在的位置SKTextureAtlas和SKAction无法从SKSpriteNode iOS SpriteKit中移除,更不用说停止,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,基本上我是在尝试用SpriteKit乱搞,我花了一段时间才弄明白如何从数组中删除一系列SpriteNodes。我克服了这一点,这是一个问题,它仍然存在于公羊。我仍在试图找出obj-c对象上的一些严格标志。首先,这里是我最新的稳定git提交: 现在我正试图找出如何从我的SKSpriteNode中删除SKAction和SKTexture。将它们设置为零并不像我一直发现的那样有效。如果您下载代码,您将看到我的行走循环动画在您再次触摸时保持运行,目的是一次仅在屏幕上显示一个行走循环。其他的斯普林特诺德消
#import "MyScene.h"
@implementation MyScene
@synthesize smoke, holder, Kathyholder, Spliffholder, spliff, spriteAction;
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
holder = [[NSMutableArray alloc] init];
Kathyholder = [[NSMutableArray alloc] init];
/* Setup your scene here */
self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
myLabel.text = @"FART";
myLabel.fontSize = 30;
myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
NSString *smokePath = [[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"];
smoke = [NSKeyedUnarchiver unarchiveObjectWithFile:smokePath];
[self addChild:myLabel];
}
return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {
CGPoint location = [touch locationInNode:self];
SKSpriteNode *sprite = [smoke copy];
SKSpriteNode *kathy = [SKSpriteNode spriteNodeWithImageNamed:@"kathy"];
sprite.position = location;
kathy.position = location;
kathy.xScale = (CGFloat) random()/(CGFloat) RAND_MAX;
kathy.yScale = (CGFloat) random()/(CGFloat) RAND_MAX;
spliff = [SKSpriteNode spriteNodeWithTexture:WALKING_TEX_CROP_1_LARGE];
SKAction *action = [SKAction rotateByAngle:M_PI duration:1];
[kathy runAction:[SKAction repeatActionForever:action]];
if ([holder count] > 0)
{
NSLog(@"Too long");
SKSpriteNode *holderSprite = [holder objectAtIndex:0];
[holder removeObject:holderSprite];
[holderSprite removeFromParent];
SKSpriteNode *kathySprite = [Kathyholder objectAtIndex:0];
[Kathyholder removeObject:kathySprite];
[kathySprite removeFromParent];
SKSpriteNode *spliffSprite = [Spliffholder objectAtIndex:0];
[Spliffholder removeObject:spliffSprite];
[spliffSprite removeAllActions];
spriteAction = nil;
spliffSprite.texture = nil;
[spliffSprite removeAllChildren];
[spliffSprite removeFromParent];
}
[holder addObject:sprite];
[self addChild:sprite];
[Kathyholder addObject:kathy];
[self addChild:kathy];
[Spliffholder addObject:spliff];
[self addChild:spliff];
CGFloat spliffScale = ((CGFloat) random()/(CGFloat) RAND_MAX) * 0.5;
spliff.xScale = spliffScale;
spliff.yScale = spliffScale;
spliff.position = location;
spriteAction = [SKAction repeatActionForever:[SKAction animateWithTextures:WALKTHROUGH timePerFrame:0.033]];
[spliff runAction:spriteAction];
}
}
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
}
@end
我只是为了好玩而玩弄SpriteKit库,我承认我还是Objective-C的新手/中级,老实说,我可能会用像Swift这样的松散类型语言做得更好,但是我内心的程序员想知道正确的做事方式,因此,我将尝试同时使用这两种方法,并尽快开始使用swift。哇,我想起来了。我不知道为什么。此块属于init
SKTextureAtlas *walkAtlas = [SKTextureAtlas atlasNamed:@"walking"];
NSArray *textureNames = [walkAtlas textureNames];
_walkTextures = [NSMutableArray new];
for (NSString *name in textureNames) {
SKTexture *texture = [walkAtlas textureNamed:name];
[_walkTextures addObject:texture];
}
此块属于触摸区域
SKSpriteNode *walk = [SKSpriteNode spriteNodeWithTexture:[_walkTextures objectAtIndex:0]];
walk.zPosition = 100;
walk.scale = spliffScale;
walk.position = location;
[self addChild:walk];
SKAction *walkAction = [SKAction animateWithTextures:_walkTextures timePerFrame:0.03];
SKAction *remove = [SKAction removeFromParent];
[walk runAction:[SKAction sequence:@[walkAction, walkAction, remove]]];
我尝试将副本添加到所有纹理中,因为我认为这可能是问题所在,不,我不确定你在问什么,但听起来你好像在试图从场景中删除节点。首先,您可以忘记“内存中”的概念。对象通过强引用保存在内存中。如果对象具有强引用,则ARC不会将其删除。但实际上您正在尝试从场景中删除节点。我想。为此,您将使用[node removeFromParent]。这将从视觉上移除它,如果没有其他对象对它有强引用,那么它将被清除。将指针设置为nil只会删除对其对象的引用。简而言之,removeFromParent应该足以从场景中移除节点。这也将删除节点的操作和子节点,当然,无需手动执行。如果精灵没有消失,你的移除逻辑是有缺陷的。Sprite工具包缓存纹理,没有必要尝试从内存中删除这些纹理。此外,[smoke copy]创建粒子发射器的副本,而不是精灵!如果你一次只需要一个实例,我不明白你为什么要使用数组。我想使用NSMutableArray,因为我想学习如何正确管理一组对象。