내 게임에서 각각 다섯 개의 방법으로 동일한 장애물을 만듭니다. 나는 악기를 돌리고 어떤 이유로 그 장애물이 기억을 풀어주지 못한다는 것을 알았습니다. 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];
}];
이 충돌 방식으로 부모에서 노드를 제거하십시오 도움이되기를 바랍니다 현재 SKScene
을 기각하지 않습니다. 또한 충돌을 선언하는 방법. 게시 한 메소드는 노드를 추가하고 점수를 추가합니다. –
@XCodeMonkey는 내 score0 메소드의 removeFromParent 및 removeAllActions를 사용하여 메모리를 제거하지 않습니까? – user3552678
게임에서 충돌이 어떻게 작동하는지 잘 모르겠지만 노드가 제거되면 일반적으로 작업이 완료되면 작동합니다. 충돌 후 노드를 제거하거나 작업이 완료되면 노드가 제거됩니다. 비록 코드의 일부만이 제공 될 때 솔루션을 제공하는 것이 어렵다는 것을 말해야 만합니다. 모든 조치를 제거하고 노드에서 제거가 작동해야하지만이 경우에는 작업이 종료되지 않습니다. 따라서 전체 장면을보고 더 나은 시각을 제공합니다. –