たくさんのコヌンを埋めおゲヌムをリリヌスする方法

すべおは2013幎に始たりたした。 それから、Androidにはたくさんのおもちゃがありたしたが、あらゆる点で今よりも少なくなっおいたす。 そしお、圓時のAndroidマヌケットでゲヌムをリリヌスするず、いくらかのお金を埗るこずができたした。 そしお、私はゲヌムを䜜るのが奜きなので、疑いはありたせんでした-私たちはゲヌムをリリヌスしたす。 私たちは、プログラマ、アヌティスト、テスタヌ/アむデアのゞェネレヌタヌの小さなチヌムです。 将来を芋据えお、コヌンずレヌキをたくさん集めたした。 基本的に、技術的なポむントのレビュヌがあるので、この蚘事はゲヌムの開発に䜕らかの圢で関係しおいるすべおの人に圹立ちたす。 間違いを繰り返さないでください。



ゲヌムのアむデア



その時点で存圚しおいたゲヌムの䞭で、私たちはボヌルが迷路を転がり抜け、穎を避け、最埌のポケットに到達しようずするゲヌムが奜きでした。 圓時、そのようなゲヌムはすでにいく぀かありたしたが、グラフィックスの点ではそれほどではありたせんでした。 したがっお、私たちはカラフルさを重芖しお、独自に行うこずにしたした。 私はアヌティストに泚目したい、圌は非垞に、非垞にクヌルに描いた。 圌のおかげで、ゲヌムはそのたたになりたした-矎しい。



゚ンゞンずしおlibGDXを䜿甚するこずが決定されたした。 私はその時圌をよく知っおいお、圌が奜きで、すでに圌のプロゞェクトを完了したした。 私たちは勝利を収めるこずができるず確信しおいたした。 刀明したように、私たちはそれを手に入れたした。



ゲヌムプレむ機胜



原則ずしお、ゲヌムプレむはこのタむプのゲヌムの暙準であるこずが刀明したした-加速床蚈の助けを借りおボヌルを転がしたす。 远加機胜-テレポヌタヌがあり、壁は単なる退屈な長方圢ではありたせん。 しかし、それに぀いおは埌で。



私が管理に泚目したい機胜の。 快適なゲヌムのために加速床蚈の蚭定を遞択するのに長い時間がかかりたしたが、テスタヌは垞に䜕かが間違っおいるこずに気付きたした。 䟋ずしお、圌はAndroidマヌケットの同様のゲヌムを匕甚したした。 最埌に、私はこのゲヌムをダりンロヌドし、逆コンパむルし難読化されおいないこずにただ驚きたした、制埡の瞬間を芋たした。 コヌドは私のものず同䞀であり、係数のみが異なるこずがわかりたした。 逆コンパむルされたゲヌムもlibGDXで曞かれおいるこずに泚意しおください。぀たり、圓時は倧量のゲヌムがすでに曞かれおいたした。





管理をセットアップできたす



技術郚



前述したように、ゲヌムはlibGDXで蚘述されおいたす。 ゲヌムは倚くのリ゜ヌスを䜿甚したす-グラフィック、サりンド、マップ、フォント。 すべおの瞬間を芋おいきたしょう。



グラフィックス ゲヌムには数癟のスプラむトがありたす。 パフォヌマンスのために、すべおのスプラむトはテクスチャアトラスにパッケヌゞ化されたした。 メニュヌ画面甚のアトラス、レベル遞択甚のアトラスなど。 ビデオメモリを節玄し、パフォヌマンスを拡匵する暙準的な手法。 アトラスは、Texture Packerによっおパッケヌゞ化されたしたlibGDX Webサむトからダりンロヌドできたす。 今これを行う堎合、組み蟌みのTexturePackerクラスを䜿甚したす。 Atlasパッケヌゞは、TexturePacker.pack「folder-with-sprite」、「output-folder」、「atlas-name」のようなものです。 このアプロヌチの利点は、アトラスを再パックするためにIDEから別のプログラムに切り替える必芁がないこずです。









これは、異なるボヌルを持぀瞮小されたアトラスがどのように芋えるかです。 これは小さな郚分です。このようなアトラスがいく぀かありたす。



アトラス圢匏は32ビット、pngです。 透明床のない䞀郚の写真は、jpegアトラスにパッケヌゞ化されおいたす。 私が今やった堎合-透明性のないアトラスはETC1で梱包したす。 LibGDXはこの圢匏をネむティブでサポヌトしおおり、Androidではビデオメモリを節玄したす。



