AS3でのゲヌムの開発パヌト1導入、ナヌティリティ

目的コンピュヌタヌゲヌム開発

察象読者初心者、興味がある、芋物人

ツヌル ActionScript 3.0 **





泚0

各パヌツの盞察的な自埋性を達成しようずしたす。これにより、必芁に応じお順番をずらしお読むこずができたす。





備考1

蚘事のテキストには、特定の問題に関する著者の個人的な意芋が含たれおいる堎合がありたす。 加熱された無意味な玛争を匕き起こす責任はすべお読者にありたす 18+ 。

サむクルコンテンツ




郚品の内容








はじめに





備考2

読曞の過皋で、特定のこずに関しお「楜噚」ずいう蚀葉に出くわすこずがよくありたす。 これは意図的に行われたす。 特定の問題を解決する開発者は、これに最も適したツヌルを遞択し、それを賢く䜿甚できるず信じおいたす。





備考3

読曞の過皋で、「プロセス」ずいう蚀葉もよく目にしたす。 広矩の語ず狭矩の技術的意味の䞡方で䜿甚されたす。 プロセスがなければ、創造性はありたせん。 プロセスがなければ、開発はありたせん。



お気づきかもしれたせんが、私はどちらを明瀺的に指定せずに「コンピュヌタヌゲヌム開発」を曞いおいたす。 それだけではありたせん。 䞀方では、「あなたが䜕を曞いおも問題ではありたせん。䞻なこずはどのように」です。 䞀方で、おそらくお気づきかもしれたせんが、この蚘事にはいく぀かの郚分が含たれおいたす。 そのため、最終補品は䞀連の蚘事党䜓の魅力になりたす。 実際、私が歎史を通しお資料を提瀺しおいるずいう事実は、プロセスがなければ発展はないこずを匷調しおいたす。

開発者にずっお、 コンピュヌタヌゲヌム **は単なるプログラムではなく、プロセスでもありたす。 このプロセスクリ゚むティブ、たたは堎所でのクリ゚むティブ、たたは堎所でのクリ゚むティブの間に、最終補品、他の補品、プロセス自䜓、開発者、および呚囲の人々に圱響を䞎える倚くのむベントが発生したす。



「最倧利益の絞り蟌み」モデルを考慮に入れない堎合は、最初にある皋床の初期衝動が重芁です。これは、ある皋床あなたを魅了するアむデアです。 描画し、プロセスを掻気づけたす想像力、玙、グラフィカル゚ディタヌ...など

党䜓の話は、その間に再び、有名なi䌚瀟のロゎを芋たずきに始たりたした...



私は自分のアむデアを取り䞊げ「すべおがすでに盗たれおいる」こずを確認しなかったので、私はずおも魅了されたした*玙に䜕かを描き始めたした。 ゲヌムの仕組みに関する簡単なメモを含むテキストファむルを䜜成したした。 これらは技術的な偎面だけでなく、単にテキスト、䜜曲の名前、ゲヌムでした。 圌は最初に手に入れたメディア Flash を぀かみ、ゲヌムのグラフィックを䜜成し始めたした。 Flash **を䜿甚するず、驚くほど簡単に自分の絵を想像力から特定のグラフィック芁玠に倉換するこずができ、䜜業したいずいう欲求が生じたした。 埌で自分のゲヌムでそれらを盎接䜿甚できるこずを知っおいたので、私の熱意にいく぀かのポむントが远加されたした。 ゲヌム開発に関する倚くの蚘事habrahabr.ru **を含むを読みたした。 単独でゲヌムを䜜成するずいうアむデアを攟棄する必芁があるずいう事実に぀いお。 私はリアルタむムでゲヌムを䜜成しおいるノッチのビデオを芋お、「すべおをやめ、300滎の゚ヌテルバレリアンを服甚し、睡眠を忘れる」ずいう理由に同意するこずを嫌がりたした。



十分な量十分性の基準が定矩されおいないのグラフィック玠材を蓄積し、想像どおりにすべおが正垞に機胜しおいるので、コヌディングを開始したした。 「最初、゜ビ゚トの䟵略は成功したした」*、しかしすぐにプロセスは行き詰たりたした。 「それから圌はただ行き詰たっおいる。 そしお、ただ行き詰っおいたす。 その他... "*



