İlk Android oyununuzu Corona SDK ile yazmak

Yazar: Randy Alexander
Yaratılış Tarihi: 1 Nisan 2021
Güncelleme Tarihi: 26 Haziran 2024
Anonim
Android Mobil Oyun Geliştirme #1 - Java İle Mobil Oyun Yapıyoruz #Türkçe
Video: Android Mobil Oyun Geliştirme #1 - Java İle Mobil Oyun Yapıyoruz #Türkçe

İçerik


Google Play Store'daki en popüler kategori her zaman Oyunlar olmuştur. Muhtemelen hepimiz bir web tarayıcısı, bir e-posta istemcisi ve bir anlık mesajlaşma uygulaması gibi önemli üretkenlik uygulamalarını kullanmamıza rağmen, oyun hala mobil deneyimin önemli bir parçası olmaya devam ediyor. Bu yüzden Android için geliştirmeyi öğrenmek isteyen birçok insanın bir oyun yaparak başlamak istemesi şaşırtıcı değildir. Ayrıca dürüst olalım, bir oyun yazmak bir verimlilik uygulaması geliştirmekten daha eğlenceli bir yük!

Android'in resmi dili Java ve resmi geliştirme ortamı Android Studio'dur. Eğer Java'ya bakmak istiyorsanız, Java temel bilgileri öğreticimizi öneririm ve Android Studio kullanarak nasıl bir uygulama yazacağınızı öğrenmek istiyorsanız, ilk Android uygulamanızı yazma konusundaki öğreticimizi incelemenizi öneririz. Ancak, Java ve Android stüdyosu Android için geliştirmenin tek yolu değildir. Mevcut diller ve SDK'lara genel bir bakış kılavuzumuzda bulunabilir: Android Uygulamaları geliştirmek istiyorum - Hangi dilleri öğrenmeliyim?


Programlama dilleri kılavuzunda belirtilen SDK'lardan biri, öncelikle oyun yazmak için tasarlanmış üçüncü taraf bir SDK olan Corona'dır. Java yerine, Corona, öğrenmesi kolay ve güçlü bir komut dosyası dili olan Lua'yı kullanır. Bununla birlikte, Corona, Lua'yı kullanan tek mobil oyun SDK'sı değildir, diğer iyi bilinen örnekler arasında Cocos2d-X, Marmalade ve Gideros sayılabilir.

İndir ve yükle

Corona'ya başlamak için SDK'yı indirip yüklemeniz gerekecektir. Corona web sitesine gidin ve indirme düğmesine basın. Kiti indirmeden önce bir hesap oluşturmanız gerekir (ücretsizdir). Yalnızca emülatörde programınızı çalıştırmak yerine gerçek bir .apk dosyası oluşturmak istiyorsanız, Java 7'yi yüklemeniz gerekir, ancak Android SDK'yı yüklemeniz gerekmez. Java 7 Geliştirme Seti'ni yüklemek için Oracle web sitesine gidin, “Java SE Geliştirme Seti 7u79 ″ adlı bölümü arayın ve PC'nizin sürümünü indirin.


Corona'yı kurduktan sonra aktif hale getirmelisin. Bu tek seferlik bir süreçtir ve ücretsizdir. Corona Simulator'ı başlatın ve lisansı kabul edin. İndirmek için kullandığınız e-posta adresini ve şifreyi girin ve Giriş'i tıklayın.

Projeye başlamak

Corona Simulator içinden “Yeni Proje” ye tıklayın. “Uygulama Adı:” alanına uygulamanız için bir ad girin ve ayarların geri kalanını varsayılan ayarlarında bırakın. “Tamam” ı tıklayın.

Şimdi üç pencere görünecek. İlk ikisi, Corona Simulator ve Corona Simular Output. Corona ayrıca projeniz için dosyaları gösteren bir dosya gezgini penceresi açacaktır.