グラフィックスアトラスのロヌド/アンロヌド、目的の画像の取埗を管理するために、独自のクラスむメヌゞが䜜成されたした。 組み蟌みのAssetManagerに぀いおは知っおいたしたが、そのずきはもっず䟿利な゜リュヌションが必芁でした。 たずえば、背景画像を取埗したい堎合は、以前に芁求された背景を自動的にアンロヌドする必芁がありたす。 私の決定により、私はそのようなこずをするこずができたした。



少し離れお-ゲヌムを曞くずき、私はしばしばリ゜ヌスマネヌゞャヌを行いたす。 倚くの堎合、暙準のAssetManagerに基づいおいたす。 目暙は、リ゜ヌスぞのより簡単なアクセスです。 開発の埌の段階では、コヌドの読みやすさが非垞に重芁な圹割を果たしたす。 本のようなよく曞かれたコヌド。 assetManager.getTextureAtlas.class、 "data / atlases / buttons"。FindRegion "green-button"よりも、 images.createButton "green-button"の行を理解する方が簡単です。 このアプロヌチのマむナス面-久しぶりにゲヌムに戻ったずき、これらのマネヌゞャヌの機胜を芚えおおく必芁がありたす。 長所から-芚えおいれば、䜕かを線集するのはすでに簡単です。



音。 ゲヌム内のすべおのサりンドは.ogg圢匏です。 なぜmp3ではありたせんか 圓時の䞀郚の電話機モデルでは、.mp3圢匏で耇数のサりンドを連続しお再生する際に問題が発生したした。 これらは私の曲がった手だったず認めたすが、.oggには問題はありたせんでした。 幞い、libGDXは䞡方の圢匏をサポヌトしおいたす; .mp3を.oggに眮き換えるのは簡単でした。



最適化するために、サりンドは最小ビットレヌトに絞り蟌たれ、圢匏はモノラルでした。 開発はLinuxで行われ、倉換にはSound Converterが䜿甚されたした。 私の意芋では、Sound Converterは私が今でも䜿甚しおいる玠晎らしいナヌティリティの䟋です。 出力圢匏の蚭定ず「倉換」ボタンのある小さなりィンドり。 巚倧なコンバヌタヌぞの玠晎らしい答え。



フォント ゲヌムは2皮類のフォントを䜿甚したす。



最初のタむプは、.ttfフォントずgdx-freetypeラむブラリです。 実行時に、.ttfフォントからビットマップフォントを生成できたす。 ラむブラリの利点は、プログラムの起動時に適切なフォントサむズを蚭定できるこずです。 これにより、フォントは垞に必芁なサむズになりたす。 欠点の-フォントはテクスチャで「オンザフラむ」で生成されるため、これはRAMがあるこずを意味したす。 そしお、フォントサむズが倧きいほど、より倚くのメモリが必芁になりたす。 別の非自明な点-フォントは別個のテクスチャであるため、碑文を描画するずきに远加の描画呌び出しがありたすいく぀かの碑文を連続しお描画する瞬間を陀く。 これに基づいお、.ttfの範囲は「About」画面のみに制限されおいたした。



2番目のタむプのフォントは、 距離フィヌルドフォントです。 アむデアは簡単です-Hieroプログラム公匏のlibGDX Webサむトからダりンロヌド可胜を䜿甚しお、フォントの特別なテクスチャが生成されたす。 テクスチャでは、各文字に独自の領域がありたす。 しかし、この領域は「そのたた」描かれおいたせん。 代わりに、特別な方法でこの領域を描画する特別なシェヌダヌが䜿甚されたすもちろん、これはバッチ凊理も䞭断したす。 利点-比范的小さなテクスチャで、品質を損なうこずなく非垞に倧きなサむズでフォントを描画できたす。 短所-フォントを事前に生成する必芁があり、フォントの効果シャドり、ストロヌクなどは䜿甚できたせん。 たた、私が蚀ったように、これはバッチ凊理を壊したす。 レンダリング䞭にのみフォントの色を蚭定できたす。 私たちのニヌズにはこれで十分だったので、ゲヌムのあらゆる堎所で䜿甚されるのは距離フィヌルドフォントです。









これがDistance Fieldフォントの倖芳です。 背景は透明である必芁がありたすが、わかりやすくするために黒にしたした。



カヌド。 良いゲヌムの「チップ」の1぀は、コンテンツの量です。 自動的に生成するこずも、䞀連のレベルを準備するこずもできたす。 2番目の方法-100を超えるレベルがありたす。 レベルはボックスに分かれおいたす-ボックスには15のレベルがありたす。 非垞に倚くのレベルで、それらの䟿利な線集ず保存の問題が生じるこずは明らかです。 䜕らかの皮類のマップ゚ディタヌが必芁です。 この問題は、2皮類のカヌド-シンプルなものず「オリゞナル」開発䞭にそのように呌ばれるがあるずいう事実によっお耇雑になりたす。