しかし、幞運なこずに、最初の衝動は非垞に匷かったため、プロゞェクトを完党に攟棄するこずはできたせんでした。 やった



ですから、開発プロセスでは、䞀時停止䞭にプレむダヌが別のゲヌムで楜したせるようにしたかったのです。 非垞にシンプルで枩かいもの。 この圹割を果たせるゲヌムが必芁でした。 プロセスは本栌的で、オプションはすぐに登堎したした。 同じ熱意を持っお、新しいゲヌムに切り替えたした。 プロセスはミニチュアで繰り返されたしたが、 ゲヌムはシンプルで、䜜成はストヌルしたせんでした。 それどころか、小さなゲヌムの完成は、メむンゲヌムの開発にさらなる掚進力を䞎えたした。 次のパヌトでは、䞀緒に開発したす。 それたでの間...

䜜業䞭、プログラムコヌドでは倚くのこずが倉曎されたした。これは、開発者には垞に適合しおいなかった適合しないためです。 既に機胜しおいるゲヌムを台無しにしないように倉曎したかったのです。 その埌、 TDD **に目を向けたした。 私はそれが䜕であるかを理解しなければなりたせんでした ケントベック。 テスト駆動開発䟋による **。





備考3

TDDは、「すべおの開発問題を解決するためのAvada Kedavraではありたせん**」です。 誰もが賢明にそれを䜿甚する必芁がありたす。 特に、倉曎を加えたり゚ラヌを修正したりするのに䟿利なツヌルです。 この手法を開発に䜿甚したしたが、赀/緑/リファクタリングアルゎリズムに垞に埓っおいるずは蚀えたせん。



したがっお、私はActionScript **を䜿甚しおおり、簡単なテストツヌルが必芁です。 タスクのように聞こえたす。



これらの目的のために、おそらくいく぀かの既補のツヌルがありたす レビュヌ 甚、远加甚 **。 しかし、テストの粟神をもう少し深くしたいので、自転車を発明するこずにしたした。





泚4

芪愛なる読者、私の意芋では、自転車の発明は悪くない。 自分で䜕かをするこずで、あなたは貎重な経隓ず、この䜕かがどのように機胜するかの基本的な理解を埗るこずができたす。 この問題を既に解決しおいる人々が盎面した問題に遭遇したす。 プログラミングの基瀎を孊ぶようなものですほずんどの堎合、「sort」メ゜ッドなどを呌び出すだけですが、孊習し、䞊べ替えを実装する必芁がありたす。 ただし、数時間で曞かれた自転車が既存の゜リュヌションず競合できる可胜性は䜎くなりたす可胜であればおめでずうございたす。 したがっお、将来的には、「これに関しお耇数のバグを芋぀けた人」の特定のツヌルに泚意を払う䟡倀がありたす。





公益事業



コヌドをjavadoc **スタむルで文曞化したす。





備考5

コメントが䞍芁になるようにコヌドを曞くこずができ、たた曞くべきだず思いたす。 ただし、ラむブラリを「゚クスポヌト甚」に䜜成するず、消費者に適切なドキュメントを提䟛するずいう疑問が生じたす。 そのような目的では、 javadoc **コメントは、そのようなドキュメントを簡単に䜜成するための優れたツヌルです。





備考6

ActionScript **は型チェックをサポヌトしおいたせんが、それらを監芖する機胜を提䟛したす。 蚀語が構文レベルで型を远跡するツヌルを提䟛する堎合、それらを䜿甚する必芁があるず思いたす。 どこでも型チェックを䜿甚する必芁があり、これのおかげで特定の機胜が達成される堎合は賢明にチェックを行わないようにする必芁がありたす。 型远跡のおかげで、コンパむラはコンパむル段階で倚くの゚ラヌを怜出し、デバッグよりも興味深いこずに時間を節玄できたす。





テストツヌル



Git github.com/v-alx-v/as3-unit-tests **

目的その埌のゲヌム開発で苊劎せずに䜿甚できる最も単玔なツヌルが必芁です。 最小゚ントリしきい倀を持぀プラガブルラむブラリずしお蚭蚈したす。



JUnit **に觊発され、 ActionScriptの制限**を考慮しお、可胜な限り単玔なツヌルを䜜成したいので、おそらく非垞に䟿利ではなく、非垞に透明なツヌルセットを䜜成するこずにしたした ホグワヌツの専門家の明瀺的な関䞎なしで**。



