2014-02-15 1 views
1

플레이어의 원형 모양 (SKShapeNode * circle)과 적을 .png 파일로 변경했습니다. 플레이어와 적을 .png 파일로 변경하기 전에 충돌 후 폭발 효과가있었습니다. 그러나 .png 파일로 변경하면 폭발 효과가 더 이상 발생하지 않습니다. 예, 이미지가 충돌하여 기본적으로 충돌이 있음을 보여줍니다. 그러나 서로 충돌 한 후 폭발 효과는 더 이상 나타나지 않습니다. 다시 구현하려면 어떻게해야합니까? 고마워요!플레이어와 적을 SKShapeNode에서 .png 파일로 변경 한 후 충돌 효과 (폭발)가 더 이상 작동하지 않습니다.

#import "GameScene.h" 
    #import "CGVector+TC.h" 
    #import "ORBMenuScene.h" 


enum { 
    CollisionPlayer = 1<<1, 
    CollisionEnemy = 1<<2, 
    }; 

    @interface GameScene() <SKPhysicsContactDelegate> 
    @end 




@implementation GameScene 
{ 
    BOOL _dead; 
    SKNode *_player; 
    NSMutableArray *_enemies; 

    SKLabelNode *_scoreLabel; 


} 


-(id)initWithSize:(CGSize)size { 
    if (self = [super initWithSize:size]) { 
     /* Setup your scene here */ 

     self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0]; 


     self.physicsWorld.gravity = CGVectorMake(0.0f, 0.0f); 
     self.physicsWorld.contactDelegate = self; 


     _enemies = [NSMutableArray new]; 


     _player = [SKNode node]; 
     _player = [SKSpriteNode spriteNodeWithImageNamed:@"Player.png"]; 
     _player.position = CGPointMake(size.width/2, size.height/2); 
     _player.physicsBody.dynamic = YES; 
     _player.physicsBody.mass = 0.2; 
     _player.physicsBody.categoryBitMask = CollisionPlayer; 
     _player.physicsBody.contactTestBitMask = CollisionEnemy; 
     _player.physicsBody.collisionBitMask = CollisionEnemy; 
     _player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10]; 
     _player.position = CGPointMake(size.width/2, size.height/2); 
     _player.physicsBody.allowsRotation = YES; 
     _player.physicsBody.usesPreciseCollisionDetection = YES; 
     _player.name = @"Player"; 
     [_player setScale:1]; 

     [self addChild:_player]; 



    } 
    return self; 
} 

- (void)didMoveToView:(SKView *)view 
{ 
    [self performSelector:@selector(spawnEnemy) withObject:nil afterDelay:1.0]; 
     } 

-(void)spawnEnemy 
{ 
    [self runAction:[SKAction playSoundFileNamed:@"Spawn.wav" waitForCompletion:NO]]; 

    SKNode *enemy = [SKNode node]; 
    enemy = [SKSpriteNode spriteNodeWithImageNamed:@"Enemy.png"]; 
    enemy.physicsBody.categoryBitMask = CollisionEnemy; 
    enemy.physicsBody.contactTestBitMask = CollisionPlayer; 
    enemy.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:6]; 
    enemy.physicsBody.collisionBitMask = CollisionPlayer; 
    enemy.physicsBody.allowsRotation = YES; 
    enemy.physicsBody.dynamic = YES; 
    enemy.name = @"Enemy"; 
    [enemy setScale:0.5]; 



    CGFloat x = arc4random() % 70 + self.size.width/2; 
    CGFloat y = arc4random() % (int) self.size.height; 

    if (arc4random() % 2 == 0) 
     x = self.size.width/2 + x; 
    else 
     x = self.size.width/2 - x; 

    enemy.position = CGPointMake(x, y); 


    [_enemies addObject:enemy]; 
    [self addChild:enemy]; 

    if(!_scoreLabel) { 
     _scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"Courier-Bold"]; 

     _scoreLabel.fontSize = 200; 
     _scoreLabel.position = CGPointMake(CGRectGetMidX(self.frame), 
              CGRectGetMidY(self.frame)); 
     _scoreLabel.fontColor = [SKColor colorWithHue:0 saturation:0 brightness:1 alpha:0.5]; 
     [self addChild:_scoreLabel]; 
    } 
    _scoreLabel.text = [NSString stringWithFormat:@"%02d", _enemies.count]; 

    if (_enemies.count == 18) { 
     [self runAction:[SKAction sequence:@[ 
              [SKAction waitForDuration:99999], 
              [SKAction performSelector:@selector(spawnEnemy) onTarget:self], 
              ]]]; 
    } 
    else { 
     [self runAction:[SKAction sequence:@[ 
              [SKAction waitForDuration:1], 
              [SKAction performSelector:@selector(spawnEnemy) onTarget:self], 
              ]]]; 
    } 

} 