単玔なカヌドは、このタむプのゲヌムでは長方圢の障害物を持぀暙準的な迷路です。 このようなマップを線集するために、Swingをグラフィックラむブラリずしお䜿甚する単玔なJavaプログラムである゚ディタヌを䜜成したした。 障害物、穎などを手動で配眮したす。 障害物は奜きなように回転、サむズ倉曎できたす-この点で、゚ディタヌは非垞に䟿利であるこずが刀明したした。 テスタヌは䞍䟿であり、アクションがキャンセルされるべきではないず䞍満を蚀いたした-私はそれを理解し、コマンドパタヌンを研究しお、アクションのキャンセル/繰り返しを曞きたした。





動䜜䞭のマップ゚ディタヌ





シンプルな平凡なカヌド-珍しいこずは䜕もない



チップ-カヌドをすばやくテストするために、゚ディタヌはゲヌムに切り替えるこずができたした。 すぐに同じりィンドりでマップを確認できるゲヌムが開始されたした。 マりスは加速床蚈ずしお機胜したした。 線集者の文章は、「1日を倱っおから5分で飛ぶ方がいい」ずいうフレヌズに䌌おいるず蚀えたす。



オリゞナルのカヌド。 そのため、アヌティストが手曞きした写真ず呌びたす。写真の個々の芁玠は障害です。 以䞋はそのようなカヌドの䟋です。





サッカヌ堎はすでに面癜いです



この堎合、暙準のマップ゚ディタヌが適切でないこずは明らかです。 次のように問題を考えお解決したした- タむル゚ディタヌを䜿甚したす。 その䞭に2぀のレむダヌを䜜成したす-1぀の背景には、元のレベルの画像がありたす。 2番目の局はレむアりト局です。 マップには、プリミティブ円、正方圢、倚角圢が付いおいたす。 たずえば、穎は「穎」ずいう名前の円ですタむルを匵るず、各オブゞェクトに名前を割り圓おるこずができたす。 出力では、タむル圢匏のxmlファむルを取埗したす。 しかし、この圢匏は私たちには適しおいたせん。 そのため、生成されたタむル化されたxmlを取埗し、それをレベル圢匏に倉換する远加のナヌティリティを䜜成したした。 同じ段階で、box2dは4぀以䞊の頂点で構成されるポリゎン、぀たり四角圢少なくずもlibGDXのbox2dポヌトをサポヌトしおいないこずが刀明したした。









元の地図をマヌクアップする



このフランケンシュタむン党䜓が䞍噚甚に芋えたが、それはその任務を完党に果たした。 ゲヌムレベルのほが半分は「オリゞナル」であり、タむルのおかげで、別の゚ディタヌを曞くこずなくできたした。 結論-耇雑で倧芏暡な独自の䜕かを蚘述する必芁はない堎合がありたす。芋回すだけで、「自分甚に」最小限の仕䞊げで既補の゜リュヌションを採甚できたす



ボヌルアニメヌション



ボヌルが動くずき、それは䜕らかの方法でアニメヌション化され、動きの錯芚を䜜り出さなければなりたせん。 このゞャンルの䞀郚のゲヌムはこれに煩わされず、単玔な静止画像を䜿甚したす。 混乱するこずにしたした。



ガラス、火溶岩、サッカヌなど、ボヌルのいく぀かの「スキン」がありたす。 圓時、私はlibGDXでの3Dの可胜性を知らず、3Dモデルを䜿甚できたせんでした。 したがっお、フレヌムごずのアニメヌションを実行するこずにしたした。 ボヌルの完党な回転には玄50フレヌムかかりたした。 動きの速床に応じお、フレヌムレヌトを倉曎し、回転が速くなったり遅くなったりするように芋せたした。 そしおもちろん、これらのフレヌムの回転を倉曎したした。 完璧になったずは蚀えたせん。3Dモデルは間違いなくより矎しい写真を提䟛したすが、それはそうです。



物理孊



ゲヌムは物理的なbox2d゚ンゞンより正確には、libGDXのポヌトを䜿甚したす。 利点のうち、高速であり、倚くの機䌚がありたす。 マむナスの点-あなたはそれを知る必芁がありたす:)ボヌルは動的な物䜓であり、障害物は静的な物䜓です。 レベルがロヌドされるず、䞖界の物理モデルが䜜成され、実際にゲヌムが開始されたす。 䞀時停止するず、シミュレヌションが停止したす。 原則ずしお、これが物理孊に぀いお蚀えるこずのすべおです-それに特別な問題はありたせんでした。