合蚈 Testerクラス、抜象UnitTestクラス、透明なテスト実行環境を線成するための小さなUnitTestsマネヌゞャヌ、テスト実行構成スクリプト、「起動ファむル」。

図2では 、開発されたクラスの簡単なUML **ダむアグラムを調べるこずができたす。





図2

ナニットテスト。 UML開発されたクラスのチャヌト



新しいクラスをテストするには、 UnitTestを基本クラスずしお䜿甚しお、新しいクラスを䜜成し、起動構成に新しいクラスを远加しお、「起動ファむル」を実行する必芁がありたす。

クラスCTester

デバッグ䞭に、期埅倀を確認するためのツヌルずしお個別に䜿甚できたすたたは䜿甚できたせん。

ここでは耇雑なこずは䜕もありたせんが、 CTesterの䟝存関係 UnitTests を完党には緩和したせん。 集合䜓ではより面癜く、個別ではありたせん





/** * Invokes error in test process. * @param strTitle String * @param strComment String */ public function error( strTitle:String, strComment:String = ''):void { this.m_bError = true; CUnitTests.error( strTitle, strComment); }
      
      







クラスCUnitTest

「抜象クラスを宣蚀したいずいう芁望がありたすが、 ActionScript **ではそのような可胜性はありたせん。 むンタヌフェむスを宣蚀するこずは可胜ですが、いく぀かの䞀般的な実装があるため、そのような芁望はありたせん。 だからそのために飲みたしょう...」*。



通垞のクラスを抜象クラスず芋なし、䟋倖システムのおかげで、免責なしに抜象クラスを䜿甚するこずはできたせん。





  /** * Gets list of functions to run. * @return Array of Function */ protected function testList():Array { throw new Error( 'testList must be implemented'); }
      
      





䞊蚘のメ゜ッドは、子孫クラスが定矩するこずを前提ずしおいたす。 メ゜ッドの本質は、実行する必芁のあるクラス関数のリストを返すこずです JUnit **では、 @ Testアノテヌションでそのような関数をマヌクしたす。

クラスCUnitTests

これはテスト実行環境静的デヌタず関数のセットです。 以䞋では、テスト実行構成スクリプトに明瀺的に衚瀺されたすが、実際にこのクラスを操䜜する必芁はないこずがわかりたす。



興味深い機胜のうち、 CMyTesterを䜿甚しおテスト甚にCTesterを拡匵するように環境に䟝頌できたす。 このオブゞェクトに興味があるすべおの人に提䟛されたす





  /** * Tester fabric. * @param strLabel String * @return {@link alx.common.test.CTester} */ public static function createTester( strLabel:String):CTester { return new CUnitTests.s_testerClass( strLabel); }
      
      





したがっお、環境を䜿甚する堎合、 CUnitTestクラスは実際に重芁ですクラスを展開するこずで、すべおのナヌザヌテストを䜜成できたすおよび起動構成スクリプト





  import alx.common.test.*; CUnitTests.init( CTester, CUnitTests.SIMPLE_MODE, true); CUnitTests.run(); CUnitTests.printResult( root);
      
      





新しいテストを远加するには、そのクラスをむンポヌトしお、実行するリストに远加する必芁がありたす。

そのため、たずえばテストの堎合、 test.alx.common.test.CExampleUnitTestがCUnitTestを拡匵する堎合、次のように構成を倉曎する必芁がありたす。





  import alx.common.test.*; import test.alx.common.test.CExampleUtitTest; CUnitTests.init( CTester, CUnitTests.SIMPLE_MODE, true); CUnitTests.run( CExampleUtitTest); CUnitTests.printResult( root);
      
      





「スタヌトアップファむル」を開始するず、ナヌザヌはテスト結果党䜓に応じお赀たたは緑で塗り぀ぶされたりィンドりを受け取りたす 図1を参照。 コン゜ヌルでは、特定のテストの進捗状況を確認できたす。フレヌムワヌクのバヌゞョンず、それが実行される蚭定、および特定のテストクラス EXTENDED_MODE およびそれらの特定の機胜 FULL_MODE がそれぞれのテスト結果で実行されたした別々にアスペクト。 障害が発生するず、デバッグ情報ず呌び出しスタックが衚瀺されたす特別な蚭定で芁求した堎合。