Proje dizinindeki dosyaların çoğu (bazıları 23) uygulama simgesi içindir! Şu an bizim için en önemli dosya main.lua, burası bizim app kodunu yazacağımız yer.

Lua'ya Giriş

Kodu yazmaya başlamadan önce, bir Lua ıslık durağı turu yapmamız gerekiyor. Lua tercümanı (bunun bir betik dili olduğunu unutmayın, derlenmiş bir dil değil) Windows, OS X ve Linux için kullanılabilir. Ancak, Corona'da yerleşik olarak bulunur, bu nedenle şu anda fazladan bir şey yüklemeniz gerekmez. Lua ile oynamanın en kolay yolu çevrimiçi canlı demosu kullanmaktır.

Çevrimiçi olarak Lua hakkında birçok iyi eğitim bulacaksınız ve Lua Referans El Kitabı, Lua'daki Programlama, The.Lua.Tutorial ve The Tutorials Point Lua Tutorial'a göz atmanız gerekir.

İşte size Lua'nın temel özelliklerinden bazılarını gösterecek olan küçük bir Lua programı:

yerel işlev doubleIt (x) i = 1,10,1 için x * 2 sonunu döndürür, x = doubleIt (i) (x == 10) ise sonra ("ten") yazdırır, başka bir şey yazdırılır (doubleIt (i)) bitiş sonu

Yukarıdaki kod üç önemli Lua yapısını gösterir: fonksiyonlar, döngüler ve if ifadeleri. İşlev doubleIt () çok basit, sadece parametre içinde geçirilen iki katına x.

Ana kod bir için 1'den 10'a kadar olan döngü doubleIt () Her yineleme için. Dönüş değeri 10 ise (örneğin, ne zaman ben 5) daha sonra kod “on” yazıyor, aksi takdirde sadece doubleIt ().

Herhangi bir kodlama deneyiminiz varsa, örnek kodun takip etmesi kolay olmalıdır. Bazı temel programlamayı öğrenmek istiyorsanız, size becerilerinizi geliştirmek için yukarıda verilen kaynaklardan bazılarını kullanmanızı öneririm.

Oyun yazma

Corona'da temel programlar yazmak basittir. Sadece bir dosyayla ilgilenmen gerekiyor, main.lua, ve Corona'nın bütün ağır kaldırma işlerini yapmasına izin ver. Yazacağımız oyun basit bir "musluk" oyunudur. Bir balon veya bir bomba ekrandan aşağı başarısız olur. Eğer oyuncu balona hafifçe vurursa, bir puan kazanırlarsa, bir bombaya dokunurlarsa, puan penaltı olarak 2'ye bölünür. Kodu yazmak için düzenlemelisiniz main.lua. Bunu herhangi bir metin düzenleyicide yapabilirsiniz.

Corona SDK, inşa oyunlarını çok kolaylaştıran yerleşik bir 2D fizik motoruna sahip. Oyunu yazmanın ilk adımı fizik motorunu başlatmak:

yerel fizik = zorunlu ("fizik") physics.start ()

Kod oldukça açıklayıcı. Modül fiziği yüklenir ve başlatılır, değişkene atanır fizik. Motoru etkinleştirmek içinphysics.start () denir.

Daha sonra sadece bu basit oyun için değil, daha karmaşık oyunlar için de faydalı olacak bazı faydalı değişkenler yaratacağız. halfW ve halfH ekran genişliğinin yarısı ve ekran yüksekliğinin yarısı için değerleri tutun:

halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5

Görüntüle nesne, Corona'nın küresel olarak erişilebilir kıldığı önceden tanımlanmış bir nesnedir.

Şimdi ekranda bir şeylerin gerçekleşmesini sağlayan ilk adım geliyor:

yerel bkg = display.newImage ("night_sky.png", halfW, halfH)

