Lua'ya Giriş

Lua, veri açıklama olanakları ile genel prosedürel programlamayı desteklemek için tasarlanmış bir uzatma programlama dilidir. Lua, ihtiyacı olan herhangi bir program için güçlü, hafif bir betik dili olarak kullanılmak üzere tasarlanmıştır.

  • Sözleşmeler
  • Tipler ve Değerler
  • Tablolar
  • Değişkenler
  • İfade
  • Fonksiyonlar
  • Kapsam Kuralları
  • Hafıza Tahsisi
  • Sözdizimi Karşılaştırma
  • Lua İşlevleri
Not:

İleride kullanacağımız Corona SDK, Lua 5.1.3 sürümünü kullanıyor. Lütfen daha fazla ayrıntı için Lua 5.1 Referans Kılavuzuna bakın.

 

Sözleşmeler

Lua'daki isimler ( tanımlayıcı olarak da adlandırılır ), bir rakamla başlamamış herhangi bir harf, rakam ve alt çizgi olabilir. Bu, çoğu dilde adların tanımlanması ile çakışmaktadır. "Mektup" tanımı, geçerli yerel ayarlara bağlıdır: geçerli yerel ayar tarafından alfabetik olarak kabul edilen herhangi bir karakter tanımlayıcıda kullanılabilir. Tanımlayıcılar değişkenleri ve tablo alanlarını adlandırmak için kullanılır.

Aşağıdaki anahtar kelimeler ayrılmıştır ve ad olarak kullanılamazlar:

and     break        do         else     elseif     end       false
for     function     if         in       local      nil       not
or      repeat       return     then     true       until     while

Aşağıdaki dizgiler diğer belirteçleri gösterir:

+      -      *      /      %      ^      #
==     ~=     <=     >=     <      >      =
(      )      {      }      [      ]
;      :      ,      .      ..     ...

Lua bir olan harfe duyarlı dil: andayrılmış bir sözcüktür, ama Andve ANDiki farklı, geçerli isimlerdir. Kural olarak, alt çizgi ile başlayan ve ardından büyük harflerle (örneğin _VERSION) başlayan isimler Lua tarafından kullanılan dahili global değişkenler için ayrılmıştır.