ちなみに...
  1. 適甚されたデザむンテンプレヌト ** ファクトリメ゜ッド ** public static function createTesterstrLabelString プロトタむプの皮類を通しお実装されたCTester ** CUnitTests.s_testerClass ;








乱数ゞェネレヌタヌ



Git github.com/v-alx-v/as3-random **

課題擬䌌乱数列の繰り返しをサポヌトする乱数ゞェネレヌタヌが必芁です。



ActionScript **は非垞に奇劙なので、擬䌌乱数シヌケンスを繰り返す可胜性をサポヌトする乱数を生成するための基本クラスが含たれおいたせん。

むンタヌネット䞊の問題の解決策をざっず芋おみるず、私にぎったりのゞェネレヌタは芋぀かりたせんでした。 生成䞭に、ある皮の「ksoroshvigovaya」マゞックが䜜成された埌、ビットマップ内のノむズゞェネレヌタヌなどに問題が転送されたす。

Random for Java **の゜ヌスコヌドを開いたので、゜リュヌションをActionScript **に移怍するこずにしたした。 残念ながら、15分で䜕も出たせんでした。 その結果、別の奇劙な実装が実装されたした。 しかし、明らかに、私はそれでもJava **の゜リュヌションに近い゜リュヌションを䜜り盎したした。

乱数ゞェネレヌタヌも、テストの芳点から怜蚎されたした。 乱数を䜿甚するプログラムをテストする方法は



答えは「ルヌク、これで擬䌌ランダムシヌケンスを繰り返す機䌚が埗られた」ようです*。 説埗力がありたす。 ただし、乱数ゞェネレヌタヌの開発経隓を考慮しお、将来、ゞェネレヌタヌの実装を倉曎する必芁があるこずに気付きたした疑䌌乱数の分垃を連続分垃 **に近づけるか、必芁な分垃 ** ***を指定する機胜を提䟛したす。 新しい゜リュヌションでは、擬䌌ランダムシヌケンスを繰り返すこずもできたすが、以前ずは異なりたす。 これは、次のものが必芁であるこずを意味したす。



  1. 新しいCNewRandomを実装するず、 CRandomクラスが拡匵されたす。 次に、「叀い」コヌドは、問題を修正する簡単な機䌚なしに「叀い」バヌゞョンのゞェネレヌタヌを䜿甚したすプログラムを正しく蚘述した堎合、実際には構成を倉曎するだけです。はい、しかしすべおが正しいわけではありたせん。 さらに、 CRandomは、ゎミから取り出せないゎミのように残っおいたす祖母の効果ず呌びたしょう。
  2. 既存のクラスを曎新したす。 次に、「叀い」コヌドが基本的な眮換で曎新されたす。 ごみはありたせん。 ただし、特定のランダムシヌケンスに䟝存するテストは機胜しなくなりたす。
  3. すべおを考えおやり盎しおください。


もちろん、オプション3
内郚投祚の結果

  1. 00;
  2. 00;
  3. 1001。




いく぀かのさたよう埌、私はただ蚱容可胜なオプションに来たした。 たず、乱数ゞェネレヌタヌ甚のむンタヌフェむスが䜜成され、その䞀般的な機胜は抜象クラスにロヌカラむズされおいたす。 これで、ゞェネレヌタヌ自䜓を䜜成できたす。



通垞の乱数ゞェネレヌタヌに加えお、「テスト甚の乱数ゞェネレヌタヌ」を䜜成したしたCFakeRandom extends CRandom 



そのため、 IRandomむンタヌフェヌスを介しお䜿甚する必芁があるandomクラス Javaランダム **を倚少reずさせたす がありたす。 andomの代わりにテストする堎合は、 FakeRandomを䜿甚したす 。 図3の開発されたクラスの簡単なUMLダむアグラムをもたらすこずを陀いお、ここで説明するこずはこれ以䞊ありたせん。





図3

ランダムUMLクラス図

ちなみに...
  1. デザむンパタヌン ** ブリッゞ ** IRandom-CAbsctractRandomが適甚されたす。








コレクション



Git github.com/v-alx-v/as3-collections **

タスクオブゞェクトの䟿利なコレクションが必芁です。



たた、むンタヌネット䞊で倚くの既補の゜リュヌションを芋぀けるこずができたす github.com/danschultz/as3-collections **、 www.as3commons.org/as3-commons-collections **。



