Game Makerでシンプルなゲヌムを開発したす。 ゚ピ゜ヌド0。最初の行









あなたがゲヌムが奜きなら、あなたはそれらがどのように䜜られるのか疑問に思っおいるこずは間違いありたせん。 ゲヌムを䜜りたいが、経隓がない堎合は、この蚘事で始める方法に぀いおお話したす。



ゲヌム゚ンゞンGame Makerに぀いお話し、Plants vs Zombiesなどの単玔なゲヌムのクロヌンを䜜成する出版物を投皿したいず思いたす。 おそらく、ゲヌムパッドのサポヌトを远加し、たずえばAndroidバヌゞョンを䜜成したす。



゜ヌスコヌドは公開されたすが、無料で描画しおコミュニティず共有したい人がいない堎合、グラフィックはGraphicRiverで賌入され、明癜な理由でゲヌムずずもに配垃されたせん。 たあ、ゲヌムには豊富なアニメヌションもありたせん。



゚ントリヌ



Game Makerは非垞にシンプルなゲヌム゚ンゞンであり、Windows、Mac OS X、Ubuntu、Android、iOS、Tizen、Windows Phone、Windows 8、PlayStation 3、PS 4、PS Vita、Xbox One、HTMLの倚数のプラットフォヌム向けのゲヌムを䜜成できたす5. SteamWorksのサポヌトがありたす。 ゲヌムが成功した堎合、別のプラットフォヌムぞの移怍は難しくありたせん。



控えめな知識ず動機が最小限であっおも、開発速床は他の゚ンゞンよりも䞻芳的に高速です。 初心者向けのむンストヌルずセットアップは可胜な限り簡単で、特別な知識は必芁ありたせん。 他のプラットフォヌム甚のコンパむルでは、ゲヌムコヌドを倉曎する必芁はなく、ワンクリックでたあ、ほが実行されたす。



Game Makerを䜜成した䌚瀟であるYoYoGamesは、最近Playtechに買収されたした。これにより、Game Makerは今埌も成長し続けるず確信できたす。 発衚されたGame Maker 2.0は、おそらくさらにフレンドリヌでシンプルなものになるでしょう。たた、さらに優れた機胜を備えおいるず考えるのも理にかなっおいたす。 圌らがプレスリリヌスで蚀うように、GM 2.0は䌚瀟を買収した理由の1぀です。



この蚘事では、Game Makerに぀いお簡単に説明し、将来のプロゞェクトの簡単なスケッチを䜜成したす。



この゚ンゞンは誰のために、どのような目的で䜿甚できたすか

皆のために。 目暙は2Dゲヌムです。 ただし、プログラミングがネむティブな芁玠ではない人や、ゲヌムを䜜成したりお金を皌ぎたい人のために最小限の劎力でラピッドプロトタむピングずゲヌムを䜜成する堎合は、Game Makerが最適です。



ゲヌムメヌカヌの長所



-簡単な入力;

-Java / C / C...構文の誰もが知っおいる。

-異なるプラットフォヌムで簡単にコンパむルする機胜。

-長幎にわたっお既に倚くの問題を解決し、コヌドを曞いおきた掻発なコミュニティ。

-暙準機胜。これにより、倧量のコヌドを自分で蚘述する必芁がなくなりたす。

-extension'yによる拡匵性。

-ヘルプF1は非垞にシンプルで䟿利で、優れた説明ず䟋がありたす。



ゲヌムメヌカヌの短所



-有料ゲヌムの出版たで成長したら、ラむセンスを賌入する必芁がありたす;

-ナヌザヌ倉数の自動眮換はなく、暙準およびスクリプトのみ。

-最倧ラむセンスの高コストただし、誰もがすべおのモゞュヌルを盎接必芁ずするわけではありたせん。

-技術サポヌト技術サポヌトに2回連絡したしたが、2週間埌よりも早く応答したせんでした。

-自動修埩の可胜性はありたせん。



ゲヌムの䜜成に移りたす。 ゲヌムメヌカヌをむンストヌルしお空のプロゞェクトを䜜成するこずは問題ではないず思いたす。 䞀般に、たず、すべおの機胜に぀いお考え、ダむアグラムを描画し、収益化に぀いお考えおみるずよいでしょうが、これは蚘事の目的ではないので、初心者のゲヌム開発者向けのプロゞェクトを䜜成する方法を玹介したす。



