Corona SDKを使用して最初のAndroidゲームを作成する

著者: Randy Alexander
作成日: 1 4月 2021
更新日: 26 六月 2024
Anonim
Corona SDKを使用して最初のAndroidゲームを作成します!
ビデオ: Corona SDKを使用して最初のAndroidゲームを作成します!

コンテンツ


Google Playストアで最も人気のあるカテゴリは常にゲームです。 Webブラウザ、メールクライアント、インスタントメッセージングアプリなどの生産性向上アプリを使用している可能性がありますが、ゲームは依然としてモバイルエクスペリエンスの重要な部分です。そのため、Android向けの開発を学びたい多くの人がゲームを作ることから始めようとするのは驚くことではありません。また、正直に言って、ゲームを書くことは生産性アプリを開発することよりも楽しいことです!

Androidの公式言語はJavaであり、公式の開発環境はAndroid Studioです。 Javaを調べたい場合は、Javaの基本チュートリアルをお勧めします。AndroidStudioを使用してアプリを作成する方法を学びたい場合は、最初のAndroidアプリの作成に関するチュートリアルをご覧になることをお勧めします。ただし、Android用に開発する方法はJavaとAndroidスタジオだけではありません。利用可能な言語とSDKの概要については、次のガイドをご覧ください:Androidアプリを開発したい-どの言語を学ぶべきですか?

プログラミング言語ガイドで言及されているSDKの1つは、主にゲームを書くために設計されたサードパーティのSDKであるCoronaです。 CoronaはJavaの代わりに、習得が簡単で強力な高速スクリプト言語であるLuaを使用します。ただし、コロナはLuaを使用する唯一のモバイルゲームSDKではありません。他の有名な例には、Cocos2d-X、Marmalade、Giderosなどがあります。

ダウンロードとインストール

Coronaを使い始めるには、SDKをダウンロードしてインストールする必要があります。 CoronaのWebサイトにアクセスして、ダウンロードボタンを押します。キットをダウンロードする前に、アカウント(無料)を作成する必要があります。エミュレータでプログラムを実行するだけでなく、実際の.apkファイルを作成する場合は、Java 7をインストールする必要がありますが、Android SDKをインストールする必要はありません。 Java 7 Development Kitをインストールするには、OracleのWebサイトにアクセスし、「Java SE Development Kit 7u79」というセクションを探して、PC用のバージョンをダウンロードします。


Coronaをインストールしたら、アクティベートする必要があります。これは1回限りのプロセスであり、無料です。 Corona Simulatorを起動し、ライセンスに同意します。ダウンロードに使用したメールアドレスとパスワードを入力し、[ログイン]をクリックします。

プロジェクトを開始する

Corona Simulator内で[新しいプロジェクト]をクリックします。[アプリケーション名:]フィールドにアプリの名前を入力し、残りの設定はデフォルトのままにします。 「OK」をクリックします。

3つのウィンドウが表示されます。最初の2つは、Corona SimulatorとCorona Simular Outputです。 Coronaは、プロジェクトのファイルを表示するファイルエクスプローラーウィンドウも開きます。

プロジェクトディレクトリ内のファイルの大部分(そのうちの約23)は、アプリケーションアイコン用です!私たちにとって今最も重要なファイルは main.lua、アプリのコードを記述する場所です。

Luaの概要

コードの記述に入る前に、Luaのホイッスルストップツアーを作成する必要があります。 Luaインタープリター(これはコンパイル言語ではなく、スクリプト言語であることを忘れないでください)は、Windows、OS X、およびLinuxで使用できます。ただし、Coronaに組み込まれているため、この時点で追加のものをインストールする必要はありません。 Luaで遊ぶ最も簡単な方法は、オンラインライブデモを使用することです。

Luaに関する多くの優れたチュートリアルをオンラインで見つけることができます。Luaリファレンスマニュアル、Luaでのプログラミング、The.Lua.Tutorial、The Tutorials Point Lua Tutorialをご覧ください。


以下は、Luaの主要な機能の一部を示す小さなLuaプログラムです。