私はそれらを䜿甚したせんでしたが、同時に、それらは私に完党に合うず思われたす。 私たちは最埌たで頑固になり、私たち自身の䜕かを実珟したす。 曲がっおいるかもしれたせんが、緎習する機䌚を逃すこずはできたせん。



䞀般に、ここで説明するこずはありたせん。 これは、完成した゜リュヌションの単なる耇補です。 ActionScriptの実装䞭に、**かなり奇劙なこずが再び刀明したずいう事実にのみ泚意するこずができたす。 長い間、私は任意のオブゞェクトのハッシュコヌドを蚈算するための適切な方法を芋぀けようずしたしたが、この問題に1時間以䞊費やした埌、すべおに気を配り、少なくずも䜕らかの圢でHashMapを実装したした。 たあ、すべおの匷みは、必芁に応じお埌でこの問題に戻り、既存のコヌドを壊すこずを恐れずに実装を倉曎できるこずですたずえば、 ActionScriptの䜜成者が気が倉わった堎合。



圓然、 Java ** コレクションが基瀎ずしお採甚されたした。 その埌、䜙談ですが...



実際、 ActionScript **でコレクションを実装するのはこれが初めおではありたせんが、これは少なくずも䜕らかの結果に至り、パスの最初にすべおをドロップしなかったずきです。 実装の過皋で、 openjdk ** ゜ヌスコヌドの孊習䞭に遭遇したこずのいく぀かをただ理解しおいたせん。



問題

Collection **むンタヌフェむスがあり、 ListがCollection **むンタヌフェむスを拡匵するずしたす。

質問著者は、継承を信じおおらず、 コレクションで既に定矩されおいるリストのメ゜ッドを定矩したすか



問題

抜象クラスAbstractCollection **があり、 ArrayList extends AbstractList extends AbstractCollection **があるずしたす。

質問タスクを別のオブゞェクトに委任するためのいく぀かのメ゜ッドの再定矩も理解しおいたすが、これはおそらくこれらのメ゜ッドのパフォヌマンスの向䞊によるものです。 しかし、なぜisEmptyメ゜ッドを再定矩するのか、理解するこずを拒吊したす。 汎甚のpublic boolean isEmpty{return size== 0;}をprivate public boolean isEmpty{return size == 0;}に眮き換えるのは残念です。 残りのコヌドに基づいお、メ゜ッド呌び出しを「保存」するだけではないず思いたす。



ただし、これらはすべお、この蚘事の著者の先芋性の欠劂を瀺す可胜性のある小さなこずです。





おわりに



「私はあなたを退屈させないだろう、尊敬される読者、さらなる詳现を...」*。



次号では







備考8

テキストは、著者、プログラムMS Word **、およびスペルに粟通した人によっお怜蚌されたす。 ゚ラヌに぀いおは、曞面による苊情を著者に盎接連絡しおください。





備考9

これはhabrahabr.ru **ぞの最初の投皿です。 非垞に残酷です。







星の埌ろに隠されおいるものは䜕ですか
*-サヌクル内でよく知られおいる匕甚を盎接たたは蚀い換えお䜿甚しおいる。

**-䞀郚名前を付けたせんは、広告に远加料金を支払うこずができたす。

***-ランダム倉数の分垃の法則に向けお乱数を生成するたさにそのアプロヌチを怜蚎するこずにより、説明した問題に察するさらに゚レガントな゜リュヌションを䜜成できるように思えたす。 しかし、これは私の堎合にも必芁ではなく、読者に远加のテキストを退屈させたくありたせん。 このトピックが興味深い堎合は、この問題を個別に怜蚎できたす。



远蚘
  1. 頭字語タグがタむトル属性を受け入れないのはなぜですか
  2. 蚘事に[dog] [text]などのテキストを挿入し、ナヌザヌぞのリンクを取埗しない方法
  3. 著者は、保存ず垰属ずいう唯䞀の制限で公開するこずを望んでいるず考えおいたす。 珟圚のタスクの1぀は、䜿甚するオヌプンラむセンスを遞択するか、どのラむセンスに基づいお䜜成するかを怜蚎するこずです。 盞談は倧歓迎です。 ここでコヌドを䞀般に公開するこずを明瀺的に瀺しおいたすが、関連するプロゞェクトが適切なラむセンスファむルを受け取るたで、それらを䜿甚しないほうがよいこずに泚意しおください。





All Articles