2011-07-13 18 views
5

Cocos2d ile karo tabanlı 2d RPG yapıyorum. Haritalarım için CCTMXTileMaps kullanıyorum. Oyuncum ekran üzerinde ortalanır ve harita etrafında hareket eder (oyuncu haritanın kenarına doğru yürürken, merkezden uzaklaşıp gerçekte hareket etmeleri dışında). Bu sistem büyük haritalarda iyi çalışır. Ancak küçük haritalarda, harita ekranın sağ üst köşesine sabitlenir. Mekaniği hala çalışırken, bu küçük haritaların otomatik olarak ortalanmasını sağlamak güzel olurdu.Küçük bir CCTMXTileMap'i cocos2d'de nasıl merkezleyebilirim?

Ekran boyutlarının ortalanmasından daha küçük olan haritaları nasıl yapabilirim? Haritanın "kırmızı kutuda" ortalanmasını istiyorum.

Yani teoride nasıl yapılacağını anladım, ama ben:

enter image description here

DÜZENLEME (. Kırmızı kutu o kodda aslında orada değil, gösterim amaçlı sadece burada) koordinat sistemini anlamada sorun yaşıyorum. Haritayı ortalamak için aşağıdaki kodu kullanıyorum ama beklendiği gibi davranmıyor. Harita ekrandan çıkıyor.

if ((self.tileMap.contentSize.height < screenSize.height) && (self.tileMap.contentSize.width < screenSize.width)) { 

    CGSize winSize = [[CCDirector sharedDirector] winSize]; 
    CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2);   


    CGPoint centerOfMap = CGPointMake((self.tileMap.mapSize.width*self.tileMap.tileSize.width)/2, (self.tileMap.mapSize.height*self.tileMap.tileSize.height)/2); 

    self.tileMap.anchorPoint = centerOfMap; 
    self.tileMap.position = centerOfView; 

} 

Burada yanlış yapıyorum?

+0

"bir şeyi kırmak" tanımlamak, ister istemez çöküyor veya davranmıyor mu? –

+0

@FraserGraham Düzenlendi. Çalışıyor, ama istediğim gibi davranmıyor. – Moshe

cevap

0

Tamam, çözüm birkaç şey eksik olmasına rağmen oldukça basit. Eğer sahne başına bir harita yüklerseniz

// 
    // Get the center of the 
    // screen/map layer (which are the same) 
    // 

    CGPoint centerOfSelf = CGPointMake(self.contentSizeInPixels.width/2, self.contentSizeInPixels.height/2); 

    // 
    // Position the map in the center 
    // 

    tileMap.position = CGPointMake(centerOfSelf.x - (tileMap.contentSizeInPixels.width/2), centerOfSelf.y - (tileMap.contentSizeInPixels.height/2)); 

yukarıda belirtilen kod çalışacaktır: ebeveyn haritayı ortalamak için en temel kod budur. Ancak, haritaları ve ilgili verileri yükleyen bir "dünya" sahnesine sahipseniz, bazı şeyleri biraz farklı yapmanız gerekir. Gördüğünüz gibi, ekrandan daha büyük bir haritanın yüklenmesi, katmanın "esnetilmesine" ve büyük haritayı sığacak şekilde yeniden boyutlandırmasına neden olur. Bunu yaparken, yukarıdaki kod "gerilmiş" harita sahnesinde merkezler oluşturur ve sonradan yüklenir. Yani, buna karşı koymak için, öncelikle ekranın boyutuna uyacak şekilde "dünya sahnesini" katmanını yeniden boyutlandırmak zorundayım. Bizim ana karakteri aşağıdaki uzağa hareket ettik durumda, ben de geri 0,0 pozisyona "kamera" hareket

Not: Bunu yapmak için, aşağıdaki kodu kullanabilirsiniz.

İlgili konular