Gibi özellikleri gibi contentHeight ve contentWidth, Görüntüle Nesnenin ayrıca birçok yararlı işlevi vardır. yeni görüntü() işlevi bir görüntü dosyasını okur (bu durumda bir .png) ve ekranda görüntüler. Görüntüleme nesneleri katmanlar halinde oluşturulur, bu yüzden bu ekrana koyduğumuz ilk görüntü olduğundan, o zaman her zaman arka plan olacaktır (kod açıkça bunu değiştirmek için bir şey yapmazsa). Parametreleri halfW ve halfH Corona'ya görüntüyü ortasına koymasını söyle.

Bu noktada kodu emülatörde çalıştırabilir ve arka plan resmini görebilirsiniz. Dosyayı kaydederseniz öykünücüsü dosyanın değiştiğini ve yeniden başlatmayı önerdiğini fark eder. Bu olmazsa, Dosya-> Yeniden Başlat'ı kullanın.

Kullanıcı balonlara dokunmak için puan toplayacağından, bir puan değişkeni başlatmalı ve skoru ekranda göstermeliyiz:

puan = 0 scoreText = display.newText (puan, yarıW, 10)

Puan, yaratıcı olarak adlandırılmış değişkende tutulacak. Gol,ve scoreText skoru gösteren nesnedir. Sevmek yeni görüntü(), newText () Bu durumda, ekrana bir şey koyun. Dan beri scoreText küresel bir değişkendir, o zaman metni herhangi bir noktada değiştirebiliriz. Ama yakında buna başlayacağız.

Emülatörü yeniden başlatabilir ve ekranın üst kısmına doğru 0 ekranın skorunu görebilirsiniz.

Sol: Sadece arka plan. Sağ: Geçmiş ve puan.

Şimdi biraz daha zor bir şey geliyor, ama endişelenmeyin, satır satır açıklayacağım:

local function balloonTouched (event) eğer (event.phase == "started") sonra Çalışma Zamanı: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = skor bitiş sonu

Yukarıdaki kod, adı verilen bir işlevi tanımlar. balloonTouched () Balon her dokunulduğunda bunun adı verilir. Corona'ya her dokunuşta bu işlevi çağırmasını henüz konuşmadık, bu daha sonra gelecek, ancak bunu yaptığımızda çağrılan işlev budur.

Dokunma veya dokunma olaylarının, sürüklemeyi desteklemek için birçoğu vardır. Kullanıcı parmağını bir nesnenin üzerine koyuyor, bu “başladı” aşaması. Parmaklarını herhangi bir yöne kaydırırlarsa, bu “taşınan” fazdır. Kullanıcı parmağını ekrandan kaldırdığında, bu "son" aşamasıdır.

İlk satır balloonTouched () kontroller “başladı” aşamasındayız. Balonu kaldırmak ve mümkün olan en kısa sürede puanı arttırmak istiyoruz. İşlev “sonlandırılmış” gibi diğer fazlar için tekrar çağrılırsa, işlev hiçbir şey yapmaz.

İçindeEğer deyimi dört kod satırıdır. İlk önce son ikisi ile ilgilenelim, çünkü daha basitler.puan = puan + 1 sadece puanı birer birer artırır vescoreText.text = puan Yeni puanı yansıtmak için ekrandaki puan metnini değiştirir. Bunu nasıl söylediğimi hatırlascoreText küreseldi ve her yerden erişilebilirdi, burada yaptığımız şey bu.

Şimdi ilk iki satır için. Bir balon ya da bomba ekranın altına düştüğünde, uygulamanın hafızasında hala var olur, onu göremezsiniz. Oyun ilerledikçe ekran dışı nesnelerin sayısı giderek artacaktır. Bu nedenle, gözle görülür olmayan nesneleri silen bir mekanizmaya ihtiyacımız var. Bunu bir işlevde yapıyoruz.ekran dışındaHenüz yazmadık. Bu fonksiyon, oyun sırasında kare başına bir kez çağrılacak. Bir balona dokunulduğunda, onu silmemiz ve balonun ekrandan çıkıp çıkmadığını kontrol eden aramayı silmemiz gerekir.

