2014-04-27 3 views
-2

내 게임에서 각각 다섯 개의 방법으로 동일한 장애물을 만듭니다. 나는 악기를 돌리고 어떤 이유로 그 장애물이 기억을 풀어주지 못한다는 것을 알았습니다. ARC를 사용하고 있습니다. 악기의 이미지는 다음과 같습니다 http://postimg.org/image/fdgs4os3z/. 메모리는 단지 높은에 도달하기 때문에 이후 불과 5 분 경기가 잠금 때문에 여기에 생성하고 각 장애를 제거한다 내 코드, 난 정말이 문제에 도움이 필요SKSpriteNode가 메모리를 해제하지 않습니다.

-(void)createObstacle0 { 
int yMin = (CGRectGetMidY(self.frame)+190); 
int yMax = (CGRectGetMidY(self.frame)+270); 
CGPoint startPoint = CGPointMake(-20, yMin + arc4random_uniform(yMax - yMin)); 
SKSpriteNode *obstacle = [SKSpriteNode spriteNodeWithImageNamed:@"obstacle"]; 
obstacle.position = CGPointMake(startPoint.x, startPoint.y); 
obstacle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:21]; 
obstacle.physicsBody.categoryBitMask = enemyCategory; 
obstacle.physicsBody.contactTestBitMask = playerCategory; 
obstacle.physicsBody.dynamic = NO; 
obstacle.name = @"obstacle0"; 
[self addChild:obstacle]; 
[obstacle runAction:[SKAction moveTo:CGPointMake(340, startPoint.y) duration:minTime +arc4random_uniform(maxTime - minTime)]]; 
float randomNum = arc4random_uniform(3.0) + 0.2; 
[self performSelector:@selector(createObstacle0) withObject:nil afterDelay:randomNum]; 
} 
    -(void)score0 { 

[self enumerateChildNodesWithName:@"obstacle0" usingBlock:^(SKNode *node, BOOL *stop) { 
    if (node.position.x > 330) { 
     score++; 
     scorelabel.text = [NSString stringWithFormat:@"%lu",(unsigned long)score]; 
     [node removeFromParent]; 
     [node removeAllActions]; 
    } 

}]; 
} 

가 있습니다. 모든 도움을 주셨습니다.

편집 : 충돌 방법

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
uint32_t collision = (contact.bodyA.categoryBitMask |  contact.bodyB.categoryBitMask); 
if (collision == (playerCategory | enemyCategory)) { 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setInteger:score forKey:@"playerScore"]; 
    [defaults synchronize]; 

    int highScore = [[[NSUserDefaults standardUserDefaults] objectForKey:@"High Score"] integerValue]; 
    if (highScore){ 
     if (highScore < score){ 
      [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"High Score"]; 
     } 
    } 
    else{ 
     [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"High Score"]; 
    } 

    [self removeAllChildren]; 

    SKTransition *reveal = [SKTransition fadeWithDuration:0.25]; 
    MGLCreateGameOverScene *scene = [MGLCreateGameOverScene sceneWithSize:self.view.bounds.size]; 
    scene.scaleMode = SKSceneScaleModeAspectFill; 
    [self.view presentScene:scene transition:reveal]; 

} 

} 

두 번째 편집 :

SKAction* removeObstacle = [SKAction removeFromParent]; 
[obstacle runAction:[SKAction sequence:@[move, removeObstacle]] completion:^{ 
    score++; 
    scorelabel.text = [NSString stringWithFormat:@"%lu",(unsigned long)score]; 
}]; 
+0

이 충돌 방식으로 부모에서 노드를 제거하십시오 도움이되기를 바랍니다 현재 SKScene

을 기각하지 않습니다. 또한 충돌을 선언하는 방법. 게시 한 메소드는 노드를 추가하고 점수를 추가합니다. –

+0

@XCodeMonkey는 내 score0 메소드의 removeFromParent 및 removeAllActions를 사용하여 메모리를 제거하지 않습니까? – user3552678

+0

게임에서 충돌이 어떻게 작동하는지 잘 모르겠지만 노드가 제거되면 일반적으로 작업이 완료되면 작동합니다. 충돌 후 노드를 제거하거나 작업이 완료되면 노드가 제거됩니다. 비록 코드의 일부만이 제공 될 때 솔루션을 제공하는 것이 어렵다는 것을 말해야 만합니다. 모든 조치를 제거하고 노드에서 제거가 작동해야하지만이 경우에는 작업이 종료되지 않습니다. 따라서 전체 장면을보고 더 나은 시각을 제공합니다. –

답변

-1

내가 같은 문제에 직면하고 내가 최선의 해결책은 배열과 전에 현재 SKScene의 모든 텍스처를로드하는 것입니다 발견 다른 SKScene [array removeAllObjects];로 전송합니다.

은 나와 함께 작동하지만 난이 당신

+0

광산은 여전히 ​​cooperate.http하지 않습니다 첫째 //postimg.org/image/9qd9i8y81/ – user3552678

+0

당신이있는 NSMutableArray가 TextureAtlas 외부 게임 의 모든 textureAtlas 및 이미지를 채울 수 있도록 배열에 다음과 같이로드 NSString * bgString = [[NSBundle mainBundle] pathForResource : [NSString stringWithFormat : @ "% @", 이름] ofType : @ "png"]; UIImage * bg = [UIImage imageWithContentsOfFile : bgString]; 텍스처 = [SKTexture textureWithImage : bg]; [배열 addObject : 텍스처]; 다음과 같이로드하십시오. [SKSpriteNode spriteNodeWithTexture : [array objectAtIndex : 0]; 그리고 SKScene의 끝에서 배열 – khaled

+0

에있는 모든 객체를 제거하면 내 두 번째 편집을 볼 수 있습니까? 처음으로 게임을 할 때 메모리가 안정적으로 유지됩니다. 메모리가 천천히 올라 가기 시작한 후 처음입니다. .두 번째 편집의 코드가 노드를 제거하기 때문에 액션이 완료 될 때만 생각합니다. 플레이어가 장애물을 치면 장면이 전환되고 화면에서 계속 움직이는 모든 장애물의 행동이 완료되지 않아 부모에게서 결코 제거되지 않습니다. 내가 어떻게 고칠 수 있니? – user3552678

관련 문제