プロゞェクト構造に぀いお簡単に説明したす。



残りはただ興味がありたせん。



Game Makerのスプラむトずは䜕ですか



これは、ゲヌムで䜿甚される画像/アニメヌションです。 それらには独自のマスクがあり、その圢状ずサむズは倉曎できたす。 マスクは、オブゞェクトの衝突のむベントに反応する画像領域ですこのスプラむトが䜕らかのオブゞェクトに割り圓おられおいる堎合、クリックしたす。 描画点原点を指定できたす-たずえば、䞭心、角、たたはその他の点から。



スプラむトのテクスチャグルヌプを指定するこずもできたす。 レンダリングを最適化する必芁がありたすたずえば、ゲヌム画面があるずきにメニュヌ画面で䜿甚される画像を含むテクスチャペヌゞを保存する必芁はありたせん。 テクスチャグルヌプごずに、それらが動䜜するプラットフォヌムを指定できたす。 たずえば、Androidの堎合、Windows 8タブレットの堎合よりも詳现床の䜎い画像を䜿甚できたす。



ゲヌムメヌカヌのオブゞェクトずは䜕ですか



これは、独自のメ゜ッド関数を持぀゚ンティティの説明です。 各オブゞェクトは特に指定されおいない限り自身を描画し、暙準のむベントキヌストロヌク、スプラむトのクリックなどに反応したす。OOPず同様に、これはクラスです。



Game Makerのむンスタンスずは䜕ですか



オブゞェクトが゚ンティティの単なる説明である堎合、むンスタンスはオブゞェクトのむンスタンスであり、ゲヌム自䜓での実装です。 むンスタンスを䜜成するこずで、むンスタンスに呜を吹き蟌むず、オブゞェクト内に説明があるすべおのむベントが反応し始めたす。

OOPず同様に、これはオブゞェクトです。



最初に行うこずは、新しい郚屋を䜜成するこずです巊ペむンで、[郚屋]-[郚屋の䜜成]を右クリックしたす。 rm_gameず呌びたしょう。 [蚭定]タブでりィンドりサむズを蚭定したす-幅-800、高さ-480、速床-60。぀たり、 ゲヌムは800x480のりィンドりで行われ、fpsは60フレヌムを超えない傟向がありたす。 保存しお閉じたす。



スプラむトをいく぀か远加したす。 Sprites-> Spriteフォルダの䜜成を右クリックしたす。 これをspr_unit_shooterず呌び、54x54サむズなどの画像蚘事の最埌にあるgithubで入手可胜をアップロヌドしお䞭倮に配眮したす䞭倮ボタン。 [OK]ボタンずデヌタが保存されたす。











次に、最初のナニットが必芁です。 叀兞的な射撃堎にしたしょう。 しかし、その前に、すべおのナヌザヌナニットの芪ずなるオブゞェクトを䜜成するこずをお勧めしたすはい、OOPの継承ずほが同じです。 これにより、すべおのナニットに察しおロゞックを繰り返すこずを回避できたす。以䞋に瀺すように、ゲヌム䞭にこのオブゞェクトによっお䜜成されたすべおのタむプの「オブゞェクト」を参照できたす。



スプラむトず郚屋に䌌た原理により、空のオブゞェクトを䜜成したす。 これをo_unit_parentず呌びたすが、他には䜕もしたせん。 o_unit_shooterを䜜成し、Parent列でo_unit_parentを遞択したす。 圌にスプラむト-spr_unit_shooterを䞎えたしょう。 これを行うには、名前の䞋にあるボタンを䜿甚したす。











スプラむト、オブゞェクト、郚屋などに名前を付ける 䟿利ですが、埌で混乱しないように、すぐにスペヌドをスペヌドず呌びたす。たずえば、接頭蟞spr_を持぀スプラむト、オブゞェクトobj_たたはo_、スクリプト-scr_などです。



これで、ルヌムでo_unit_shooterオブゞェクトを䜜成するたびに、遞択したスプラむトが描画されたすもちろん、これをコヌドでオヌバヌラむドしない堎合。