Çizgievent.target:removeSelf () balonu siler. Bir dokunma olayı gerçekleştiğinde, dinleyici işlevinin parametrelerinden biriEtkinlik parametre. Olayla ilgili işlevi ve bunun ne tür bir olay olduğunu anlatır;event.phase. Ayrıca bize hangi balonun vurulduğunu da söyler.event.target. removeSelf () işlev ne diyorsa onu yapar, nesneyi siler (bu durumda bir balon).

Ondan önceki satır, balonun ekranın altından düşüp düşmediğini görmek için her kareye çağrılan işlev olan “enterframe” dinleyicisini kaldırır. Yazmaya geldiğimizde buna daha detaylı bakacağız.ekran dışında dinleyici işlevi

Yani, özetlemek için.balloonTouched ()bunun dokunma dizisinin başlangıcı olduğunu kontrol eder. Daha sonra, balonun ekranın altından düşüp düşmediğini görmek için her kareye çağrılan işlev olan “enterframe” dinleyicisini kaldırır. Daha sonra balonu siler, puanı arttırır ve yeni puanı görüntüler.

Balonlar içindi, şimdi bombalar için benzer bir şeye ihtiyacımız var:

yerel işlev bombToTohed (event) eğer (event.phase == "başladı") sonra Çalışma Zamanı: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = puan sonu

Gördüğünüz gibi, kod puan arttırmak yerine puan 0 ile çarpılır (yani 2'ye bölünür) istisnasıyla çok benzer. math.floor () işlevi, puanı en yakın tam sayıya yuvarlar. Bu yüzden oyuncu 3'lük bir puan aldıysa ve bir bombaya dokunduysa, yeni puan 1.5 değil 1 olur.

Bahsettim ekran dışında () daha önce işlev gör. Bir nesnenin ekrandan çıkıp çıkmadığını kontrol etmek için bu fonksiyon her kareye çağrılır. İşte kod:

yerel işlev offscreen (öz, olay), eğer (öz.y == nil) sonra son (geri) sonunu döndür (öz .y> display.contentHeight + 50) sonra Çalışma Zamanı: removeEventListener ("enterFrame", öz) öz: removeSelf () end end

Hesaplamada, yarış koşulu olarak bilinen bir durum var. Burası iki şeyin olacağı yer, ancak biri önce olabilir, bazen biri önce olur. Bu bir yarış. Bazı yarış koşulları görülmez çünkü bir şey her zaman önce görülür, ancak bir günde ilginç hatalara neden olabilirler, doğru koşullar altında, önce diğer şey olur, sonra sistem bozulur!

Bu basit oyunda bir yarış koşulu var çünkü birbirine çok yakın iki şey olabilir: bir balonun vurulması ve ekran dışında () Balonun ekrandan çıkıp çıkmadığını görmek için çağrılan işlev. Sonuç, balonu silme kodunun aranabilmesi ve ardından ekran dışında () işlev çağrılır (saniyede 30 kez gerçekleşir). Bu garip olaylar dizisini aşmak için ekran dışında () işlevin y nesnenin değeri sıfır (boş) veya değil. Öyleyse sıfır öyleyse nesnenin zaten silinmiş olduğu anlamına gelir, o yüzden devam edin, bunlar aradığımız droidler değil.

Nesne hala oyundaysa, ekranından 50 piksel geçtiyse konumunu kontrol edin, ardından silin ve dinleyiciyi çıkarın. ekran dışında () işlev bu nesne için tekrar çağrılmaz. Bundan emin olmak için gereken kodekran dışında () her kareye bir sonraki kod bölümünün bir parçası denir.

Bu oyunun tüm dayanağı, yeni balonların veya bombaların ekranı düşürmeye devam etmesi. Dolayısıyla yeni bir balon ya da yeni bir bomba yaratacak bir işleve ihtiyacımız var:

yerel işlev addNewBalloonOrBomb () yerel startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) eğer (math.random (1,5) == 1) o zaman - BOMB! yerel bomba = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Çalışma zamanı: addEventListener ("enterFrame", bomba) bombası: addEventListener ("touch", bombTouched) başkası - Balon yerel balonu = display.newImage ("red_balloon.png", startX, -300) physics.addBody (balloon) balloon.enterFrame = ekran dışı Çalışma Zamanı: addEventListener ("enterFrame", balon) balon: addEventListener ("touch", balloonTouched) son sonu

