2016-01-18 37 views
9

sprite düğümleri uygulama çalıştırıyor olursa olsun görünüm boyutu orantılı ölçek böylece manzara uygulaması, evrensel olmak yapmak istiyorum. IB'yi sevmediğim için tamamen programatik çözümünü tercih ediyorum.SpriteKit ile iOS Evrensel Cihaz Uygulaması, tüm görünümler için düğümleri nasıl ölçeklendirmeli?

Oyunum oldukça basit ve kaydırma veya yakınlaştırmaya gerek yok, bu yüzden oyunun tamamı her zaman mevcut olacak ve tüm manzarayı alacak.

Aradığım şey manzaranın boyutunu değiştirmek için manzaranın boyutunu değiştirmek mümkün mü? Eğer öyleyse benim bakış denetleyicisi

if let scene = GameScene(fileNamed:"GameScene") 

bu bölümünü değiştirerek denedim çünkü baştan sona açıklayabilir parametre olarak boyutunu alır ama Xcode o sevmez yapıcı yöntemi olmak.


şeyler ben self.view.bounds.width/yükseklik kesirler kullanma

  1. denedim. Bu, genellikle tüm iPhone'ların iyi görünmesini sağlar, ancak iPad'lerde düğümleri ve çerçeve etrafındaki sınır kutusunu genişletir ve eğrir.
  2. Dört tür arasında scaleMode'un değiştirilmesi. İyi bir uygulama ve iyi hissetmek isterdim. Uygulamamı yapmam gereken, ancak önerilere açık olan bir şey olan Dil Önlüğü (varsayılan). Not; Herhangi bir cihazda siyah kenarlar istemiyorum, sadece tüm görünüm orantılı olarak görüntülendi/ölçeklendi.
  3. Programsal kısıtlamalar uygulama. Şimdi bu konuda oldukça yeniyim ve kısıtlamaları tamamen anlamadım, fakat RayWenderlich'den bile düğümlerdeki kısıtlamalar hakkında konuştuğum hiçbir öğretici yok, bu yüzden bu konuya derinden değinmedim.
  4. Görünümler arasında noktaları dönüştürmek için böyle bir yöntem kullanın. Bu aslında düğüm noktalarının konumlandırılması için oldukça iyi çalıştı ve eğer mümkünse bu yöntemin işe yaramasını isterdim, ama sonra hala düğüm büyüklükleri problemi var. Ayrıca, bu yöntemle iPad için oluşturduğumda, görünüm portre olarak başlıyor ve düğümler iyi görünüyor, ancak sonra bunu manuel olarak manzaraya, sprite'lara ve sınırlara bakmam gerekiyor.

    func convert(point: CGPoint)->CGPoint { 
        return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self) 
    } 
    
  5. Sayısız vid RW üzerinde öğreticiler ve diğer her yerde internette: İşte bir yöntem.

Şimdiden teşekkürler! Yardımı takdir ediyorum. Bu konunun garip olduğunu biliyorum çünkü bir çok insan bu konuda sorular soruyor, ancak herkesin durumu bir çözümün hepsine uymadığından yeterince farklı görünüyor.

cevap

9

Başlangıçta 2 oyunla kendimi ölçeklendirmeyi denedim ve bu sadece delilikti (sahne boyutu = görünüm boyutu veya sahne ölçeği modu = .ResizeFill). Tüm cihazlar için tüm değerleri, örneğin yazı tipi boyutu, hareketli boyutları, dürtüleri vb. Ayarlamak zorundasınız ve asla tutarlı olmayacaktır.

Yani 1024X768 (yatay) ya da 768x1024 (dikey) için 2 seçeneğiniz temelde

1) belirle sahne boyutu var. Bu, Xcode 7'deki varsayılan ayardır.

Genellikle iPhone'larda kırpılan iPad'lerde üst/alt (manzara) veya sol/sağ (portre) üzerinde ekstra arka plana sahip olursunuz. iPhone'larda/kırpma iPad'lerde fazla göster oyunların

Örnekler:

Altos Macera, Leos Fortune, Araf, Hat Zen, Apple varsayılan sahne değişti 5.

2) Modern Combat xCode 8 ila iPhone 6/7 (750 * 1334-Portait, 1337 * 750-Landscape) boyutunda. Bu ayar, oyununuzu iPad'lerde kırpacak. iPad'lerde az göstermek oyunların

Örnekler:

Lumino City, robot unicorn saldırı

2 seçenek arasındaki Chosing size bağlıdır ve yapıyoruz ne oyun bağlıdır. Genellikle 1 numaralı seçeneği kullanmayı ve iPad'lerde daha fazla arka plan göstermeyi tercih ederim.

Sahne boyutu ölçeğinden bağımsız olarak, mod, .aspectFill öğesinin varsayılan ayarında genellikle en iyi durumda kalır.

vb etiketleri Eğer bu şekilde

if UIDevice.current.userInterfaceIdiom == .pad { 
    ... 
} 

Sen kendini ölçekleme sahne deneyin yeni SpriteKit numune oyun projesi oluşturabilir yapabileceği gibi belirli şeyleri ayarlamak için. Tüm iPhone'larda çalışın ve HelloWorld etiketinin tüm cihazlarda mükemmel görüneceğini fark edeceksiniz.

Şimdi varsayılan ayarları sahne boyutu = çerçeve olarak değiştirin veya .ResizeFill kullanın, HelloWorld etiketi artık tüm aygıtlarda düzgün ölçeklenmez. Bir yan not olarak

, çizgi

if let scene = GameScene(fileNamed: "GameScene") 

referanslar GameScene.sks dosyası. Bu nedenle muhtemelen GameScene.sks dosyayı silmek ve çizgi değiştirebilir, programlama yoluyla her şeyi söyleyen

let skView = view as! SKView! 
let scene = GameScene(size: CGSize(width: 1024, height: 768)) // 768 x 1024 if portrait 

Güncelleme: Ben adapte sorunları vardı ben şimdi biraz farklı bir varyantı kullanıyorum

iPhoneX için oyunum. Sahne boyutunu 1334x750 olarak ayarlıyorum ve görünüm uyumunu ölçek modu olarak kullanıyorum. Daha fazla arka plan göstermeyi tercih ettiğim için örneğin iPad veya iPhone X gibi siyah çubukları kaldırmak için bazı kodları çalıştırıyorum. Bu harika makaleye dayanıyor.

http://endlesswavesoftware.com/blog/spritekit-skscene-scalemode/

+2

Yardımın için teşekkürler! Bunu doğru bir şekilde işaretledim çünkü sorunum için geçerli bir çözüm içeriyor. Ancak başka bir şekilde çözdüm ve bu yöntemi kullanacağım: info.plist'imde iphone ve ipad için ekran yönelimlerinin olduğunu ve ipad için dikey görünümlerin hala orada olduğunu belirttim. Onları listeden çıkardım. Bundan sonra, sahne.size'yi skView.bounds.size olarak ayarladım ve bu iki şey de onu düzeltmek zorunda kaldı (diğer ikisi de programı kırmayacaktır). Şimdi, görünüme göre düğümleri konumlandırmaya ve ölçeklemeye devam ediyorum ve her şey iyi çalışıyor. – ljs

+2

İşaretleme için teşekkürler. Evet, plisteki manzara maddelerini aradığının farkında değildim. Xcode'ta portre seçimini kaldırmamış olsanız bile, bu 2 girdinin kalması biraz garip, başımda birçok baş ağrısına neden oldu. Mutlu kodlama – crashoverride777