2014-05-25 22 views
12

// UPDATE Beklendiği gibi çalışan güncellenmiş kod eklenmiştir. Aşağıdaki güncellenen kodda didSimulatePhysics yöntemine bakın. Benim durumumda, x ekseninde 0, x ekseninde mutlak sol ve sağda, yapılandırılabilir bir değer olduğunda x ekseninde sola veya sağa doğru bir karakter taşımakla ilgilenirim. Apple macera oyunu da çok yardımcı oldu.SpriteKit'te bir kamerayı taşıma

Apple SpriteKit ile çalışıyorum ve bunu davranmaya istediğiniz şekilde bir kamera uygulamak mücadele ediyorum ALTINDA

// ORİJİNAL POST. Kodda yaptığım şey, bir sprite karakteri, iki düğme ve başlangıçtaki görüntünün sağ dışına kapalı olan kırmızı bir kutu yüklüyor. Yapmak istediğim şey, karakterleri düğmelerle hareket ettirmek ve oyuncu ekranın ortasına veya sonuna ulaştığında, kamera görüntüde görülmeyen şeyleri ortaya çıkarmak için yeniden ayarlayacaktır. Bu yüzden sağa doğru hareket etmek, oyuncunun oraya varmasıyla başlangıçta görüşün dışında kalan kırmızı kutuyu göstermelidir. Ancak, aşağıda kullandığım kodla, fotoğraf makinesini koordinatları ana karaktere göre takip edip ayarlayamıyorum. Apple'ın gelişmiş sahne işleme dokümanı yanı sıra birkaç diğer yığın taşma mesajına baktım ama doğru şekilde görünmüyor. Eğer birileri size tavsiyede bulunabilirse takdir edilecektir.)

1 SKNode oluşturun ve myworld worldNode diyoruz:

#define cameraEdge 150 

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


     self.backgroundColor = [SKColor whiteColor]; 

     myWorld = [[SKNode alloc] init]; 
     [self addChild:myWorld]; 

     mainCharacter = [SKSpriteNode spriteNodeWithImageNamed:@"0"]; 
     mainCharacter.physicsBody.dynamic = YES; 
     mainCharacter.name = @"player"; 

     mainCharacter.position = CGPointMake(20, 20); 

     CGRect totalScreenSize = CGRectMake(0, 0, 800, 320); 

     SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(60, 60)]; 

      SKSpriteNode *boxTwo = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(60, 60)]; 
      SKSpriteNode *boxThree = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(60, 60)]; 
     boxThree.position = CGPointMake(40, 50); 

     [myWorld addChild:boxThree]; 

     boxTwo.position = CGPointMake(1100, 50); 

     box.position = CGPointMake(650, 50); 

     [myWorld addChild:box]; 
     [myWorld addChild:boxTwo]; 


     self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:totalScreenSize]; 

     self.physicsWorld.gravity = CGVectorMake(0, -5); 
     mainCharacter.name = @"mainCharacter"; 


     mainCharacter.physicsBody.linearDamping = 0; 
     mainCharacter.physicsBody.friction = 0; 
     mainCharacter.physicsBody.restitution = 0; 
     mainCharacter.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:mainCharacter.size]; 

     [myWorld addChild:mainCharacter]; 

     [self addChild:[self buildLeftButton]]; 
     [self addChild:[self buildRightButton]]; 

    } 

    return self; 
} 

- (void)didSimulatePhysics 
{ 
    SKSpriteNode *hero = mainCharacter; 

    if(hero) 
    { 
     CGPoint heroPosition = hero.position; 
     CGPoint worldPosition = myWorld.position; 

     NSLog(@"%f", heroPosition.x); 

     CGFloat xCoordinate = worldPosition.x + heroPosition.x; 

     if(xCoordinate < cameraEdge && heroPosition.x > 0) 
     { 
      worldPosition.x = worldPosition.x - xCoordinate + cameraEdge; 
      self.worldMovedForUpdate = YES; 
     } 

     else if(xCoordinate > (self.frame.size.width - cameraEdge) && heroPosition.x < 2000) 
     { 
      worldPosition.x = worldPosition.x + (self.frame.size.width - xCoordinate) - cameraEdge; 
      self.worldMovedForUpdate = YES; 
     } 

     myWorld.position = worldPosition; 
    } 
} 

-(SKSpriteNode *)buildLeftButton 
{ 
    SKSpriteNode *leftButton = [SKSpriteNode spriteNodeWithImageNamed:@"left"]; 
    leftButton.position = CGPointMake(20, 20); 
    leftButton.name = @"leftButton"; 
    leftButton.zPosition = 1.0; 
    return leftButton; 
} 

-(SKSpriteNode *)buildRightButton 
{ 
    SKSpriteNode *leftButton = [SKSpriteNode spriteNodeWithImageNamed:@"right"]; 
    leftButton.position = CGPointMake(60, 20); 
    leftButton.name = @"rightButton"; 
    leftButton.zPosition = 1.0; 
    return leftButton; 
} 


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    SKNode *node = [self nodeAtPoint:location]; 

    if([node.name isEqualToString:@"leftButton"]) 
    { 
      [mainCharacter.physicsBody applyImpulse:CGVectorMake(-120, 0)]; 
    } 

    else if([node.name isEqualToString:@"rightButton"]) 
    { 
     [mainCharacter.physicsBody applyImpulse:CGVectorMake(120, 10)]; 
    } 
} 

cevap

22

görünümü istiyorsanız

enter image description here daima akılda bu puan ile kodunuzu değiştirmek, oyuncunun pozisyonuna merkezli olmak ya da bunun gibi başka bir isim.

2) worldNode [self addChild:worldNode];

3) senin çalar gibi, worldNode diğer tüm düğümleri ekleyin. Kişisel görünümü artık her zaman oyuncunun pozisyonuna

worldNode.position = CGPointMake(-(player.position.x-(self.size.width/2)), -(player.position.y-(self.size.height/2))); 

merkezli olacak: didSimulatePhysics yöntemde

4), bu kodu ekleyin.

Güncelleme Mayıs 2015:

Çinili Map Editor ile oluşturulan bir harita kullanıyorsanız, özgür SKAToolKit framework kullanabilirsiniz. Özellikler kamera otomatik takip, test oyuncu, test HUD ve hareketli düğmeler içerir.

+0

Yanıtladığınız için teşekkürler. Önerilen değişiklikleri yansıtacak şekilde orijinal gönderideki kodu değiştirdim. Ancak, bu karakter sağ üst kısımda görünür ve hareket düğmeleri kaybolur. Geçerli görünüm içinde hareket düğmelerini sabitlemem gerektiğini düşünüyorum, bu nedenle görünümler ayarlandığında hareket eder, ancak düğmelerin sahneye, dünyaya veya kameraya bağlanması gerektiğinden emin değiller. – zic10

+0

@ zic10 - Kontrol düğmelerini doğrudan hareket etmeyecek şekilde ekleyebilirsiniz. Merkez konumunu oynatıcınıza göre değiştirmeniz gerekiyorsa, ofset değerleri ekleyebilirsiniz. Örneğin: ((player.position.x- (self.size.width/2) +20) ofset +20'dir. – sangony

+1

Bu, kamera düğümünden vazgeçip myWorld düğümündeki her şeyi yapabildiğim anlamına mı geliyor? – zic10