Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SKTextureAtlas和SKAction无法从SKSpriteNode iOS SpriteKit中移除,更不用说停止_Ios_Objective C_Sprite Kit - Fatal编程技术网

SKTextureAtlas和SKAction无法从SKSpriteNode iOS SpriteKit中移除,更不用说停止

SKTextureAtlas和SKAction无法从SKSpriteNode iOS SpriteKit中移除,更不用说停止,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,基本上我是在尝试用SpriteKit乱搞,我花了一段时间才弄明白如何从数组中删除一系列SpriteNodes。我克服了这一点,这是一个问题,它仍然存在于公羊。我仍在试图找出obj-c对象上的一些严格标志。首先,这里是我最新的稳定git提交: 现在我正试图找出如何从我的SKSpriteNode中删除SKAction和SKTexture。将它们设置为零并不像我一直发现的那样有效。如果您下载代码,您将看到我的行走循环动画在您再次触摸时保持运行,目的是一次仅在屏幕上显示一个行走循环。其他的斯普林特诺德消

基本上我是在尝试用SpriteKit乱搞,我花了一段时间才弄明白如何从数组中删除一系列SpriteNodes。我克服了这一点,这是一个问题,它仍然存在于公羊。我仍在试图找出obj-c对象上的一些严格标志。首先,这里是我最新的稳定git提交:

现在我正试图找出如何从我的SKSpriteNode中删除SKAction和SKTexture。将它们设置为零并不像我一直发现的那样有效。如果您下载代码,您将看到我的行走循环动画在您再次触摸时保持运行,目的是一次仅在屏幕上显示一个行走循环。其他的斯普林特诺德消失了。我猜这是这些SKAction和SKTexture仍然存在于RAM中的一个问题,但我不清楚这是如何工作的。我希望有人能明确指出这种垃圾收集的工作原理。我将粘贴我当前的MyScene.m,因为我现在正在处理它。它与上次的git更新略有不同,因为上次我成功地解决了一些问题(循环SKAction)时提交了它。因此,如果您将我的代码与git进行比较,您将看到我现在的位置

#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,因为我想学习如何正确管理一组对象。