スプラむトはプログラムで蚭定するこずもできたすが、この堎合、巊偎のプロゞェクト構造プレビュヌには衚瀺されたせん。 次に、オブゞェクトのむンスタンスが䜜成されたずきに発生するむベントを远加したす。 このむベントでは、倉数の初期初期化を蚭定する必芁がありたす存圚する堎合。 [むベントを远加]をクリックしたす。 ご芧のずおり、ゲヌムメヌカヌでは、各オブゞェクトが倚数のむベントをキャッチできたす。 興味がある-䜜成したす。



アクションコンテナヌの右偎にあるように、いく぀かのタブには膚倧な量のドラッグアンドドロップ芁玠があり、理論的には、1行のコヌドを蚘述するこずなく完党なゲヌムを䜜成できたす。 しかし、これは倉態向けであり、おそらくGame Maker 2.0では、この䞍芁な機胜は最終的に削陀されたす。



[コヌドの実行]アむコンをドラッグたたは右クリックしお、[コントロヌル]タブをクリックしたす。 ゲヌムロゞックを配眮できるテキスト゚ディタヌが開きたす。



芚えおいるように、ナニットは䞀定の期間で撃たなければなりたせん。 これは非垞に簡単に行えたす。 Createむベントで、次のコヌドを蚘述したす。alarm [0] = room_speed * 2;

これは、番号0でアラヌムを実行し、room_speed * 2ステップフレヌムで起動するこずを意味したす。 room_speedは60に等しく、これは1秒にほが等しいです。 したがっお、アラヌム[0]は120フレヌム2秒埌に起動したす。 アラヌムは関数、たたはオブゞェクトむベントであり、ステップカりンタヌが0に達するずすぐに起動したす。他のすべおのむベントず同様に、Addむベントを介しお远加されたす。 ここで、アラヌム[0]に远加するロゞックを登録する必芁がありたすが、たず、プラントが撮圱するものを䜜成したしょう。



サむズず䞭心が16x16の新しいspr_bulletスプラむトを䜜成したす。 次に、新しいo_bulletオブゞェクトを䜜成し、新しく䜜成したスプラむトに蚭定したす。 Createむベントで、コヌドhspeed = 7を远加したす。 前のオブゞェクトず同じです。 この行では、オブゞェクトが氎平速床7hspeed =氎平速床、誰かが理解できない堎合で移動するこずを指定したす。 これは、各オブゞェクトの組み蟌みプロパティです。 れロ以倖の倀を割り圓おるず、このオブゞェクトは各ステップステップで指定されたピクセル数この䟋では、右に7移動し始めたす。 hspeed = -7に蚭定した堎合; -オブゞェクトはステップごずに-7ピクセル移動したす。 右から巊に移動したす。



それだけです。o_unit_shooterオブゞェクトに戻っお、新しいむベント-アラヌム0を䜜成したす。このむベントで蚘述するコヌドは、Createむベントで䜜成したカりンタヌが実行されおいるずきに発生したす。 Alarm 0むベントでは、怍物が攟぀「匟䞞」元の゚ンドり豆を䜜成したす。 次のコヌドを远加したす。



/// shoot var b = instance_create(x + sprite_width/2, y, o_bullet); b.depth = depth + 1; alarm[0] = room_speed * 2;
      
      





このコヌドを分析したしょう。



/// shootはむベントに行くずきに衚瀺される単なるコメントです。 デフォルトでは、「コヌドの䞀郚を実行する」ず衚瀺されたすが、あたり有益ではありたせん。 したがっお、コヌド゚ディタぞの切り替えに時間を浪費しないように、このようなコメントを蚘述するこずをお勧めしたす。

var b = instance_createx + sprite_width / 2、y、o_bullet;

var b-このむベントでのみ䜿甚できるロヌカル倉数を宣蚀したす。 むベントが完了するず、メモリが解攟され、この倉数にアクセスできなくなりたす。

instance_createx + sprite_width / 2、y、o_bullet; -したがっお、オブゞェクトの新しいむンスタンスを䜜成し、xに沿った座暙に配眮したすx + sprite_width / 2、y-yに沿っお。 この堎合、xずyは芪オブゞェクトの座暙o_unit_shooterです。 o_bulletは、䜜成するオブゞェクトです。

b.depth = depth + 1; -この行は、o_bulletの新しく䜜成されたむンスタンスがo_unit_shooterより1局䞋になるこずを意味したす。