İşlevin ilk satırı, balonun nereden düşeceğine karar verir. x uçak. Balon veya bomba her zaman ortasına düşerse, bu çok ilginç olmaz! YanistartX Ekran genişliğinin yüzde 10'u ile yüzde 90'ı arasında rastgele bir sayıdır.

Daha sonra 1 ile 5 arasında rastgele bir sayı toplanır.Sayı 1 ise bomba atılır. Eğer 2, 3, 4 veya 5 ise bir balon düşürülür. Bu, bombaların zamanın yüzde 20'sine düşürüleceği anlamına geliyor.

Bomba ve balon kodu oldukça benzer. İlk önce görüntü (bir bomba veya bir balon) kullanılarak görüntülenir.yeni görüntü(). Onun x pozisyonun olduğustartX iken y konumu -300'e, yani ekranın üst kısmına ayarlanır. Bunun nedeni, nesnenin ekran alanının dışından görünür alana ve sonra alttan düşmesini istememizdir. 2B fizik motorunu kullandığımız için, nesneye düşmesi için başlangıç ​​mesafesinin bir kısmını vermek iyidir, bu nedenle biraz hız kazanabilir.

Çağrıphysics.addBody () tarafından yüklenen resmi çeker yeni görüntü() ve bunu fizik motorunda bir nesneye dönüştürür. Bu çok güçlü. Herhangi bir görüntü dosyası sadece yerçekimi ve çarpışmalara cevap veren bir gövdeye dönüştürülebilir.physics.addBody ().

Bombanın veya balonun son üç satırı dinleyicileri oluşturdu. ayarlamakenterFrame özellik, Corona'ya hangi işlevi her kareyi ve hangi numarayı aradığını söyler.Süre: addEventListener () ayarlar. Son olarak çağrıbalon: addEventListener () Bomba ya da balona dokunulduğunda Corona hangi fonksiyonu çağıracağını söyler.

Ve şimdi oyun neredeyse tamamlandı. Sadece iki kod satırına ihtiyacımız var:

addNewBalloonOrBomb () timer.performWithDelay (500, addNewBalloonOrBomb, 0)

İlk satır, açıkça çağrı yaparak ilk bombayı veya balonu düşürür.addNewBalloonOrBomb (). İkinci satır arayacak bir zamanlayıcı ayarlar.addNewBalloonOrBomb () her yarım saniyede bir (500 milisaniye). Bu, her yarım saniyede bir yeni bir balonun veya bombanın düşeceği anlamına gelir.

Artık oyunu emülatörde çalıştırabilirsiniz.

Main.lua için tam liste, bu oyunun tüm proje kaynak kodu GitHub'da bulunabilir.