ローカル関数doubleIt(x)は、i = 1,10,1に対してx * 2 end do x = doubleIt(i)if(x == 10)then print( "ten")else print(doubleIt(i))end end

上記のコードは、関数、ループ、およびifステートメントの3つの重要なLuaコンストラクトを示しています。関数 doubleIt() 非常に単純で、渡されたパラメーターを2倍にします バツ.

メインコードは ために 1から10までループします。 doubleIt() 反復ごとに。戻り値が10の場合(つまり、 5)次に、コードは「10」を出力します。それ以外の場合は、単に結果を出力します doubleIt().

コーディングの経験があれば、サンプルコードは簡単に理解できるはずです。基本的なプログラミングを学習する場合は、上記のリソースを使用してスキルを磨くことをお勧めします。

ゲームを書く

Coronaで基本的なプログラムを書くのは簡単です。心配する必要があるのは1つのファイルだけです。 main.lua、 そして、コロナにすべての重労働を任せます。作成するゲームは、単純な「タップ」ゲームです。風船や爆弾は画面を失敗させます。プレーヤーがポイントを獲得したバルーンをタップした場合、爆弾をタップすると、ペナルティとしてスコアが2で除算されます。編集する必要があるコードを書くには main.lua。これは、任意のテキストエディターで実行できます。

Corona SDKには2D物理エンジンが組み込まれているため、ゲームの構築が非常に簡単です。ゲームを記述する最初のステップは、物理エンジンを初期化することです。

ローカル物理= require( "物理")physics.start()

コードはかなり自明です。モジュールの物理がロードされて初期化され、変数に割り当てられます 物理。エンジンを有効にするにはphysics.start() と呼ばれます。

次に、この単純なゲームだけでなく、より複雑なゲームにも役立ついくつかの有用な変数を作成します。 halfW そして halfH 画面の幅の半分と画面の高さの半分の値を保持します。

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

表示 オブジェクトは、Coronaがグローバルに利用できるようにする事前定義されたオブジェクトです。

さて、実際に画面上で何かを起こす最初のステップが来ます:

ローカルbkg = display.newImage( "night_sky.png"、halfW、halfH)

のようなプロパティと同様に contentHeight そして contentWidth表示 オブジェクトには多くの便利な機能もあります。の 新しいイメージ() 関数は画像ファイル(この場合は.png)を読み取り、画面に表示します。表示オブジェクトはレイヤーでレンダリングされます。したがって、これは画面に配置する最初の画像なので、常に背景になります(コードで明示的に変更しない限り)。パラメーター halfW そして halfH 画像を中央に配置するようコロナに指示します。

この時点で、エミュレータでコードを実行し、背景画像を見ることができます。ファイルを保存すると、エミュレータはファイルが変更されたことを認識し、再起動を提案します。そうでない場合は、[ファイル]-> [再起動]を使用します。

ユーザーはバルーンをタップしてポイントを獲得するため、スコア変数を初期化して画面にスコアを表示する必要があります。

score = 0 scoreText = display.newText(score、halfW、10)

スコアは想像上の名前の変数に保持されます スコア、そして scoreText スコアを表示するオブジェクトです。いいね 新しいイメージ(), newText() 画面に何か、この場合はテキストを配置します。以来 scoreText はグローバル変数であり、任意の時点でテキストを変更できます。しかし、私たちはすぐにそれに到達します。

エミュレータを再起動すると、画面の上部にスコア0が表示されます。

左:背景のみ。右:背景とスコア。

少しトリッキーになりますが、行ごとに説明するので心配しないでください。

ローカル関数balloonTouched(event)if(event.phase == "began")then Runtime:removeEventListener( "enterFrame"、event.self)event.target:removeSelf()score = score + 1 scoreText.text = score end end

上記のコードは、という関数を定義します balloonTouched() バルーンがタップされるたびに呼び出されます。バルーンがタップされるたびにこの関数を呼び出すようにコロナにまだ指示していませんが、これは後で行われますが、これを行うと、呼び出される関数になります。