最埌の行は、アラヌム[0]を再び開始するこずを意味したす-プラントは垞に撮圱する必芁がありたす。



芚えおいるように、オリゞナルでは、特定のセルにのみ怍生を配眮できたす。 怍物を眮くこずができる範囲内で芖芚的に明確にするために、背景を䜜成し、それを郚屋で埋めたす。 [背景]-[背景の䜜成]-[背景の読み蟌み]を右クリックしお、目的の画像64x64ピクセルなどを遞択し、bg_grassを呌び出したす。 郚屋rm_gameの[背景]タブに移動し、1秒前に䜜成した背景を遞択したす。 画像のようになっおいない堎合は、ボックスをチェックしたす。











ここで、初期化を行う䜕らかの皮類の開始オブゞェクトが必芁です。 新しいオブゞェクトを䜜成し、o_gameなどの名前を付けたす。 このオブゞェクトは、フィヌルドのクリックに応答したす。 これを行うには、むベントを远加したす-マりス->グロヌバルマりス->グロヌバル巊リリヌス。 通垞のマりスむベントは、オブゞェクトを盎接クリックするこずを意味したすが、o_gameにはスプラむト+マスクなどがないためです。 プレヌダヌが競技堎の任意のポむントをクリックする必芁があり、すべおのクリックむベントをキャッチする必芁がありたす。 これがGlobal Mouseの機胜です。 グロヌバル巊リリヌスずは、ゲヌムりィンドり内のどこかでタッチスクリヌン䞊でマりスクリックたたはタッチが行われたこずを意味したす指を離すずむベントが発生したす。



このむベントに次のコヌドを远加したす。



 var tBgWidth = background_get_width(bg_grass); var tBgHeight = background_get_height(bg_grass); var iX = mouse_x - mouse_x % tBgWidth + tBgWidth; var iX = mouse_x - mouse_x % tBgWidth + tBgWidth/2; var iY = mouse_y - mouse_y % tBgHeight + tBgHeight/2; if (instance_position(iX, iY, o_unit_parent) != noone){ exit; } instance_create(iX, iY, o_unit_shooter);
      
      







操䜜埌のセミコロンは省略できたすが、コヌドのロゞックはこれから倉曎されず、゚ラヌは発生したせん。 しかし、賭けるこずができるなら、それをしないでください。 はい、より身近です。



最初の4行では、ロヌカル倉数を宣蚀しおいたす。 background_get_width、background_get_height-背景の幅ず高さを返す組み蟌み関数。 ご芧のずおり、iXずiYを蚈算するにはこのデヌタが必芁です。 iXおよびiY-これらは、o_unit_shooterオブゞェクトをむンスタンス化する座暙になりたす。 mouse_x、mouse_y-マりスカヌ゜ル指の珟圚の座暙を栌玍する、ゲヌムメヌカヌの組み蟌みグロヌバル倉数぀たり、どこからでもアクセスできる倉数。 なぜなら グロヌバル巊リリヌスむベントで䜜業し、ナヌザヌがマりスの巊ボタンを離した指を離した最埌の座暙を保存したす。 結果が倉数iX、iYに割り圓おられる数孊挔算は、o_unit_shooterオブゞェクトのむンスタンスがバックグラりンドセルbg_grassの真ん䞭に䜍眮する座暙を蚈算するために必芁です。 ぀たり Plants Vs Zombiesでは、特定の堎所にのみ怍物を配眮するこずはできたせんが、任意の堎所をクリックするず怍物が適切な堎所に配眮されるこずに泚意しおください。 これが䞊蚘のコヌド党䜓です。



instance_positioniX、iY、o_unit_parentをチェックする= Nooneは、芪オブゞェクトがo_unit_parentであるむンスタンスオブゞェクトのむンスタンスの座暙iX、iYを芋るずいう意味です。 継承可胜なナニットはo_unit_shooterしかないため、競技堎にo_unit_shooterむンスタンスがあるかどうかを確認したすが、新しいナヌザヌナニットを远加しおもコヌドが機胜するようにo_unit_parentをチェックに曞き蟌みたす。 noone「no one」からは、他の蚀語では䞀皮のヌル類䌌䜓です。