Bir açıklama çift tire (başlar --yerde bir dize dışında). Çizginin sonuna kadar koşuyorlar. Sen ile onu çevreleyen tarafından bir kod tam bloğun yorum yapabilirsiniz --[[ve --]]. Aynı bloğu açmak için, ilk muhafazaya olduğu gibi, basitçe başka bir kısa çizgi ekleyin ---[[.

-- Single line commented out
 
--[[ Entire block commented out
print( 10 )
print( 15 )
--]]

Bir sayısal sabit isteğe bağlı bir ondalık kısmı ve isteğe bağlı bir ondalık üst ile yazılabilir. Lua ayrıca onlarla birlikte tam sayı onaltılık sabitleri de kabul eder 0x. Geçerli sayısal sabitlerin örnekleri:

3    3.0    3.1416    314.16e-2    0.31416E1    0xff    0x56

 

Tipler ve Değerler

Lua dinamik olarak yazılmış bir dildir . Bu, değişkenlerin tiplerinin olmadığı anlamına gelir; sadece değerler yapar. Dilde tür tanımları yoktur. Tüm değerler kendi türünü taşır.

Lua'daki tüm değerler birinci sınıf değerlerdir . Bu, tüm değerlerin değişkenlerde saklanabileceği, diğer işlevlere argüman olarak iletilebileceği ve sonuç olarak döndürülebileceği anlamına gelir.

İlgilenmeniz gereken temel türler:

  • nil - nilesas özelliği diğer herhangi bir değerden farklı olacak olan değerin türü; genellikle yararlı bir değerin yokluğunu temsil eder.

  • boolean - değerlerin tipi falseve true. Her ikisi de nilve falsebir koşulu yanlış yapar; başka herhangi bir değer gerçek yapar.

  • sayı - gerçek (çift duyarlıklı kayan nokta) sayılarını temsil eder.

  • string - karakter dizilerini gösterir. Lua 8-bit temizdir: dizeler, gömülü sıfırlar da dahil olmak üzere herhangi bir 8 bit karakter içerebilir .

  • function - daha fazla bilgi için İşlevler bölümüne bakın .

  • tablo - Lua'daki tek veri yapılandırma mekanizması. Daha fazla bilgi için Tablolar'a bakınız .

Lua, çalışma zamanında dize ve sayı değerleri arasında otomatik dönüşüm sağlar . Bir dizeye uygulanan herhangi bir aritmetik işlem, normal dönüştürme kurallarını izleyerek bu dizeyi bir sayıya dönüştürmeye çalışır. Tersine, bir dizgenin beklendiği yerde bir sayı kullanıldığında, sayı makul bir biçimde bir dizgeye dönüştürülür. Sayıların dizgelere nasıl dönüştürüldüğü konusunda tam kontrol için, string.format işlevini string kütüphanesinden kullanın.

 

Tablolar

Tablolar Lua'daki tek veri yapılandırma mekanizmasıdır. Onlar uygulamak ilişkilendirilebilir diziler diziler sayılarla ama dışında herhangi bir değerle sadece dizine eklenebilir, yani nil. Tablolar heterojen olabilir ve dışındaki tüm türlerin değerlerini içerebilir nil.

Kayıtları (özellikleri) temsil etmek için, Lua alan adını bir indeks olarak kullanır . Dil bu temsili a.namesözdizimi şekeri sağlayarak destekler a["name"].

Endeksler gibi, bir tablo alanının değeri hariç herhangi bir türde olabilir nil. Özellikle, işlevler birinci sınıf değerler olduğundan, tablo alanları işlevler içerebilir. Böylece tablolar da yöntemler taşıyabilir .

Tablolar nesnelerdir : değişkenler aslında bu değerleri içermez, yalnızca bunlara referanslar . Atama, parametre geçişi ve işlev dönüşleri her zaman bu değerlere yapılan referansları değiştirir; bu işlemler yapmak değil kopyanın her türlü ima.

Masa yapıcısı, içinde olduğu gibi parantez (kaşlı ayraçlar) kullanılarak yazılmıştır {}.

t = {}           -- Create a table
 
k = "x"
t[k] = 3.14      -- New table entry with key = "x" and value = 3.14
 
print( t[k] )    --> 3.14
print( t["x"] )  --> 3.14
print( t.x )     --> 3.14
 
t[2] = "foo"     -- New table entry with key = 2 and value = "foo"
 
print( t[2] )    --> "foo"
Girişlere Erişim

Yukarıdaki örnekte, alan adı ile giriş "x"iki yolla ulaşılabilir: a kadar özelliği nokta işleci kullanılarak t.xve bir şekilde bir dizi indeksi kullanarak t["x"].

Yaygın bir hata şaşırtmak için t.xbirlikte t[x]. İlk eşdeğerdir t["x"]: dize tarafından indekslenmiş bir tablo "x". İkincisi, değişkenin değerine göre indekslenmiş bir tablodur x.

Önemli

Birçok Corona API'sı nesneleri döndürür. Bu nesnelerin belgelenmiş özelliklerini tıpkı tablo özellikleri için olduğu gibi değiştirebilirsiniz. Hatta kendi özellikleri, yok ekleyebilir değil olduğu gibi bir alt çizgi ile özel özelliklerden herhangi birini önek t._custom = 10. Corona, alt çizgi ile başlayan herhangi bir mülk adını kullanma hakkını saklı tutar.

 

Değişkenler

Değişkenler, değerleri saklayan yerlerdir. Lua'da üç tür değişken vardır: global , yerel ve tablo alanları (özellikler). Başlatılmamış herhangi bir değişken nilvarsayılandır.

global

Global değişkenlerin bildirimlerine gerek yoktur. Sadece oluşturmak için bir değer atarsınız:

print( s )  --> nil
 
s = "One million dollars"
 
print( s )  --> One million dollars

Genel değişkenler, uygulamanız çalıştığı sürece yaşar. Genel bir değişkeni atayarak silebilirsiniz nil. Bu noktada, global değişken hiç başlatılmamış gibi davranır.

s = nil
print( s )  --> nil

Yerel

Yerel değişkenler, yerel deyim kullanılarak bildirilir:

x = 1         -- Global variable
local y = 10  -- Local variable

Genel değişkenlerin aksine, yerel değişkenler yalnızca bildirildikleri blokta görünür. Kapsamı yerel değişken beyan sonra başlar ve blok sonunda sona erer.

a = 10
local i = 1
 
while ( i <= 10 ) do
    local a = i*i  -- Different variable "a", local to this "while" block
    print( a )     --> 1, 4, 9, 16, 25, ...
    i = i + 1
end
  
print( a )         --> 10 (the global "a")

Tablo Alanları

Tablo alanları sadece tablonun kendi unsurlarıdır. Değerleri bir alana atamak için dizinin içine indekslersiniz.

t = { foo="hello" -- Create table with a single property "foo"
print( t.foo )       --> "hello"
 
t.foo = "bye"        -- Assign a new value to property "foo"
print( t.foo )       --> "bye"
 
t.bar = 10           -- Create a new property named "bar"
print( t.bar )       --> 10
print( t["bar"] )    --> 10

 

İfade

Aritmetik operatörler

Lua, normal ikili aritmetik operatörlerini destekler:

Şebeke amaç
+ ilave
- çıkarma
* çarpma işlemi
/ bölünme
% modülo
^ üstalma

Aynı zamanda birliği -(olumsuzlama) destekler .

notlar
  • İşlenenler sayılara dönüştürülebilen sayılar veya dizeler ise, tüm işlemlerin olağan anlamı vardır. Üsküleme, herhangi bir üs için işe yarar. Örneğin x^(-0.5), kare kökün tersini hesaplar x.

  • Modulo şöyle tanımlanır:, a % b == a - math.floor(a/b)*bbölümü eksi sonsuzluğa doğru yuvarlayan bir bölümün geri kalanında olduğu gibi.

İlişkisel Operatörler

Lua'daki ilişkisel operatörler:

Şebeke amaç
== eşittir
~= eşit değil
< daha az
> daha büyük
<= eşit veya daha küçük
>= büyük veya eşittir

Bu operatörler daima trueveya ile sonuçlanır false.

notlar
  • Eşitlik ( ==) ilk önce işleç türlerini karşılaştırır . Türleri farklı ise, sonuç false. Aksi takdirde, işlenenlerin değerleri karşılaştırılır.

  • Sayılar ve dizgiler her zamanki gibi karşılaştırılır. Nesneler referans ile karşılaştırılır: iki nesne yalnızca aynı nesne olduğunda eşit kabul edilir. Her yeni nesne oluşturduğunuzda, bu nesne önceden var olan nesnelerden farklıdır.

  • Otomatik dönüşüm kuralları eşitlik karşılaştırması için geçerli değildir . Böylece, "0" == 0değerlendirir false.

Mantıksal operatörler

Lua mantıksal operatörleri andorve not. Tüm mantıksal operatörler hem düşünün falseve nilgerçek olduğu kadar yanlış ve başka bir şey.

  • ve - birleşim operatörü and, bu değer falseveya ise nil; Aksi takdirde andikinci argümanını döndürür.

  • veya - orbu değer nilve değerinden farklı ise , disjunction operatörü ilk argümanını döndürür false; Aksi takdirde orikinci argümanını döndürür.

  • değil - olumsuzluk operatörü nother zaman döndürür falseveya true.

Her ikisi de andve orkısayol değerlendirmesini kullanın - ikinci işlenen sadece gerekirse değerlendirilir.

10 or 20           --> 10
10 or error()      --> 10
nil or "a"         --> "a"
nil and 10         --> nil
false and error()  --> false
false and nil      --> false
false or nil       --> nil
10 and 20          --> 20

birbirine bağlama

Lua'daki dize birleştirme işleci, iki nokta ( ..) ile gösterilir. Her iki işlenen de dizge veya sayıysa, yukarıda belirtilen dönüşüm kurallarına göre dizgilere dönüştürülür.

local s = "foo".."10"

Uzunluk Operatörü

Uzunluk operatörü, unary operatörü tarafından gösterilir #. Bir dize uzunluğu, bayt sayısıdır - her karakter bir bayt olduğunda dize uzunluğunun normal anlamı.

Bir tablonun uzunluğu , olmayan ve olduğu gibi therhangi bir tamsayı indeksi olarak tanımlanır ; eğer dahası olduğunu , sıfır olabilir. Düzenli bir dizi için 1'den belirli bir değere sahip olmayan bir dizi için, uzunluğu tam olarak budur , son değerinin dizinidir. Dizi "delik" varsa ( değerleri arasında diğer olmayan değerler) , daha sonra doğrudan önce gelen endeksleri herhangi biri olabilir değeri. Bu nedenle, dizinin sonu gibi herhangi bir değeri düşünebilir .nt[n]nilt[n+1]nilt[1]nilnnilnnnilnil#tnilnil

Öncelik

Lua'daki operatör önceliği, aşağıdaki listeyi izler, daha düşük önceliğe:

  • or
  • and
  • <><=>=~=,==
  • ..
  • +-
  • */,%
  • not#-(Birli)
  • ^

Her zamanki gibi bir ifadenin önceliğini değiştirmek için parantez kullanabilirsiniz. Concatenation ( ..) ve exponentiation ( ^) operatörleri doğru bir ilişkiseldir. Diğer tüm ikili işleçler ilişkili bırakılmıştır.

 

Fonksiyonlar

Düz fonksiyonlar beklendiği gibi: giriş (parantez içinde) , fonksiyonlar bazı görevleri yerine getirir ve sonuçlar döndürülebilir.

Bir işlevi bildirmek için yaygın yöntemler şunlardır:

local function f ()
--body
end
 
local f = function()
--body
end
 
function f ()
--body
end
 
f = function ()
--body
end

İşlevler değişken olabilir, böylece bir tablo bunları özellikler olarak saklayabilir. Bu, bir tablonun çok esnek kullanımına izin verir. Mantıksal olarak fonksiyon ailesini bir tabloya, örneğin mathkütüphaneye gruplamak için kullanılabilir . Bu durumda 100'ün sinüsünü hesaplamak için yazardınız math.sin(100). Burada, mathsadece bir tablodur ve özellik sinasıl fonksiyondur.

Nesne Yöntemi

Lua'daki nesneler tablolarla temsil edilir. Görüntüleme nesneleri ve genel Çalışma Zamanı nesnesi tüm nesnelerdir . Gibi mathkütüphane, bu nesneler, benzer özellikler olarak hedef yöntemleri (örneğin yöntemleri) depolar. Bununla birlikte, anahtar anahtarlardan biri sözdizimidir. Lua'ya, bu işlevi yalnızca düz bir işlev olarak değil, bir nesne yöntemi olarak adlandırılmaya niyetli olduğunu söylemeniz gerekir . Bunu yapmak için, nokta :operatörü yerine colon ( ) operatörünü kullanmanız gerekir . Bu diğer dillerden farklı olabilir. Javascript ve Lua'nın sözdizimini karşılaştırın:

JavaScript almak
object.translate( 10, 10 );  object:translate( 10, 10 ) 

 

Kapsam Kuralları

Lua, sözlüksel olarak kapsamlı bir dildir. Değişkenlerin kapsamı, bildirimlerden sonraki ilk açıklamada başlar ve bildirimi içeren en içteki bloğun sonuna kadar sürer.

x = 10                  -- Global variable
do                      -- New block
    local x = x         -- New "x" with value 10
    print(x)            --> 10
    x = x+1
    do                  -- Another block
        local x = x+1   -- Another "x"
        print(x)        --> 12
    end
    print(x)            --> 11
end
print(x)                --> 10  (the global one)

İlanı gibi içinde, dikkat edin local x = x, yeni, xilan edilen henüz kapsamında değildir ve bu nedenle ikinci xdış büyüklüğüyle ilgilidir.

Sözlüksel kapsam kuralları nedeniyle, yerel değişkenlere, kapsamları içinde tanımlanan işlevlerle serbestçe erişilebilir. Bir iç işlev tarafından kullanılan bir yerel değişken, iç işlev içinde bir değer artışına veya dış bir yerel değişken olarak adlandırılır .

Bir localifadenin her uygulamasının yeni yerel değişkenleri tanımladığına dikkat edin :

a = {}
local x = 20
for i = 1, 10 do
    local y = 0
    a[i] = function () y = y+1; return x+y end
end

Döngü on kapak oluşturur (adsız işlevin on örneği). Bu kapakların her biri farklı bir ydeğişken kullanır , hepsi aynı paylaşır x.

 

Hafıza Tahsisi

Özellikle mobil cihazlar kullanım için sınırlı hafızaya sahiptir, bu nedenle uygulamanızın toplam hafıza alanının en aza indirilmesini sağlamak için özen gösterilmelidir.

Lua otomatik hafıza yönetimi yapar. Bu, yeni nesneler için bellek ayırma konusunda endişelenmenize gerek olmadığı anlamına gelir. Nesnelere artık ihtiyaç duyulmadığında da açıkça belleği boşaltmanız gerekmez. Lua, tüm "ölü" nesneleri (Lua'dan artık erişilemeyen nesneler) toplamak için zaman zaman bir çöp toplayıcıyı çalıştırarak belleği otomatik olarak yönetir . Lua tarafından kullanılan tüm hafıza otomatik yönetime tabidir. Bununla birlikte, Lua'ya çöpleri ne göz önünde bulundurması gerektiğini söylemek size kalmıştır. Örneğin, bir global değişkende saklanan hiçbir şey değildiruygulamanız bir daha kullanmasa bile, çöp olarak kabul edilir. Benzer şekilde, bir tabloda veya dizide depolanan herhangi bir şey, bu tablo / dizi çöp toplayıcı tarafından kaldırılamazsa, depolanan değişken / nesne başlangıçta yerel kapsamda bildirilse bile çöp olarak kabul edilmeyecektir. Her iki durumda da, nilbu pozisyonlara atanmak size kalmıştır . Bu, karşılık gelen hafızanın kilitlenmemesini ve çöp toplayıcı tarafından serbest bırakılmasını sağlar.

Görüntüleme nesnesi ek bir adım gerektirir. Önce kullanarak görüntüleme hiyerarşisi nesneyi kaldırmanız gerekir object:removeSelf()veya display.remove( object )o zaman onun referansını ayarlamak gerekir, nil.

myObject:removeSelf()
-- OR...
display.remove( myObject )
 
myObject = nil

 

Sözdizimi Karşılaştırma

Lua ve diğer diller arasındaki sözdizimindeki bazı farklılıklar dikkat çekicidir çünkü derleyici hatalarını önlemeye yardımcı olabilirler:

  • noktalı virgül - her ifadenin sonunda izleyen noktalı virgül (etkin bir kod satırı) Lua'da isteğe bağlıdır .

  • kaşlı ayraçlar - { }Değişken kapsamı tanımlamaya alışmaya alışkın olabilirsiniz . Lua'da, kodu dove ile destekleyerek bunu yaparsınız end. Lua'daki parantezler masa yapıcıları olarak yorumlanır .

  • if - o zaman - else - C, Java, Javascript, vb. den gelirseniz, yazılı olarak yapacağınız genel bir hata ifve elseififadeler test koşullarının thensonuna eklenmeyi unutuyor if/elseif. Bir diğer yaygın hata ise else if, Lua'nın beklediği gibi istemeden (boşlukla) kullanılmasıdır elseif.

  • diziler - Lua'da diziler 1 tabanlıdır . Teknik olarak, ile başlayan bir dizine indeksleyebilirsiniz 0. Ancak, Lua ve Corona API'leri bir tablonun ilk unsur olduğunu kabul tolduğunu t[1], değil t[0].

  • çoklu dönüş değerleri - Lua'daki alışılmadık ama kullanışlı bir özellik, bir fonksiyonun birden fazla sonuç döndürme yeteneğidir .

  • çoklu atama - çoklu atama değerleri değiştirmek için kullanışlı bir yol sunar. İfadesi x,y = y,xtakas edecek xiçin yve tersi.

  • üçlü operatör ( ? :) - Lua, üçlü operatöre eşdeğer sunmaz a?b:c. Lua deyim (a and b) or cbyanlış olmadığı sürece yakın bir yaklaşım sunar . Örneğin, Lua eşdeğer max = (x>y?x:y)olacaktır max = ( x>y and x or y).

 

Lua İşlevleri

Temel Lua kütüphanesi birkaç temel işlev sunar. Güvenlik nedeniyle, dofile()load(), ve loadfile()işlevleri Corona kullanılamaz. loadstring()desteklenir.

 

Bu kılavuzdaki içerik , Lua lisansı koşulları altında serbestçe kullanılabilen Lua 5.1 Referans Kılavuzundan alınmıştır .

 

Bölüm 1 - Bir Uygulama Oluşturma

 

Bu bölümde, bir balonun havada kalmasını sağlamak için uygulama geliştirmenin temellerinin bir kısmını kapsayan basit bir musluk temelli oyun yaratacağız . Bu ilk projeyi, yeni olan veya bir süredir programlama yapmaktan uzak olan kişiler için mümkün olduğunca basit tutacağız.

  • Corona Kullanımı
  • Bir Uygulama Oluşturma
  • Ekstra kredi
  • Bölüm Kavramları

 

Corona Kullanımı

Corona Yazılımı

Corona, Lua kodlama dilini kullanır . Herhangi bir dilde programladıysanız, Lua'yı kolay bir geçiş bulacaksınız. Lua'ya giriş kılavuzumuz Lua'ya genel bir bakış sunar ya da Lua'yı YouTube'da öğrenebilirsiniz . Çok kısa bir sürede, yaratmayı hayal ettiğiniz harika uygulamayı yazarken kendinizi bulacaksınız!

Programlamada tamamen yeniyseniz, Lua'yı öğrenmesi hala kolaydır ve bu kılavuz size yardımcı olacaktır.

Metin Editörleri

Corona'ya ek olarak, bir metin editörüne ihtiyacınız olacak . Kullanılabilir birkaç editör vardır ve birini seçmek, araba seçmek gibi bir şeydir - herkesin kendi tercihleri ​​vardır ve hangisinin size en uygun olduğunu keşfetmelisiniz.

Favori bir metin düzenleyiciniz yoksa, aşağıdaki seçenekler önerilir:

Editör Eklenti Paketi Mac os işletim sistemi pencereler
atom otomatik tamamlama-korona
Xcode Xcode için Corona Eklentisi  
Visual Studio Kodu Korona Araçları
Yüce metin Taç Editör
Vim  
ZeroBrane Studio  
Notepad ++    
TextWrangler    
TextMate    

 

Bir Uygulama Oluşturma

İlk uygulamanız çok basit olacak, ancak bazı önemli kavramları gösterecektir. Bir balonu havada tutmak için basit bir dokunma oyunu yapacağız. Balon her dokunulduğunda, biraz daha "iteceğiz".

notlar
  • Bu kılavuzu kullanmanın en iyi yolu her adımı izlemektir - kodu yazın, görüntüleri ekleyin ve projenizin yavaş yavaş hayata geçtiğini görün. Biraz zaman alabilir, ancak daha iyi bir anlayış kazanacaksınız.

  • Her bölüme, tüm görüntüleri, ses dosyalarını ve bu bölümle ilgili diğer varlıkları içeren indirilebilir bir dosya dahildir. Bu bölümün kaynak dosyaları burada mevcuttur .

Proje Başlatmak

Corona'da yeni bir proje oluşturmak kolaydır. Sadece birkaç basit adımda ilk uygulamanızı yapmaya hazır olacaksınız!

  1. Corona Simulator'ü açın .

  2. Karşılama penceresinden Yeni Proje'yi tıklayın veya Dosya menüsünden Yeni Proje ... 'yi seçin.

  1. Proje / uygulama adı için, Boş şablon seçeneğinin seçili BalloonTapolduğundan emin olun ve yazın . Diğer ayarları varsayılan ayarlarda bırakın ve Tamam'ı (Windows) veya İleri'yi (Mac) tıklayın. Bu, ilk oyununuz için belirlediğiniz konumdaki (klasör) temel dosyaları oluşturacaktır. Bu aynı zamanda, görüntüler, program dosyaları vb. Dahil tüm uygulama dosyalarınızı / varlıklarınızı yerleştireceğiniz klasördür.

Görüntüler Dahil

Bu proje için yukarıda oluşturulan proje klasörüne yerleştirilmiş üç resim dosyasına ihtiyacınız olacak BalloonTap:

Dosya Boyut (a × h) kullanım
background.png 360 × 570 Arka plan - tamamen dekoratif, böylece siyah bir arka plana bakmıyoruz.
platform.png 300 × 50 Platform / zemin - balonun ekranın altından düşmesini önler.
balloon.png 112 × 112 Balon.
 

Hızla ilerlemek için, bu bölümün kaynak dosyalarında bulunan varsayılan görüntüleri indirip kullanabilirsiniz . Arşivin içinde, yukarıda özetlenen üç resmi bulacaksınız.

 

Bu proje veya başka bir proje için kendi resimlerinizi oluşturmayı seçerseniz, aşağıdaki temel resim kurallarına dikkat edin:

  • Corona, PNG ve JPG formatını destekler.
  • Görüntüler yerleşik bir ICC profili içermemelidir.
  • Aşamalı JPG dosyalarından kaçının çünkü yüklenmeleri daha uzun sürebilir.

Arka Planın Yüklenmesi

Yüklememiz gereken ilk görüntü arka plandır. Katmanlama konusunda Corona her şeyi ekrana önden yerleştirir, böylece ilk yüklediğimiz görüntü daha sonra yüklenen diğer görüntülerin arkasında olacaktır. Görüntülerin katman sırasını değiştirmenin ve bunları ekran yığınının arkasına veya önüne göndermenin yolları olsa da, bu projeyi basit tutacağız ve mantıklı bir sırayla yükleyeceğiz.

Seçtiğiniz metin düzenleyiciyi kullanarak main.luadosyayı proje klasörünüzde bulun ve açın . main.luaDosya temelini oluşturan "çekirdek program dosyası" Her Corona projesinin ve onsuz bir uygulamayı oluşturamazsınız. Bu, uygulamayı her çalıştırdığınızda uygulamanın başladığı Lua dosyasıdır.

Bu main.luadosyaya vurgulanan komutu yazın:

1
2
3
4
5
6
7
-----------------------------------------------------------------------------------------
--
-- main.lua
--
-----------------------------------------------------------------------------------------
 
local background = display.newImageRect( "background.png", 360, 570 )

Bu komutla ilgili birkaç husus var. Şimdi onu parçalayalım:

  • İlk kelime, localbir sonraki kelimenin değişken olacağını belirten bir Lua komutudur . Aynen matematik dersinde öğrendiğiniz gibi, bir değeri saklamak için kullanılır. Bu durumda, bu değer arka planınız olarak kullanılan bir resim olacaktır.
 

Not localhep küçük ve bir değişkeni bildirmek için buraya kullanılır; örneğin, değişkeni ilk kez kullanırken, kelimeyi localönüne eklemeniz gerekir.

  • İkinci kelime, backgroundolduğu ismi bizim değişkenin. Saklanan görüntüde herhangi bir değişiklik yapmak istediğimizde background, bu değişken adını kullanacağız.
 

Her değişken kullandığınızda her zaman farklı değişken adları kullanmayı unutmayın. Tıpkı bir sınıftaki herkesin "John" olup olmadığını karıştırması, tüm nesneleriniz için aynı değişken adını kullanarak programınızda karışıklık yaratır.

  • =(Eşit işareti) değişken atamak için kullanılır background, bir görüntü.

  • display.newImageRect()Corona API'lerinden biridir (Uygulama Programlama Arayüzü) . Bir dosyadan bir görüntü yüklemek için kullanılır, böylece uygulamada kullanabilirsiniz. Bir görüntüyü uygulamanıza yerleştirmenin birkaç yolu vardır, ancak display.newImageRect()görüntüyü yeniden boyutlandırabilir / ölçeklendirebilir (bu sadece birazdan açıklanacaktır).

  • Parantezlerin içinde , bazen argüman olarak adlandırdığımız, geçtiğimiz parametrelerdir . İlk parametre, ( ) dosya uzantısı da dahil olmak üzere, yüklemek istediğimiz resim dosyasının adıdır .display.newImageRect().png

 

Belirtilen ad, büyük / küçük harfe duyarlı eşleme dahil, gerçek dosya adıyla tam olarak eşleşmelidir! Örneğin, gerçek dosya adı ise background.png, do not it olarak girmek "BackGround.PNG".

Sonraki iki parametre 360ve 570arka plan görüntüsünün olmasını istediğimiz boyutu belirtin. Bu durumda, görüntünün piksel boyutlarını kullanacağız, ancak yukarıda belirtildiği gibi display.newImageRect()görüntüyü bu sayılarla yeniden boyutlandırmanıza / ölçeklendirmenize izin veriyor.

Arka plan için son adım, onu ekranda doğru yere konumlandırmaktır. Az önce girdiğiniz satırın hemen ardından, vurgulanan iki komutu ekleyin:

7
8
9
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY

Varsayılan olarak, Corona nesnenin merkezini ekranın sol üst köşesinde 0,0bulunan koordinat noktasına konumlandırır . Bununla birlikte, nesnenin özelliklerini ve özelliklerini değiştirerek, arka plan görüntüsünü yeni bir konuma taşıyabiliriz.xy

Bu proje için arkaplanı ekranın ortasına yerleştireceğiz - peki hangi koordinat değerlerinin merkezi temsil ettiğini tam olarak bilmiyorsak ne olur? Neyse ki, Corona bunun için bazı uygun kısayollar sunar. Değerleri display.contentCenterXve belirttiğinizde display.contentCenterY, Corona, ekranın merkez koordinatlarını background.xve background.yözellikleri olarak ayarlayacaktır .

 

Kodunuzun sonucunu kontrol edelim! Değiştirilen main.luadosyanızı kaydedin ve daha sonra, Corona Simulator içinden R-R (Command-R) kullanarak "yeniden başlatın " . Her şey yolunda giderse, arka plan şimdi ekranda ortalanmış olarak gösteriliyor olmalıdır.

Bir hata alırsanız veya arka planı göremiyorsanız, bunun nedeni ile ilgili birkaç olasılık vardır:

  • Komutlardan biri yanlış yazılmış.
  • Resim dosyası ile aynı klasörde değil main.lua.
  • Belirtilen dosya adı ve / veya uzantısı yanlış veya yanlış eşleşiyorsa.
 

Unutmayın Corona Simülatörü Konsol penceresi denetlemek ve kodunuzda potansiyel hataları teşhis etmek için değerli bir yerdir. Windows'ta bu panele her zaman Simülatörden erişilebilir. Mac'te, bu pencere zaten açık değilse, Pencere → Konsol'u seçerek görüntüleyebilirsiniz .

Platformun Yüklenmesi

Platformu yükleme zamanı. Bu, arka planı yüklemeye çok benzer. Önceden yazdığınız üç kod satırından sonra, aşağıda belirtilen komutları girin:

7
8
9
10
11
12
13
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
 
local platform = display.newImageRect( "platform.png", 300, 50 )
platform.x = display.contentCenterX
platform.y = display.contentHeight-25

Muhtemelen fark ettiğiniz gibi, arka plana göre küçük bir değişiklik var: platformu dikey merkeze yerleştirmek yerine, ekranın altına yakın olmasını istiyoruz. Bu komutu kullanarak, display.contentHeightiçerik alanının yüksekliğini biliyoruz. Ama unutmayın platform.yyerleştirir merkezini belirtilen yerde nesnenin. Bu nedenle, bu nesnenin yüksekliği 50 piksel olduğundan, tüm platformun ekranda görünmesini sağlayarak değerden 25 piksel çıkardık.

main.luaDosyanızı kaydedin ve platform grafiğini görmek için Simülatörü yeniden başlatın .

Balonu Yüklemek

Balonu yüklemek için aynı işlemi takip edeceğiz. Önceki komutların altına şu satırları yazın:

15
16
17
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY

Ek olarak, balona biraz şeffaf bir görünüm vermek için nesnenin opaklığını (alfa) biraz azaltacağız. Bir sonraki satırda, balonun alphaözelliğini% 80 ( 0.8) olarak ayarlayın:

15
16
17
18
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY
balloon.alpha = 0.8

main.luaDosyanızı kaydedin ve Simülatörü yeniden başlatın . Şimdi ekranın ortasında bir balon olmalı.

Fizik Eklemek

Fiziğe girme zamanı! Corona, bina uygulamalarında kullanımınız için Box2D fizik motorunu içerir . Oyun yapmak için fizik kullanmak gerekli olmamakla birlikte, birçok oyun durumuyla baş etmeyi çok kolaylaştırır.

Corona ile fiziği dahil etmek çok kolaydır. Önceki satırların altına şu komutları ekleyin:

20
21
local physics = require( "physics" )
physics.start()

Bu iki satırı biraz daha ayrıntılı olarak açıklayalım:

  • Komut local physics = require( "physics" ), Box2D physics motorunu uygulamanıza yükler ve physicsdaha sonra başvurmak için yerel değişkenle ilişkilendirir . Bu, physicsbirazdan göreceğiniz gibi , ad alanı değişkenini kullanarak fizik kütüphanesindeki diğer komutları çağırabilmenizi sağlar .

  • physics.start() tam olarak tahmin edebileceğiniz şeyi yapar - fizik motorunu çalıştırır.

Eğer kazanır ve yeniden başlatırsanız, oyununuzda hiçbir fark göremezsiniz ... henüz . Çünkü fizik motoruna yapacak bir şey vermedik. Fiziğin çalışması için, yaratılan görüntüleri / nesneleri fiziksel nesnelere dönüştürmemiz gerekir. Bu komutla yapılır physics.addBody:

20
21
22
23
local physics = require( "physics" )
physics.start()
 
physics.addBody( platform, "static" )

Bu, fizik motoruna depolanan görüntüye fiziksel bir "vücut" eklemesini söyler platform. Ek olarak, ikinci parametre Corona'ya statik bir fiziksel nesne olarak davranmasını söyler . Ne anlama geliyor? Temel olarak, statik fiziksel nesneler yerçekimi veya diğer fiziksel kuvvetlerden etkilenmez, bu nedenle hareket etmemesi gereken bir nesne olduğunda, türünü ayarlayın "static".

Şimdi balona fiziksel bir beden ekleyin:

20
21
22
23
24
local physics = require( "physics" )
physics.start()
 
physics.addBody( platform, "static" )
physics.addBody( balloon, "dynamic", { radius=50, bounce=0.3 } )
 

Platformun aksine balon dinamik bir fiziksel nesnedir. Bu, yerçekiminden etkilendiği, diğer fiziksel nesnelerle çarpışmalara fiziksel olarak yanıt vereceği, vb. Anlamına gelir. Bu durumda, ikinci parametre ( "dynamic") aslında isteğe bağlıdır çünkü varsayılan gövde tipi zaten dinamiktir; öğrenme süreci ile.

Bu physics.addBodykomutun son kısmı , balonun gövde özelliklerini ayarlamak için kullanılır - bu durumda, ona yuvarlak bir şekil vereceğiz ve zıplama / bırakma değerini ayarlayacağız. Parametreler küme parantezlerine ( {}) ( Lua programlama dilinde bir tablo olarak anılacaktır ) yerleştirilmelidir.

  • Balon yuvarlak bir nesne olduğundan, ona radiusdeğeri olan bir özellik atarız 50. Bu değer temel olarak balon resmimizin boyutuyla eşleşir, ancak kendi balon resminizi oluşturduysanız biraz ayarlamanız gerekebilir.

  • bounceDeğeri herhangi biri olabilir , negatif olmayan bir ondalık veya tamsayı değeri. Bir değerin değeri 0, balonun hiç sıçrama yapmadığı anlamına gelirken, bir değeri 1çarpışma enerjisinin% 100'ü ile geri sıçrama yapacaktır. 0.3Yukarıda görüldüğü gibi, değeri enerjisinin% 30'u ile geri sıçrama yapacaktır.

notlar
  • bounceDeğerinden daha büyük bir değer 1, bir nesnenin çarpışma enerjisinin% 100'ünden fazlasıyla geri dönmesini sağlar. Yukarıdaki değerleri ayarlarsanız dikkatli olun, 1çünkü nesne tipik veya beklenenin ötesinde bir hızla ivme kazanabilir.

  • Balonun bounceözelliğini değiştirseniz bile , nesnelerden 0hemen çıkacaktır, platformçünkü varsayılan olarak nesnelerin bir sıçrama değeri vardır 0.2. Bu oyunda zıplayanları tamamen kaldırmak için hem balonu hem de platformu ayarlayın bounce=0.

 

main.luaDosyanızı kaydedin ve Simülatörü yeniden başlatın . Eğlenceli bir deneme olarak, bouncedeğeri ayarlamayı deneyebilir ve efekti görmek için projeyi yeniden başlatabilirsiniz .

Fonksiyonlar

Bu noktada, bir platforma düşen ve hafifçe zıplayan bir balonumuz var. Bu çok eğlenceli değil, hadi bunu bir oyuna dönüştürelim! Balon musluk oyunumuzun çalışması için, her çekildiğinde balonu biraz yukarı itmemiz gerekir.

Bu tür bir özelliği gerçekleştirmek için programlama dilleri işlev olarak adlandırılanları kullanır . İşlevler kısa (genellikle) kodun yalnızca oyuncuya balona dokunduğunda olduğu gibi, onlara söylediğimizde çalışan bölümleridir.

İlk fonksiyonumuzu yaratalım:

26
27
28
local function pushBalloon()
 
end
 

Fonksiyonlar Corona ile uygulamalar geliştirmek için çok önemlidir, bu yüzden temel yapıyı inceleyelim:

  • Daha önce olduğu gibi local, işlevi bildirmek için anahtar kelimeyi kullanırız.

  • Anahtar kelime function, Corona’ya bunun bir işlev olduğunu ve komutlar adının adıyla çağrılacağını söyler pushBalloon.

  • Bitiş parantezleri ( ()) gereklidir. Daha sonraki bölümlerde bu parantez içine bir şey koyacağız, ancak şimdilik bunu gösterildiği gibi bırakabilirsiniz.

  • Yukarıda bahsedildiği gibi, fonksiyonlar kendilerine yeten kod bölümleridir (bloklar) sadece onlara söylediğimizde çalışan kodlardır. Bu nedenle, ne zaman bir işlev oluşturursanız, onu anahtar kelimeyle kapatmanız gerekirend . Bu, Lua'ya fonksiyonun bittiğini söyler.

Mükemmel, şimdi bir işlevimiz var! Ancak, şu anda boş bir işlevdir, bu nedenle çalıştırırsak hiçbir şey yapmaz. İşlevin içine şu kodu ekleyerek, işlevi bildirdiğimiz yerle (açılış çizgisi) ve kapanış endanahtar kelimesi arasına şunu düzeltelim :

26
27
28
local function pushBalloon()
    balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
 

İşlevlerin içine kod satırları eklerken en az bir sekme veya 3-4 boşluk girintisi yapmak iyi bir programlama uygulaması olarak kabul edilir . Bu, kodunuzu daha okunaklı hale getirir ve daha uzun programlardaki işlevleri tanımak daha kolaydır.

balloon:applyLinearImpulsegerçekten harika bir komuttur. Balon gibi dinamik bir fiziksel nesneye uygulandığında, nesneye herhangi bir yönde bir "itme" uygular. Geçtiğimiz parametreler, fizik motoruna ne kadar kuvvet uygulanacağını (hem yatay hem de dikey olarak) ve ayrıca nesnenin gövdesinde kuvvetin nerede uygulanacağını söyler.

İlk iki parametre 0ve -0.75yön kuvvetinin miktarını gösterir. İlk sayı yatay veya x yönü, ikinci sayı dikey veya y yönüdür. Biz sadece yukarı balonu itmek istediğim için (bırakmamış veya sağ) , kullandığımız 0ilk parametre olarak. İkinci parametre için, değeri olan -0.75fizik motoruna balonu biraz yukarı itmesini söyleriz. Bu sayının değeri, uygulanan kuvvet miktarını belirler: sayı ne kadar büyükse, kuvvet o kadar yüksek olur.

 

Sağdaki diyagramda gösterildiği gibi, Corona'daki pozitif x değerleri sağa uzanırken, pozitif y değerleri aşağı doğru uzanır ( Kartezyen koordinat sisteminde olduğu gibi yukarı doğru değil ). Bu nedenle -0.75balonu yukarı doğru itmek için negatif bir değer ( ) kullanıyoruz.

Üçüncü ve dördüncü parametreler balloon.xve balloon.yfiziğin motoruna, balonun kendisine göre kuvveti nerede uygulayacağını söyleyin. Gücü balonun merkezi olmayan bir yere uygularsanız, balonun beklenmeyen bir yönde hareket etmesine veya etrafında dönmesine neden olabilir. Bu oyun için, gücün balonun merkezine odaklanmasını sağlayacağız.

Bu kadar! Gerekirse, pushBalloon()fonksiyonun içine ek komutlar ekleyebiliriz , ancak bu basit oyun için balonu sadece küçük bir kuvvetle yukarı doğru itmemiz gerekir.

Etkinlikler

Olaylar etkileşim yaratan şeydir ve birçok yönden, Corona, bir olay dinleyicisine belirli bir olay sırasında bilginin gönderildiği olaya dayalı bir çerçevedir . Bu olay kullanıcının bir nesneye / düğmeye dokunması, ekrana dokunması veya (bu oyunda) balona dokunması gibi olsa da, Corona bir olayı tetikleyerek tepki verebilir.

Bir olay dinleyicisini eklemek kolaydır - şimdi işlevini takip ederek bunu yapın:

26
27
28
29
30
local function pushBalloon()
    balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
 
balloon:addEventListener( "tap", pushBalloon )

Bu yeni komutun yapısını inceleyelim:

  • İlk önce Corona'ya hangi nesnenin olay dinleyicisine dahil olduğunu söylemeliyiz. Bu oyun için, doğrudan balloonnesneye bağlı bir olayı tespit etmek istiyoruz .

  • Bundan hemen :sonra, sonra bir sütun ( ) ekleyin addEventListener. Lua'da buna nesne metodu denir . Temel olarak, addEventListenerkolonu takip ederek, Corona'ya balloonkolondan önce belirtilen bir olay dinleyicisini eklemek istediğimizi söyler .

  • Parantezlerin içinde komutu tamamlayan iki parametre vardır. İlk parametre, bu durumda, Corona'nın dinleyeceği olay türüdür"tap" . İkinci parametre ise fonksiyon olay meydana geldiğinde, bu durumda çalıştırın (denir) olmalıdır pushBalloon()önceki bölümde yazdığı işlevi. Temel olarak, Corona'ya pushBalloon(), kullanıcının balonu her dinlediğinde işlevi çalıştırmasını söylüyoruz .

 

Bu her şey - şimdi işlevsel bir oyuna sahipsiniz! main.luaDosyanızı kaydedip Simülatör'ü yeniden başlatırsanız, kullanıma hazır olmalıdır. Balona dokunmaya / tıklamaya ve platforma dokunmasını engellemeye devam etmek için elinizden geleni yapın!

İşte tam program, bir şeyi kaçırmanız durumunda:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-----------------------------------------------------------------------------------------
--
-- main.lua
--
-----------------------------------------------------------------------------------------
 
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
 
local platform = display.newImageRect( "platform.png", 300, 50 )
platform.x = display.contentCenterX
platform.y = display.contentHeight-25
 
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY
balloon.alpha = 0.8
 
local physics = require( "physics" )
physics.start()
 
physics.addBody( platform, "static" )
physics.addBody( balloon, "dynamic", { radius=50, bounce=0.3 } )
 
local function pushBalloon()
    balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
 
balloon:addEventListener( "tap", pushBalloon )

 

Ekstra kredi

Tebrikler, sadece 30 kod satırında basit bir oyun yarattınız! Ama bir şey eksik, değil mi? Balonun kaç kez vurulduğunu oyunun takip etmesi iyi olmaz mıydı? Neyse ki eklemek kolay!

İlk önce, musluk sayısını takip etmek için yerel bir Lua değişkeni oluşturalım. Bunu mevcut kodunuzun en üstüne ekleyebilirsiniz. Bu durumda, onu bir resimle ilişkilendirmek yerine bir tamsayı depolamak için kullanırız. Oyuncu oyuna skorsuz olarak başlaması gerektiğinden, başlangıçta değerini ayarlayacağız 0, ancak bu daha sonra değişebilir.

7
8
9
10
11
local tapCount = 0
 
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY

Sonra, balondaki musluk sayısını görüntülemek için görsel bir nesne oluşturalım. Bu bölümde daha önce tartışılan katmanlaşma kurallarını hatırlıyor musunuz? Yeni nesneler daha önce yüklenmiş olan diğer nesnelerin önüne yerleştirilir, bu nedenle arka planı yükledikten sonra bu nesnenin yüklenmesi gerekir (aksi halde arka planın arkasına yerleştirilir ve görmezsiniz).

Arka planı yükleyen / konumlandıran üç satırdan sonra, aşağıdaki vurgulanan komutu ekleyin:

7
8
9
10
11
12
13
local tapCount = 0
 
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
 
local tapText = display.newText( tapCount, display.contentCenterX, 20, native.systemFont, 40 )

Bu komutu daha ayrıntılı olarak inceleyelim:

  • Komut local tapText, bir değişkenin bildirimi olarak kolayca tanımanız gereken ile başlar tapText.

  • display.newText()başka bir Corona API'sıdır, ancak daha önce yaptığımız gibi bir resim yüklemek yerine bu komut bir metin nesnesi oluşturur . Değişkeni tapTextbu nesneye atadığımız için, oyunumuz sırasında balonun kaç kez vurulacağıyla eşleşecek şekilde yazdırılan sayıyı değiştirmek gibi metinde değişiklikler yapabileceğiz.

  • Parantezlerin içerisinde, geçtiğimiz parametreler bulunmaktadır display.newText(). İlk parametre, metnin ilk basılan değeridir, ancak bunun gibi bir doğrudan dize değeri ayarlamak yerine, daha önce bildirdiğimiz değişkeni"0" atadığımızı fark edin ( ). Corona'da, bir değişkenin geçerli bir değişken olduğu sürece bir API parametresi olarak belirtilmesi ve API, değişkenin türünü bu parametre olarak kabul ettiği sürece tamamen geçerlidir.tapCount

İkinci iki parametre display.contentCenterXve 20bu metin nesnesini ekranda konumlandırmak için kullanılır. display.contentCenterXNesneyi ekranın yatay ortasına 20yerleştirmek ve dikey y konumunu ekranın üst tarafına ayarlamak için aynı kısayolu kullandığımızı fark edeceksiniz .

Bu API için dördüncü parametre , metnin oluşturulacağı yazı tipidir . Corona, tüm platformlarda özel fontları destekler , ancak bu oyun için varsayılan sistem fontunu belirterek kullanacağız native.systemFont.

Son parametre ( 40), işlenen metnin amaçlanan boyutudur .

 

Bu yeni kodun sonucunu kontrol edelim. Değiştirilen main.luadosyanızı kaydedin ve Simülatörü yeniden başlatın . Her şey yolunda giderse, metin nesnesi şimdi ekranın üst kısmına yerleştirilmiş şekilde gösteriliyor olmalıdır.

Programımıza devam - varsayılan olarak, birlikte oluşturulan metin display.newText()beyaz olacaktır. Neyse ki, bunu değiştirmek kolaydır. Yeni eklediğiniz satırı doğrudan izleyerek, vurgulanan komutu yazın:

13
14
local tapText = display.newText( tapCount, display.contentCenterX, 20, native.systemFont, 40 )
tapText:setFillColor( 0, 0, 0 )

Basitçe söylemek gerekirse, bu setFillColor()komut nesnenin dolgu rengini değiştirir tapTextsetFillColor()Komut aralığında dört sayısal parametreler kabul eder 0için1 renk kanalları için birer, kırmızı , yeşil , mavi ve alfa . Bu oyunda, nesneyi düz siyahla dolduruyoruz, böylece ilk üç kanal 0(alfa varsayılanları olarak ayarlanmış 1ve bu durumda atlanabilir).

Hadi devam edelim! Yeni metin nesnesi hoş görünüyor, ancak aslında hiçbir şey yapmıyor. Oyuncu balona hafifçe vurduğunda güncellenmesini sağlamak için pushBalloon()işlevimizi değiştirmemiz gerekir . Bu işlevin içine, balloon:applyLinearImpulse()komutu izleyerek, vurgulanan iki satırı ekleyin:

31
32
33
34
35
local function pushBalloon()
    balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
    tapCount = tapCount + 1
    tapText.text = tapCount
end

Bu satırları ayrı ayrı inceleyelim:

  • tapCount = tapCount + 1Komut artırır tapCount1 ile balon dokunulduğunda her zaman değişkeni.

  • İkinci yeni komut, tapText.text = tapCountnesnemizin textözelliğini günceller tapText. Bu, her seferinde yeni bir nesne oluşturmak zorunda kalmadan metni hızla değiştirmemizi sağlar.

 

Dikkatlice bakın - ekrandaki metni güncellemek için , nesnenin kendisini değil, metin nesnesinin bir özelliğini güncelleriz . Bu durumda, biz değiştirmek textözelliği tapTextyazısıyla tapText.text, ardından= daha sonra, yeni bir değer. Satırdaki tapCountdeğişkenin değerini doğrudan satırdan artırdığımızdan, metin nesnesini aynı değişken değerle güncellediğimizden, görsel ekran her zaman iç tapCountdeğeri yansıtır.

 

Bu kadar! Eğer kaydederseniz main.luadosya ve Simülatörü yeniden başlatmasını, oyun esasen bittikten - şimdi, her zaman Balonu dokunun ekranın üst kısmındaki sayaç etkin bir puan tutarak 1 oranında artacak.

 

Programın tamamını buradanBalloonTap indirebilirsiniz . Projeniz beklendiği gibi çalışmıyorsa, lütfen bu kaynak kodu indirin ve oluşturduğunuzla karşılaştırın.

 

Bölüm Kavramları

Bu bölümde birçok kavramı ele aldık. Biraz ezici görünebilir, ama sabırlı olun, kodunuza bakın ve gerekirse bölümleri tekrar okuyun. Yardıma ihtiyacınız olursa, Corona Forumları diğer Corona geliştiricileri ve çalışanları ile iletişim kurmak için uygun bir mekandır.

İşte bu bölümde öğrendiklerinize kısa bir genel bakış:

Komut / Mülkiyet Açıklama
display.newImageRect () Ekrana bir görüntü yükler ve görüntüler.
object.x Bir nesnenin yatay x konumunu ayarlar .
object.y Bir nesnenin dikey y konumunu ayarlar .
display.contentCenterX X ekseni boyunca içerik alanının merkezi için kısayol .
display.contentCenterY Y ekseni boyunca içerik alanının merkezi için kısayol .
object.alpha Bir nesnenin alfa seviyesini ayarlar (opaklık / saydamlık).
require() Örneğin verilen bir modül veya kitaplığı yükler "physics".
physics.start () Fizik motorunu çalıştırır.
physics.addBody () Bir nesneye fiziksel bir vücut ekler.
Nesne: applyLinearImpulse () Fiziksel bir nesneye benzetilmiş bir itme kuvveti uygular.
Nesne: addEventListener () Örneğin bir nesneye olay dinleyicisi ekler "tap".
display.newText () Ekranda bir metin nesnesi oluşturur.
Nesne: setFillColor () Metin ve vektör nesneleri için dolgu rengini ayarlar.