タップまたはタッチイベントにはいくつかの段階があり、その多くはドラッグをサポートします。ユーザーはオブジェクトに指を置きます。これは「開始」フェーズです。指を任意の方向にスライドさせると、それが「移動」段階になります。ユーザーが画面から指を離すと、「終了」フェーズになります。

最初の行 balloonTouched() 「開始」段階にあることを確認します。バルーンを削除し、できるだけ早くスコアを増やしたいと思います。 「終了」のような他のフェーズで関数が再度呼び出された場合、関数は何もしません。

内部もし ステートメントは4行のコードです。最後の2つは簡単なので、最初に扱いましょう。スコア=スコア+ 1 スコアを1増やすだけで、scoreText.text =スコア 画面上のスコアテキストを変更して、新しいスコアを反映します。私が言ったことを覚えているscoreText グローバルであり、どこからでもアクセスできました。

さて、最初の2行について。風船や爆弾が画面の下部に落ちた後もアプリのメモリに残っているので、見ることができません。ゲームが進むにつれて、これらのオフスクリーンオブジェクトの数は着実に増加します。そのため、オブジェクトが見えなくなったら削除するメカニズムが必要です。という関数でそれを行いますオフスクリーン、まだ書いていません。この関数は、ゲーム中にフレームごとに1回呼び出されます。バルーンがタップされたら、それを削除し、バルーンが画面外になったかどうかを確認する呼び出しを削除する必要があります。

この線event.target:removeSelf() バルーンを削除します。タッチイベントが発生すると、リスナー関数のパラメーターの1つは出来事 パラメータ。それは、イベントについての関数と、それがどんなタイプのイベントであるかを伝えます。event.phase。 また、どのバルーンがタップされたかを示し、event.target。removeSelf() 関数はそれが言うことを行い、オブジェクト(この場合はバルーン)を削除します。

その前の行は、「enterframe」リスナーを削除します。これは、バルーンが画面の下部から落ちたかどうかを確認するためにすべてのフレームで呼び出される関数です。私たちが書くことになるとき、私たちはそれをより詳細に見ていきますオフスクリーン リスナー関数。

要約すると。balloonTouched()これがタッチシーケンスの開始であることを確認します。次に、「enterframe」リスナーを削除します。これは、バルーンが画面の下部から落ちたかどうかを確認するためにフレームごとに呼び出される関数です。次に、バルーンを削除し、スコアをインクリメントして、新しいスコアを表示します。

それは風船の場合でしたが、今度は爆弾にも同様のものが必要です。

ローカル関数bombTouched(event)if(event.phase == "began")then Runtime:removeEventListener( "enterFrame"、event.self)event.target:removeSelf()score = math.floor(score * 0.5)scoreText.text =スコアエンドエンド

ご覧のとおり、スコアを増やすのではなく、スコアに0.5を掛ける(つまり、2で割る)ことを除いて、コードは非常に似ています。の math.floor() 関数は、スコアを最も近い整数に切り捨てます。したがって、プレーヤーのスコアが3で爆弾をタップした場合、新しいスコアは1.5ではなく1になります。

私は言及した offscreen() より早く機能します。この関数はフレームごとに呼び出され、オブジェクトが画面から消えたかどうかを確認します。コードは次のとおりです。

ローカル関数offscreen(self、event)if(self.y == nil)then return if(self.y> display.contentHeight + 50)then Runtime:removeEventListener( "enterFrame"、self)self:removeSelf()end end

コンピューティングでは、競合状態として知られる状況があります。ここで2つのことが起こりますが、1つが最初に起こることもあれば、時にはもう1つが起こることもあります。レースです。常に最初に起こるように見えるためにいくつかの競合状態は見えませんが、それらはその日の興味深いバグを引き起こす可能性があります。適切な条件下では、他のことが最初に起こり、その後システムが壊れます!

この単純なゲームには競合状態があります。なぜなら、バルーンがタップされていることと、 offscreen() バルーンが画面から消えたかどうかを確認するために呼び出される関数。その結果、バルーンを削除するコードを呼び出してから、 offscreen() 関数が呼び出されます(1秒間に30回発生します)。この奇妙な一連のイベントを回避するには、 offscreen() 関数は、 y オブジェクトの値は なし (null)またはない。もしそれが なし オブジェクトが既に削除されていることを意味します。したがって、これらは私たちが探しているドロイドではありません。