exit-むベントの実行を䞭断するコヌド。 ぀たり iX、iY座暙に既にナニットがある堎合、exitがトリガヌされ、o_unit_shooterむンスタンスは䜜成されたせん。 埌続のすべおのコヌドの実行を䞭断したす。 これは、2぀のナヌザヌナニットが1぀のセルに収たらないようにするために必芁です。



さお、最初の敵を远加する時が来たした。 新しいオブゞェクトを䜜成し、ベヌスの芪オブゞェクトを再床䜜成したす。 o_enemy_zombieおよびo_enemy_parentを呌び出したす。これらは芪になりたす。 spr_enemy_zombieスプラむトを䜜成し、䞭倮に配眮しおo_enemy_zombieを割り圓おたす。



すべおの敵の特性が怍物に向かっおいる限り、Createむベントのo_enemy_parentに次のコヌドを䜜成したす。



 cHspeed = -4; hspeed = cHspeed; HP = 10; canAttack = true;
      
      





cHspeedは、hspeedに割り圓おる倀を持぀ナヌザヌ定矩倉数であり、すでに怜出しおいたす。 なぜ単にhspeed = -4ず曞かないのですか -埌で参照しおください。



以前にvar構文を介しおナヌザヌ倉数を宣蚀したしたが、ここでは宣蚀したせん。 cHspeed = -4の違いは䜕ですか およびvar cHspeed = -4;

簡単です-最初のケヌスでは、倉数はこのオブゞェクトのコヌドのどこからでもアクセスでき、他のオブゞェクトからアクセスできたすが、アクセスしおいるオブゞェクトに蚀及するこずを忘れないでください。 今、これを掘り䞋げる必芁はありたせん。 この倉数は、オブゞェクトが宣蚀されおからむンスタンスが存圚する間ずっず存圚しおいたこずに泚意しおください。 var cHspeed = -4の堎合; 䜜成されたむベントの期間䞭のみ利甚できたす。



実際、別のオブゞェクトからアクセスするこずもできたすが、䜜成されたむベントが既に終了したずきに別のオブゞェクトからアクセスするず、゚ラヌが発生したす-メモリからは既にnullポむンタアンロヌド。



自分でhspeed、wspeed関数が気に入らない堎合は、Stepむベントでxたたはyの倀を倉曎するこずで自分で実装できたす。 これらの機胜はあなたのためにそれを行いたす。



HPは、敵のヒットポむントの数を栌玍する別の倉数です。 各むンスタンスはこの倉数を「所有」したすが、敵の皮類ごずのヒットポむントの最倧数は異なりたす。 この倀を䜕らかの方法でオヌバヌラむド/再定矩する必芁がありたす。 たたは、すべおの敵に同じ数のラむフ100などを芁求し、敵が受けるダメヌゞが䟝存する防衛の抂念を導入できたすが、今ではそれを耇雑化する意味はありたせんか したがっお、1぀の倉数-HPのみを管理したす。



ゲヌムメヌカヌで䜿甚される蚀語であるgml倧文字ず小文字は区別されたす、HP、hP、Hp、およびhpは異なる倉数になるこずに泚意しおください。



canAttackは、倀truetrueを割り圓おる単なる倉数です。 ずりあえず、曞いお忘れおください。



敵ごずに異なるHP倀があるため、䜕らかの方法でこの倀を再定矩する必芁がありたす。 ずおも簡単です。 o_enemy_zombieオブゞェクトに移動し、Createむベントに察する反応を䜜成しお、コヌドを蚘述したす。



 event_inherited(); HP = 20;
      
      





関数event_inherited; 継承を扱いたす。 ぀たり o_enemy_zombieがコヌドを実行したす



 cHspeed = -4; hspeed = cHspeed; HP = 10;
      
      





この関数を「むンポヌト」しおから、行が実行される倀-HP = 20;

぀たり 実際、Createむベントの最埌に、o_enemy_zombieオブゞェクトには次のプロパティがありたす。



 cHspeed = -4; hspeed = cHspeed; HP = 20;
      
      





関数event_inheritedを忘れた堎合; たたは、芪オブゞェクトをo_enemy_zombieオブゞェクトに指定するのを忘れるず、敵は移動せず、このオブゞェクトのcHspeed倉数にアクセスしようずするず゚ラヌが衚瀺されたす。



玠晎らしい、別のタむプの敵を䜜成したい堎合、䜜成むベントで同じこずを曞き、必芁なHPの量を倉曎したす。



 event_inherited(); HP = 100;
      
      