-(void)dieFrom: (SKNode*)killingEnemy 
{ 
    _dead = YES; 

    SKEmitterNode *explosion = [SKEmitterNode orb_emitterNamed:@"Explosion"]; 
    explosion.position = _player.position; 
    [self addChild:explosion]; 

    [explosion runAction:[SKAction sequence:@[ 
     [SKAction playSoundFileNamed:@"Explosion.wav" waitForCompletion:NO], 
     [SKAction waitForDuration:0.4], 
     [SKAction runBlock:^{ 
      // TODO: Revove these more nicely 
      [killingEnemy removeFromParent]; 

      [_player removeFromParent]; 
     }], 
     [SKAction waitForDuration:0.4], 
     [SKAction runBlock:^{ 
      explosion.particleBirthRate = 0; 
      }], 
      [SKAction waitForDuration: 1.2], 

     [SKAction runBlock:^{ 
      ORBMenuScene *menu = [[ORBMenuScene alloc] initWithSize:self.size]; 
     [self.view presentScene:menu transition:[SKTransition doorsCloseHorizontalWithDuration:0.4]]; 
     }], 
     ]]]; 

} 


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self touchesMoved:touches withEvent:event]; 

} 

-(void)touchesMoved: (NSSet *) touches withEvent:(UIEvent *)event 
{ 
    [_player runAction:[SKAction moveTo:[[touches anyObject] locationInNode:self] duration:.01]]; 
} 

-(void)update:(CFTimeInterval)currentTime 
{ 
    CGPoint playerPos = _player.position; 

    for(SKNode *enemyNode in _enemies) 
    { 
     CGPoint enemyPos = enemyNode.position; 

     /* Uniform speed: */ 
     CGVector diff = TCVectorMinus(playerPos, enemyPos); 
     CGVector normalized = TCVectorUnit(diff); 
     CGVector force = TCVectorMultiply(normalized, 4); 

     [enemyNode.physicsBody applyForce:force]; 

    } 

    _player.physicsBody.velocity = CGVectorMake (0, 0); 

    } 
-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    if(_dead) 
      return; 

    [self dieFrom:contact.bodyB.node]; 
    contact.bodyB.node.physicsBody = nil; 

    } 

@end 
+0

beginContactGet이 호출 되었습니까? –

+0

이봐, 난 그냥 내 didbeginContact 메서드에 NSLog 추가 시도하고 플레이어와 적을 서로 충돌했을 때 메서드가 호출되지 않는 것을 알고 놀랐습니다. 나는 이유를 모른다. 너/누군가가 이걸 도와 줄 수 있니? 고맙습니다. – mitosis

답변

1

속성을 설정하기 전에 physicsBody을 초기화하지 않은 것 같습니다.

플레이어 또는 적을 생성 한 후에는 사용할 신체를 먼저 초기화해야합니다. 그렇지 않으면 노드가 물리 시뮬레이션에 전혀 참여하지 않는다는 것을 나타내는 nil이됩니다. 그리고 모든 속성 설정은 쓸모 없을 것입니다.

이것은 당신을 위해해야합니다, 적에 대한 그 라인을 이동하는 것을 잊지 마세요!

_player = [SKSpriteNode spriteNodeWithImageNamed:@"Player.png"]; 
    _player.position = CGPointMake(size.width/2, size.height/2); 

    _player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10]; 

    _player.physicsBody.dynamic = YES; 
    _player.physicsBody.mass = 0.2; 
+0

오, 그래서 내가 놓친 것입니다. 방금 명령을 재정렬하고 방금 모든 차이를 만들었습니다. 고맙습니다. – mitosis

관련 문제