オブジェクトがまだ再生中の場合は、その位置を確認します。画面から50ピクセル離れた場合は、オブジェクトを削除してリスナーを削除し、 offscreen() このオブジェクトに対して関数が再度呼び出されることはありません。確認するコードoffscreen() すべてのフレームは、コードの次のセクションの一部と呼ばれます。

このゲームの全体的な前提は、新しい風船や爆弾が引き続き画面にドロップダウンすることです。したがって、新しいバルーンまたは新しい爆弾を作成する関数が必要です。

ローカル関数addNewBalloonOrBomb()local startX = math.random(display.contentWidth * 0.1、display.contentWidth * 0.9)if(math.random(1,5)== 1)then-BOMB! local bomb = display.newImage( "bomb.png"、startX、-300)physics.addBody(bomb)bomb.enterFrame = offscreen Runtime:addEventListener( "enterFrame"、bomb)bomb:addEventListener( "touch"、bombTouched)else -バルーンローカルバルーン= display.newImage( "red_balloon.png"、startX、-300)physics.addBody(balloon)balloon.enterFrame = offscreen Runtime:addEventListener( "enterFrame"、balloon)balloon:addEventListener( "touch"、 balloonTouched)end end

関数の最初の行は、バルーンがどこからドロップするかを決定します バツ 飛行機。風船や爆弾が常に真ん中に落ちたら、それはあまり面白くないでしょう!そうstartX 画面幅の10〜90パーセントの乱数です。

次に、1〜5の乱数が選択されます。数が1の場合、爆弾が投下されます。 2、3、4、または5の場合、バルーンがドロップされます。これは、爆弾が約20パーセントの時間で投下されることを意味します。

爆弾とバルーンのコードは非常に似ています。最初に、画像(爆弾または風船)を使用して表示されます新しいイメージ(). その バツ 位置はstartX その間 y 位置は-300、つまり画面の上部から外れた位置に設定されます。その理由は、オブジェクトを画面領域の外側から可視領域に落とし、次に下に落とすことです。 2D物理エンジンを使用しているため、オブジェクトに落下するまでの初期距離を少し与えると、ある程度の速度を得ることができます。

への呼び出しphysics.addBody() によって読み込まれた画像を取ります 新しいイメージ() 物理エンジンでオブジェクトに変換します。これは非常に強力です。を呼び出すだけで、重力と衝突に応答するボディに任意の画像ファイルを作成できます。physics.addBody()。

爆弾またはバルーンコードの最後の3行でリスナーを設定します。設定するenterFrame プロパティは、すべてのフレームを呼び出す関数とランタイム:addEventListener() 設定します。最後にballoon:addEventListener() 爆弾または気球に触れた場合に呼び出す関数をコロナに伝えます。

そして今、ゲームはほぼ完了しています。さらに2行のコードが必要です。

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

最初の行は、明示的に呼び出して、最初の爆弾または風船を落下させますaddNewBalloonOrBomb()。 2行目は、タイマーを設定します。addNewBalloonOrBomb() 0.5秒ごと(500ミリ秒)。これは、新しいバルーンまたは爆弾が0.5秒ごとに落下することを意味します。

これで、エミュレータでゲームを実行できます。

main.luaの完全なリストを次に示します。このゲームの完全なプロジェクトソースコードは、GitHubにあります。