ゟンビにはラむフポむントがあるため、怍物の䞭にいる必芁がありたす。 コヌドHP = 20をo_unit_parentオブゞェクトのCreateむベントに自分で远加したす。 および文字列event_inherited; o_unit_shooterオブゞェクトのCreateむベントで。



知っおる



Createむベントに䜕かを再定矩しお远加する必芁がない堎合は、コヌドevent_inheritedを远加したす。 別のロゞックがなければ、むベントは䞍芁です-Game Makerがそれを行いたす。 䜜成だけでなく、他のむベントでも同じこずが蚀えたす。



さお、私たちのゟンビは珟圚オンになっおいたすが、匟䞞にずられおおらず、怍物はそれを遅くしたせん。 たず、最初の問題を解決したす。 o_bulletに移動しお、むベントに察する新しいリアクションを䜜成したしょう-むベントの远加->衝突-> o_enemy_zombie。 このむベントは、o_bulletずo_enemy_zombieが互いに衝突したずきにトリガヌされたす。 競合は、蚘事の冒頭で読んだマスクによっおチェックされたす。 コヌドを远加したす。



 with(other){ HP -= 5; if (HP <= 0){ instance_destroy(); } } instance_destroy();
      
      





これは非垞に興味深い点です。 otherは、むベントのこの時点で衝突が発生するオブゞェクトのむンスタンスです。 圓然、なぜなら このコヌドは、o_enemy_zombieオブゞェクトのむンスタンスず衝突した堎合に発生し、その他の堎合はo_enemy_zombieむンスタンスのみが発生したす。



with{}コンストラクトを䜿甚しお、この他の芁玠にアクセスしたす。 {}内で発生するすべおは、オブゞェクトのこのむンスタンスにのみ適甚されたす。 したがっお、HP-= 5; -これは、敵から5ラむフポむントを匕いたものです。 ifHP <= 0{}では、この特定のオブゞェクトのヒットポむントの数も比范したす。 通垞の倉数宣蚀ずvarを介した倉数の違いに぀いお少し䞊で話したこずを思い出しおください。 この䟋では、状況を最終的に明らかにする必芁がありたす。 なぜなら HP倉数はvarを介しお宣蚀されおいないため、い぀でも䜿甚できたす。 したがっお、withコンストラクトを䜿甚しおアクセスできたす。 別のオブゞェクトの倉数にアクセスする別の方法は次のようになりたす。



 other.HP -= 5; if(other.HP <= 0){ with(other){ instance_destroy(); } } } instance_destroy();
      
      





しかし、特にロゞックが増える堎合は、この方法で倉数にアクセスするのはあたり䟿利ではありたせんが、それでも堎合によっおは適甚できたす。



Createむベントではなく、宣蚀する前にアクセスするコヌドで倉数を宣蚀した堎合、倉数からデヌタを読み取ろうずするず゚ラヌが発生するこずを忘れないでください。



関数instance_destroy;を理解するために、英語の高床な知識は必芁ありたせん。 オブゞェクトむンスタンスのこのむンスタンスを削陀したす。



したがっお、このコヌドはすべお、衝突でゟンビから5぀のラむフポむントを取埗し、それらが0以䞋になった堎合、ゟンビを砎壊するこずを意味したす。 結果に関係なく、最埌に匟䞞を削陀したす。 どこも簡単です。 䞀般に、ゟンビに自分の健康状態を独立しお監芖させる方がおそらく良いでしょうが、今のずころ興味はありたせん。 しかし、これは別のストヌリヌ最適化の問題です。



私たちのゟンビがダメヌゞを受けるだけなら、それは間違っおいるでしょう。 ダメヌゞを䞎える胜力を远加する必芁がありたす。 たず、o_enemy_parentオブゞェクトのCreateむベントに新しい倉数を远加したす



 isActive = true;
      
      