-------------------------------------------------- ---------------------------------------------- - - Düşen balon ve bomba oyunu - Gary Sims tarafından yazılmış - ----------------------------------------------- -------------------------------------------------- fizik motoru yerel fizik = zorunlu ("fizik") physics.start () - Ekran genişliğinin ve yüksekliğinin yarısını hesapla halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Arka plan yerel ayarını ayarla bkg = display.newImage ("night_sky.png", halfW, halfH) - Skor puanı = 0 scoreText = display.newText (skor, halfW, 10) - Balon oyuncuya dokunduğunda çağrılır - Balonu 1 yerel işlev balonuyla artırma event) eğer (event.phase == "başladı") o zaman Çalışma Zamanı: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end - Sonunda çağrılır bomba oyuncu tarafından vurulur - Bir penaltı yerel işlevi olarak skorun yarısı bombTouched (event) eğer (event.phase == "başladı") sonra Çalışma Zamanı: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score end end - Düşen nesneleri sil ekranın alt kısmında yerel işlev offscreen (öz, olay) eğer (self.y == nil) sonra geri dön (eğer self.y> display.contentHeight + 50) sonra Runtime: removeEventListener ("enterFrame", self) self: removeSelf () bitiş sonu - Yeni bir düşen balon veya bomba yerel işlevi ekle addNewBalloonOrBomb () - GitHub repo local startX = math.random (display.contentWidth * 0.1, display.contentWidth) içinde red_ballon.png ve bomb.png öğelerini bulabilirsiniz. * 0.9) eğer (matematik (1,5) == 1) o zaman - BOMB! yerel bomba = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Çalışma zamanı: addEventListener ("enterFrame", bomba) bombası: addEventListener ("touch", bombTouched) başkası - Balon yerel balonu = display.newImage ("red_balloon.png", startX, -300) physics.addBody (balloon) balloon.enterFrame = ekran dışı Çalışma Zamanı: addEventListener ("enterFrame", balon) balon: addEventListener ("touch", balloonTouched) end end - Şimdi yeni bir balon veya bomba ekle addNewBalloonOrBomb () - Her 0,5 saniyede bir yeni balon veya bomba eklemeye devam edin timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Sonraki adımlar

Bir sonraki adım, oyunu gerçek bir Android cihazda oynamak. Bir .apk dosyası oluşturmak için Dosya-> Android için Oluştur… 'a tıklayın ve alanları doldurun. Sonuç, cihazınıza kopyalayıp yükleyebileceğiniz bir .apk dosyası olacaktır. Uygulamanın bilinmeyen kaynaklardan yüklenmesine izin vermek için cihazınızı yapılandırdığınızdan emin olmanız gerekir. Amazon'un bu konuda iyi bir dokümantasyonu var; ayrıca Amazon Appstore'u kurmak için de ayarlamanız gerekiyor. Corona ayrıca, uygulamanızı Android cihazlarda imzalama, oluşturma ve test etme konusunda bir rehbere sahiptir.

Oyun başarıyla cihazınıza yüklendiğinde yapılacak bir sonraki şey oyunu geliştirmek. Örneğin, neden bir balon veya bombanın tıklatıldığı her şeye “pop” veya “bang” sesi eklemeyi denemiyorsunuz. Corona'nın bunun için bir API'si var:media.playEventSound ().

Veya neden üçüncü bir nesne türü eklemeyi denemiyorsunuz, mevcut puanı iki katına çıkaran süper bir destek ya da bazı arka plan müziğine ne dersiniz?

Sarmak

Corona ile oyunlar yazmak oldukça kolay çünkü SDK OpenGL gibi şeyleri yönetiyor ve dahili bir 2D fizik motoru içeriyor. Ayrıca Lua'nın öğrenmesi kolaydır ve minimum programlama deneyimi olan hiç kimse için zor olmamalıdır. Coronalabs web sitesinde çok sayıda rehber ve öğretici içeren çok sayıda belge vardır.

100'den az kod satırında çalışan bir oyunumuz var. Tamam, herhangi bir ödül kazanamayacak, ancak Corona SDK'nın gücünü ve esnekliğini gösteriyor.

Reuter Bugün, Hinditan’ın antitröt izleme gözlemciinin Google’ı antitröt ihlalleri iddiaıyla oruşturduğunu bildirdi. Meele, Google’ın rekabeti şekillendirmek için Android’in p...

281. baımına hoş geldiniz! İşte bu hafta büyük başlıklar:Google ve Apple bu hafta kendilerini ıcak uda buldular. uudi Arabitan'da bir uygulama bildirildi kadınların yerini erkek veli ad...

Bizim Seçimimiz