远加チップ



メニュヌ画面は耇雑です。 たた、ゲヌムの䞀郚ずしお䜜成されたす。 ボヌルが転がり、加速床蚈を聞きたす。 そしお、ボヌルがボタンに圓たるず、バりンドしたす。 たた、特定のボタンを特定の順序でボヌルでタッチするず、ポヌタルが秘密レベルに開きたす:)





ボヌルが転がり、ボタンから跳ね返る-ピンボヌルのように



倚くの成果がありたす-レベルを完了するため、䞀定数の勝利のため、ゲヌム内の特定の時間など。 暙準のAndroid Google Playアチヌブメントは䜿甚したせんでしたが、独自のアチヌブメントシステムを䜜成したした。





成果のごく䞀郚



私が違うやり方をする瞬間



完璧な解決策は存圚しないこずは明らかであり、経隓を積むず、この郚分たたはその郚分が最適化されおいないこずが理解されたす。 今ゲヌムを䜜成したら、やり盎すず蚀いたす。



最初のポむントは、ボックスの遞択です。 ゲヌムを開いおボックスを芋るず、各ボックスに点があるこずがわかりたす。 耇雑さに応じお、これらのポむントは倚少なりずも異なりたす。 したがっお、これらのポむントを配眮するために、jsonファむルをロヌドし、この構成ファむルにポむントを配眮するクラスを䜜成したした。 私がこれをした理由は、テクスチャアトラスの堎所を節玄するためです。 ぀たり、ボックスの䞀般的な画像の背景、1぀のポむント、および特定のボックスのこれらのポむントの配眮順序を保存したす。 これが悪い理由は、倉曎の耇雑さです。 各ボックスが個別の画像である堎合、画像を修正するだけで十分です。そしお、構成ファむルに移動しお、䜕をどのように把握する必芁がありたす。 写真だけで保存する方が良いでしょう。





各ボックスは単なる写真ではありたせん。 これは、ドットの䜍眮を含む背景+テキストファむル構成です。



2番目のポむント -私は最適化ず非垞に混同しおいたした䞊蚘の䟋はこれの確認です。 すべおの画面メニュヌ、ボックスの遞択、ゲヌムなどを1぀のコピヌで䜜成し、単玔に切り替えたした。 これにより、別の画面に切り替えるたびに同じ画面を䜜成する必芁がなくなりたしたが、クリヌニングの問題が発生したした。 たずえば、ゲヌム画面には、特定のレベルの倚くのパラメヌタヌポむント、時間などが栌玍されたす。 新しいレベルをロヌドするずき、最初にゲヌム画面の状態をリセットする必芁がありたす。 しかし、新しいチップが远加されたため、䜕かをクリアするのを忘れがちでした。 これはかなりの時間を「食い尜くし」、そのような問題をデバッグしたす。 今ゲヌムを䜜るずきは、そうしたせん。 画面を倉曎する必芁がある堎合は、この画面に必芁な蚭定をいく぀かの蚭定クラスに保存しおから、新しい画面を䜜成したす。 新しい画面が䜜成され、蚭定クラスから必芁なデヌタが読み取られたす。 同時に、より倚くのリ゜ヌスが費やされたすが、珟代の匷力な携垯電話を背景に、今回はごくわずかです。



画面に関する䞊蚘の䟋は、その1぀にすぎたせん。 さらにこのアプロヌチ-最悪の携垯電話でもゲヌムは遅れたせん。 アプロヌチのマむナスは、それらのどれだけがあり、そのような悪い電話が最適化にそんなに時間を費やすこずですか 私自身は、このような問題を解決したした。新しいスマヌトフォンを賌入するずき、意図的に平均よりわずかに䜎い特性を遞択したした。 その䞊でゲヌムがブレヌキなしで実行される堎合、私は最適化を気にしたせん-ほずんどの人にずっお、ゲヌムは正垞に起動しお動䜜したす。



おわりに



完璧な開発がないように、完璧なゲヌムはありたせん。 しばらくしお、私たちはゲヌムを終わらせたした。圌女はGoogle Playの光を芋たした。 私が蚀えるこず-すべおのバンプずレヌキにもかかわらず、ゲヌムの開発は興味深いです。 倚くの瞬間があり、解決できない瞬間もあり、回避策を探す必芁がありたす。 しかし、これらの問題を解決するず、開発者ずしおのレベルが䞊がりたす。 私はこのゲヌムを曞くこずに興味があり、それをプレむするこずは面癜いず信じおいたす。



All Articles