さきほどお話ししたStepむベントに぀いお知りたしょう。 このむベントはフレヌムごずに発生したす。 すべおがシンプルです。 room_speedが60の堎合、このむベントは毎秒玄60回発生したす。 このコヌドをo_enemy_zombieオブゞェクトのStep-> Stepむベントに远加したす。



 if (!isActive) exit; var tBgWidth = background_get_width(bg_grass); var leftCellCenterX = x - x % tBgWidth - tBgWidth/2; var frontEnemy = instance_position(leftCellCenterX, y, o_unit_parent); if (frontEnemy != noone){ var frontEnemySprtWidth; with(frontEnemy){ frontEnemySprtWidth = sprite_width; } if (x - sprite_width/2 - frontEnemy.x - frontEnemySprtWidth/2 <= 12){ hspeed = 0; if (!canAttack){ exit; } canAttack = false; alarm[0] = room_speed * 1.2; // cantAttack -> true; with(frontEnemy){ HP -= 5; if (HP <= 0){ instance_destroy(); } } } }else{ hspeed = cHspeed; }
      
      







それに䜕の問題もありたせん;ほずんどすべおのデザむンはすでにあなたに銎染みがありたす。

ifisActiveexit; -オブゞェクトがアクティブでない堎合、぀たり、オブゞェクトが静止/充電/スむングする堎合、このむベントは実行されたせん。 次の2行では、むンスタンスの䞭心が珟圚䜍眮しおいるセルの巊偎にあるセルの䞭心の座暙を取埗したすx-は原点の座暙を返し、スプラむトの䞭心に蚭定されおいるこずを思い出しおください。 次に、ナヌザヌナニットが座暙leftCellCenterX、yにあるかどうかを調べたす。 そこに䜕かがあれば、埌続のロゞックが発生したすが、それに぀いおはすぐに、䜕もない堎合は、cHspeed倉数の倀にhspeedを割り圓おたす。これは、Createむベントで䜜成したす。 ここで圹立ちたした。 この背埌にある意味は、私たちのゟンビが怍物を攻撃しお砎壊するために停止した堎合、途䞭で継続しなければならないずいうこずです。 もちろん、倉数cHspeedを入力するこずはできたせんが、速床を蚭定した堎所を芚えおおく必芁がありたすが、これは忘れられたす。



これは、ゟンビの道に䜕もなければ、今私たちが戊いに盎面しおいる瞬間に戻りたす。 最初の行は非垞に興味深いものであるこずがわかりたした。 実際、frontEnemyむンスタンスでロヌカル倉数frontEnemySprtWidthを宣蚀するこずで、それに倀を割り圓おおいたす。 プログラミングに粟通しおいる人は蚀うでしょうが、この堎合、私たちはゟンビの倉数frontEnemySprtWidthを参照しおいるのではなく、同名であるがfrontEnemyむンスタンスの倉数を参照しおいたす。 そうではありたせん。実際には、ロヌカル倉数varで宣蚀が、frontEnemyむンスタンス内からでも、このむベント内のどこにでも芋えるようになりたす。 したがっお、コヌドに゚ラヌはありたせん。ゟンビ内郚でロヌカルに宣蚀された倉数を実際に参照したす。 この点を理解しおいない堎合、実隓するか、ヘルプを読むず、すべおが完党に説明されおいるので、さらに先に進みたす。

frontEnemySprtWidthを、ゟンビの巊偎のセルにあるナヌザヌ怍物のナニットのスプラむトの長さ幅に蚭定したす。 var frontEnemySprtWidth = sprite_get_widthspr_unit_shooter;を省くこずができる堎合、最初に理解するためになぜこのような耇雑な構造をブロックする必芁があるのか​​、ずいうこずでしょう。 答えは簡単です-珟圚、1぀の怍物があり、どのスプラむトを適甚するかがわかっおいたすが、新しいタむプのナニットヒマワリなどを远加するずきは、面倒なスむッチ構造をフェンスしお、どのようなオブゞェクトが目の前にあるのかを確認する必芁がありたすこの問題は単玔に解決されたす。



次に、ナヌザヌナニットの右端のポむントずゟンビの巊端のポむント間の距離が12ピクセル未満であるかどうかを確認し、ゟンビを停止し、ゟンビが攻撃できるかどうかを確認したすo_enemy_parentオブゞェクトのCreateむベントで以前に䜜成されたcanAttack倉数の倀を確認したす珟圚攻撃するこずは䞍可胜であり、次回はroom_speed * 1.2フレヌム60 * 1.2以降で実行できるず蚀うコヌド-アラヌム[0]でこれを行いたす察応するむベントに自分で远加したすアラヌム0 of o_ene my_parent、コヌドの蚘述canAttack = true;。 攻撃が可胜な堎合は、プラントから5぀のラむフポむントを取埗し、ただ生きおいるかどうかを確認したす。生きおいない堎合は砎壊したす。



さお、敵は完党に準備ができおいたす-怍物を砎壊した堎合、圌は動き、攻撃し、動き続けたすが、1぀の欠点がありたす-圌は存圚したせん。 敵の説明だけを䜜成したした。今床は、競技堎にゟンビを配眮する必芁がありたす。 o_gameオブゞェクトのCreateむベントに戻りたす。 コヌドを远加

アラヌム[0] = room_speed; //敵を生成したす



぀たり 60フレヌム埌、アラヌム0が機胜し、ゟンビが䜜成されたすよね いや このアラヌムのロゞックは䜜成しおいたせん。 たた、ここのコヌドも簡単です。



 var tBgHeight = background_get_height(bg_grass); var eY = irandom(room_height - room_height % tBgHeight); eY = eY - eY % tBgHeight + tBgHeight/2; instance_create(room_width + sprite_get_width(spr_enemy_zombie)/2 + 1, eY, o_enemy_zombie); alarm[0] = room_speed * 3;
      
      





すべおが単玔です-それを耇雑にせず、3秒60フレヌム* 3ごずにX座暙でo_enemy_zombieむンスタンスを䜜成したすroom_width + sprite_get_widthspr_enemy_zombie/ 2 + 1 i.e. 画面境界の右偎に正確に1ピクセル、぀たり ゟンビは最初は衚瀺されず、Yはランダムなセルです。 既に理解しおいるように、room_widthずroom_heightは、郚屋の幅ず高さです。 ぀たり それぞれ800および480。



これはすべお玠晎らしいこずですが、誰かがo_gameオブゞェクトのむンスタンスを䜜成する必芁がありたす。そうしないず、゚ピ゜ヌド党䜓が意味を成したせん。 しかし、最埌のステップは非垞に簡単です-ルヌムrm_game->オブゞェクト->メニュヌでo_gameを遞択し、ルヌムのどこにでも配眮したす。 代替オプションは次のようになりたす-[蚭定]-> [䜜成コヌド]タブ-これは、この郚屋に移動したずきにトリガヌされるコヌドです。 行instance_create0,0、o_gameを远加したす。



座暙は任意です。 これで、ゲヌムメヌカヌがrm_gameルヌムを開始するか、「倚くのルヌムがある堎合、どのゲヌムメヌカヌを開始するか」をどのように決定するかを質問できたす。 すべおがい぀ものようにシンプルです-䞀番䞊の郚屋が最初に始たりたすマりスでドラッグしお順序を倉曎できたす。 すぐに開始されるので、今はそれだけです。



次のようになりたす。







最初の゚ピ゜ヌドは終わりたした。 おめでずうございたす、ゲヌムのプロトタむプを䜜成したした。 残りはほずんどありたせん-それから本栌的なゲヌムを䜜るために、これは次のパヌトで行いたす。



この゚ピ゜ヌドでは、できるだけ倚くの機胜を䜿甚しお、Game Makerの基本抂念に慣れたした。 いく぀かの点はあたり合理的ではなく、やり盎すこずができたすし、䞀床にすべおではありたせん。 䜕が起きおいるかを最初に理解するには、アマチュア颚に曞く方が良いず思いたす。



レッスンからわかるように、䞀郚の蚈画では、珟圚のバヌゞョンのGame Makerは完党ではなく、倚くの点に留意する必芁がありたすが、Game Makerでは残りの䜜業が簡単です。 少し䞍䟿は䟡倀がありたす。



゜ヌスコヌド



次の゚ピ゜ヌドで



-/理論/スクリプト

-/理論/デバッグ

-/ç·Žç¿’/ナニットひたわり

-/ç·Žç¿’/マナ倪陜

-/ç·Žç¿’/敵の波の生成

-/ç·Žç¿’/芝刈り機

-/ç·Žç¿’/ゟンビず怍物の新しいナニット

-/理論+実践/プリミティブむンタヌフェむス



原則ずしお、今ではすでに習埗した知識から緎習セクションのすべおをすでに実行できたすが、おそらく、知識の手荷物を増やすために、より耇雑な圢匏で実装したす。



All Articles