-------------------------------------------------- -----------------------------------------落下風船と爆弾ゲーム- Gary Simsによる-------------------------------------------- -----------------------------------------------開始物理エンジンlocal physics = require( "physics")physics.start()-画面の幅と高さの半分を計算halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5-背景を設定ローカルbkg = display.newImage ( "night_sky.png"、halfW、halfH)-スコアスコア= 0 scoreText = display.newText(score、halfW、10)-バルーンがプレイヤーによってタップされたときに呼び出されます-1ローカル関数balloonTouched( event)if(event.phase == "began")then Runtime:removeEventListener( "enterFrame"、event.self)event.target:removeSelf()score = score + 1 scoreText.text = score end end-が呼び出されたとき爆弾はプレイヤーによってタップされます-ペナルティとしてのスコアの半分ローカル関数bombTouched(event)if(event.phase == "began")その後Runtime:removeEventListener( "enterFrame"、event.self)event.target:removeSelf()score = math.floor(score * 0.5)scoreText.text = score end end-落ちたオブジェクトを削除する画面の下部ローカル関数offscreen(self、event)if(self.y == nil)then end if(self.y> display.contentHeight + 50)then Runtime:removeEventListener( "enterFrame"、self)self:removeSelf ()end end-新しい落下バルーンまたは爆弾ローカル関数を追加します。addNewBalloonOrBomb()-GitHubリポジトリでstart_ = math.random(display.contentWidth * 0.1、display.contentWidth)にred_ballon.pngとbomb.pngがあります。 * 0.9)if(math.random(1,5)== 1)then-爆弾! local bomb = display.newImage( "bomb.png"、startX、-300)physics.addBody(bomb)bomb.enterFrame = offscreen Runtime:addEventListener( "enterFrame"、bomb)bomb:addEventListener( "touch"、bombTouched)else -バルーンローカルバルーン= display.newImage( "red_balloon.png"、startX、-300)physics.addBody(balloon)balloon.enterFrame = offscreen Runtime:addEventListener( "enterFrame"、balloon)balloon:addEventListener( "touch"、 balloonTouched)end end-新しいバルーンまたは爆弾を今すぐ追加addNewBalloonOrBomb()-0.5秒ごとに新しいバルーンまたは爆弾を追加し続けるtimer.performWithDelay(500、addNewBalloonOrBomb、0)

次のステップ

次のステップは、実際のAndroidデバイスでゲームをプレイすることです。 .apkファイルをビルドするには、[ファイル]-> [Android用にビルド...]をクリックして、フィールドに入力します。結果は、デバイスにコピーしてインストールできる.apkファイルになります。不明なソースからアプリをインストールできるようにデバイスを設定したことを確認する必要があります。 Amazonには、Amazon Appstoreをインストールするためにこれを設定する必要があるため、これに関するいくつかの優れたドキュメントがあります。 Coronaには、Androidデバイスでアプリに署名、ビルド、およびテストする方法に関するガイドもあります。

ゲームがデバイスに正常にインストールされたら、次に行うことはゲームを改善することです。たとえば、「ポップ」や「バング」を追加して、風船や爆弾がタップされたすべての音を鳴らしてみませんか。 CoronaにはそのためのAPIがあります。media.playEventSound().

または、現在のスコアを2倍にするスーパーブーストなど、3番目のタイプのオブジェクトを追加してみませんか?

要約

Coronaを使用したゲームの作成は、SDKがOpenGLなどの処理を行い、2D物理エンジンが組み込まれているため、非常に簡単です。また、Luaは習得が容易であり、最小限のプログラミング経験がある人でも難しくはないはずです。 CoronalabsのWebサイトには、多くのガイドやチュートリアルを含む多くのドキュメントがあります。

100行未満のコードで、動作するゲームがあります。賞品を獲得するつもりはありませんが、Corona SDKのパワーと柔軟性を示しています。

Google Pixel 3aのリークに不足はありません。スペックシートの詳細を示しており、デバイスをよりよく見ることができます。現在、シリアルチップスターのEvan Blaがパーティーに参加し、Twitterを介してPixel 3aのレンダリングを行っています。画像は以前のリークと一致しており、主力のPixel 3に非常によく似た携帯電話を示しています。つまり、前面にある大きなベゼル、ユニークな...

Google Pixel 3aとPixel 3a XLには、より高価なGoogle Pixel 3と同じ背面カメラハードウェアが含まれていますが、そのセンサーで撮影した写真には同じ権限がありません。これまでのすべてのGoogle Pixel携帯電話には、携帯電話で元の品質で撮影された写真や動画を無料でGoogleフォトにバックアップする機能など、すてきな特典が含まれています。この機能は、Googl...

編集者の選択