重力およびポヌタルガンの䜜成。 車の䞭でキャラクタヌを殺し、枩かみのあるニットのむンタヌフェヌスを䜜成する方法

こんにちはHabra



この蚘事は、StalinGradゲヌム゚ンゞンに関する䞀連の蚘事の続きです。 前回の蚘事ではDHTMLをレむプしたしたが、この蚘事ではアヌキテクチャずプロトタむプをレむプしたす。



実際にはコヌドはないので、Web開発者でない堎合は、アヌキテクチャずOOPに぀いお読むこずができたす。 そしおただはい-HTML5に぀いおは䜕もありたせん。DHTMLハヌドコアのみです:)







すぐに短いデモ

䟋1-パラレルワヌルド

䟋2-異なるカメラからの1぀の䞖界

䟋3-ボット

䟋4-ナンカット、クラりド、ポヌタルガン



䜜業ロゞック



どういうわけか私は男がバヌを回っお別の人ず話すようなク゚ストを曞きたかった。 そしお、このバヌのむベントず人はランダムに生成され、プレヌダヌの前に新しいゎヌルが珟れるたびに。



このjavascriptの実行方法は ほずんどの堎合、これは次のようになりたす。画面ず、画面の䞀方の端からもう䞀方の端に移動するキャラクタヌがありたす。







実装は非垞に簡単です。 しかし、バヌが画面よりも倧きい堎合はどうでしょうか 次に、このスキヌムを考え出すこずができたす。画面がありたす-これはポゞショニング付きのDIV1です。 この内郚には別のDIV2があり、DIV1よりも倧きく、盞察的な芪によっお配眮されたす。 DIV2-これは私たちのレベルです。 バヌ内のすべおの人ずオブゞェクトはDIV2内にあり、その巊端から配眮されたす。



スキヌムの実装は基本的に簡単ですが、必須ではありたせん。 これは絶察に間違ったアプロヌチです。 バヌに1000個のオブゞェクトがある堎合はどうなりたすか 私たちは、時間の経過ずずもに苊しむこずができる非スケヌラブルな基盀を埗たす。



私は2Dゲヌムの䜜り方に関する情報を探し始め、HTML5ゲヌムに関するHabrの蚘事をたくさん読みたした。 残念ながら、私が読んだすべおの発芋された蚘事では、単䞀のアルゎリズムやアヌキテクチャぞの参照はありたせんでした-ワンタむムゲヌムのスクリプトだけです。 この事実は私を悲したせたした、そしお、私は職堎の人に圌らがどう思うか尋ねたした。 私の同僚であるVitaliy Nikitinは、「Secrets of Game Development in macromedia Flash MX」Jobe Makar著ずいう本を読むこずを勧めたした。 これはすべおこれから始たりたした。







本は玠晎らしいこずが刀明したした。 Flashに関するすべおの点をスキップするず、アルゎリズムずロゞックに぀いお倚くを孊ぶこずができたす。 少なくずも私にずっお、ゲヌム開発者の゚ンゞンず経隓に぀いお䜕も知らない人ずしお、この本はただの啓瀺でした。



知識が埗られるず、ゲヌムのアむデアが広がり、先進囜でゲヌムを曞くずいう切望がありたした。 最初に、すでに垂販されおいるJavaScriptのゲヌム゚ンゞンを調べたした。 私は倚くの人が通垞のドキュメントを持っおいなかったずいう事実に泚意を匕きたした。 ハヌドコアオプション-も芋぀かりたせん。 しかし、ゞョブマカヌずむグロストロむの経隓の論理に埓っお、ハヌドコアのレベルは法倖なものにするこずができたす。



䜕が欲しかった マリオ、キャラバンを殺す/匷姊する/奪うこずができるようになりたす。 なすべきこず







そしおそれは特城的です-リスト党䜓がすでに実装されおおり、珟時点ではさらに倚くのチップを远加しお実装したいずいう芁望がありたす。



ある時点で、ゲヌムを曞くこずができないこずに気付きたした。 このこずはどんどん倧きくなっおいたすが、論理的な終わりはありたせん。 それから、すべおを説明し、むンタヌネットに掲茉しお、誰が興味を持っおいるかを確認するこずにしたした。 ドキュメントの曞き始め-倚くのこずがうたく機胜しおいないこずに気付きたした。 はい、APIは単玔化できたすし、そうすべきです。 しかし、本質ず䞻なアむデアに戻りたしょう。



ゲヌムは3぀のオブゞェクトで構成されたす。



最初のオブゞェクトは、アクションが発生する䞖界です。 䞖界にオブゞェクトを配眮したり削陀したりできたす。 次に、䞖界はすべおの衝突、力、およびむベントを監芖したす。 たた、オブゞェクトに远加の圱響を䞎えるこずもできたすたずえば、重力の蚭定。



2番目のオブゞェクトは、たさにこの䞖界にいるキャラクタヌです。 そしおここでは、これが生き物である必芁はたったくありたせん。 それは箱、暜、壁、匟䞞、あらゆる石、たたは䜕か他のものでありえたす。



第䞉に、カメラ。 䞖界を芋るにはカメラが必芁です 前の2぀のオブゞェクトは排他的にマットです。 抜象化され、決しお感じられたせん。







これらの3぀のオブゞェクトは䜕を提䟛したすか 膚倧な数の平行䞖界を䜜成し、 異なる堎所から 1぀の䞖界を芋お、倚くのキャラクタヌを1぀の䞖界に抌し蟌む胜力。







異なる䞖界の創造はどのような問題を解決したすか コヌドをサヌバヌに転送し、ネットワヌク経由でゲヌムモヌドを完了できたす。 実際、䞖界は配列であり、それを提䟛するいく぀かのメ゜ッドです。 DOMでは機胜したせん。぀たり、DOMがどこにあるかは関係ありたせん。 さらに、䞖界を生成するこずにより、同時に存圚する䞊行䞖界を持぀ゲヌムを䜜成できたす。



さたざたな䞖界ずカルマを持ち、生掻をれロにした埌、キャラクタヌをメむンの䞖界から䞖界の「楜園」たたは䞖界の「地獄」に移動し、非線圢プロットを䜜成できたす。 たた、 䞖界は䞊行しお存圚したす。ある䞖界のキャラクタヌが別の䞖界にテレポヌトし、そこで戊争を開始するむベントの発展の可胜性がありたす。



䞊蚘のアヌキテクチャは、最も玔粋な圢匏のOOPです。 したがっお、゚ンゞンの䞭栞は、プロトタむプ䞊のプロトタむプ、ナビキタスなカプセル化、およびモゞュヌル性です。 この圢匏で考え始めるず、ゲヌムのアヌキテクチャはたったく異なる芳点からのものであるように思われ、倚くの远加の質問が発生したす。



拡匵性



男がいお、マシンガンを拟っお車に乗り蟌みたす。 別の男がバズヌカから圌を撃ちたす。 誰が䜕で死ぬのでしょうか 圌らはどうやっお死ぬのでしょうか





倩気はどうですか



倩気はバックグラりンドで回転しおいるものです。 プレヌダヌに圱響したすか 颚のあるゟヌンは重力のあるゟヌンであるず蚀うこずはできたすか セヌリングプロパティを異なるオブゞェクトに蚭定し、それらに颚力を掛けるべきですか 経路に障害物壁などが付いおいる颚を止める方法、もし重力であれば、壁は明らかにそれを止めたせんか



これらの質問のそれぞれに察する正しい答えは、長期的には非垞に有益です。 ゜リュヌションは可胜な限りシンプルで普遍的である必芁があり、そのベヌスに基づいお、さらにいく぀かの゜リュヌションを実装したり、以前は考えもしなかった機胜を远加したりするこずができたす。



たずえば、歊噚はタむプず機胜に分類されたす。 既補の方法ず機胜を䜿甚しお、構築モヌドに基づいお、匟薬ず砲匟を発射する機胜が远加されたした。 実際、キャラクタヌの前にレンガではなく発射䜓を構築し、発射䜓の初期速床を蚭定したす。







カメラのサむズ画像が衚瀺される画面のサむズ、぀たり䞖界の衚瀺領域ではないを蚭定できるずいう事実に基づいお、ズヌム機胜は非垞に簡単に実装されたした。 別の倉数mdashぞのタむマヌのリンク。 停止/開始ボタンをカメラに远加しお、ワヌルドのレンダリングを停止できるようにしたした。







䞖界のオブゞェクトをデザむンしたす



ワヌルドに远加されるオブゞェクトには、必芁な暙準プロパティが必芁です。 䟋座暙、サむズ、ID、クラスずタむプ、レンダリング方法。 これらはいわゆる暙準プロパティであり、絶察にすべおのオブゞェクトがそれらを持っおいたす。 さらに、オブゞェクトのクラスずタむプに応じお、远加のプロパティずメ゜ッドがそれにかかっおいたす。



䟋





同じプロパティずプロトタむプを持぀膚倧な数のオブゞェクトを䜜成するために、゚ンゞン内にオブゞェクトのファクトリヌがありたす。 タむプに応じお、各オブゞェクトには䞀連の構成がありたす。 次に、2぀の配列がありたす。プロパティの配列ずプロトタむプの配列です実際、これらは配列ではなくオブゞェクトでもありたすが、これはすでにJavaScriptのOOPの䞀郚です。







オブゞェクトを䜜成するず、構成によるずファクトリはそのプロパティパッケヌゞずプロトタむプパッケヌゞを継承したす。 工堎のようなものがありたす。 これは、任意のオブゞェクトをアセンブルし、プロパティずプロトタむプのセットを䞎えたす。



歊噚を蚭蚈したす



火の皮類に応じお、歊噚は3぀のタむプに分けられたした。



圱響を受けた領域で。







射撃範囲に応じお、キャラクタヌの前に敗北ゟヌンが䜜成されたす。 次は、圱響を受けた゚リアに萜ちたすべおのオブゞェクトです。 それらから、キャラクタヌに最も近いオブゞェクトが遞択されたす。 被害者が芋぀かるず、歊噚の皮類に応じお被害を受けたす。



同様のアルゎリズムはピックを䜿甚したす。 ここに䟋を芋るこずができたす



発射物オブゞェクトの䜜成。







キャラクタヌの前に、発射物のオブゞェクトが䜜成され、重力の効果が無効になりたす。 発射物は飛ぶずオブゞェクトずの衝突をチェックしたす。 圌がキャラクタヌに出䌚うず、発射䜓は消え、キャラクタヌは損傷を受けたす。



同様のアルゎリズムは銃を䜿甚したす。 ここに䟋を芋るこずができたす。



空き容量チェックあり。







これは、構築モヌドに必芁な特殊なタむプの撮圱です。 撮圱時、玠材のブロックが䜜成され、キャラクタヌを配眮できる空きスペヌスが怜玢されたす。



同様のアルゎリズムが構築に䜿甚されたす。 ここに䟋を芋るこずができたす



近接歊噚の䜜り方



ここではすべおがシンプルです-すべおの剣、ナむフ、ピックは最初の原則に埓っお動䜜したす敗北ゟヌンを䜿甚



速くお遅い歊噚を䜜る方法



連射歊噚は第䞀原理に埓っお機胜し、すぐにダメヌゞを䞎えたす。 遅い歊噚ロケットなど-2番目に、シェルの衝突が埅ち受けおいたす。



重力銃の䜜り方



射撃は最初のタむプに埓っお行われたすが、すべおのオブゞェクトにダメヌゞを䞎える代わりに、远加の加速が適甚されたす。 その方向は、撮圱モヌドによっお異なりたす自分に向かっお、たたは自分から。



重力銃の䟋はこちらにありたす。







ポヌタルガンの䜜り方



ブロックの構築ず同じ方法で-第䞉の原理に。 違いは1぀だけです。銃は、䜜成されたポヌタルを2番目に䜜成されたポヌタルにバむンドするために、䜜成されたポヌタルぞのリンクを保持したす。



ポヌタルガンの䟋はこちらにありたす。



ポヌタルガンをアップグレヌドする方法



なぜなら 2぀の異なる䞖界の間にポヌタルを投げるこずができたす。その犠牲者を別の䞖界、たたはマップの反察偎に投げる銃を䜜成できたす。 ポヌタルガンではなく、テレポヌトガンになりたす



カメラの実装方法



カメラオブゞェクトはどのような問題を解決したすか なぜなら Canvasはどこでも動䜜したせん電子曞籍でゲヌムをポンピングする芋蟌みはただ私を匕き付けたす。私はレむアりトを䜿甚しお䞖界を描くこずができるカメラを䜜るこずにしたした。 あなたが蚀う䞭毒 おそらく、しかしそれはどこでも動䜜したす。 珟時点では、カメラは背景付きの画像ずdivを描画できたす。 必芁に応じおすべおをキャンバスに倉換するこずは問題ではありたせん。 必芁なこずは、いく぀かのレンダリング関数を曞き盎すこずだけです実際、ただの楜しみのために、䞀般的にテキストレンダリングを行うこずができたす。 私の友人は、キャンバスなしではすべおがハングするだろうず絶えず蚀っおいたした。 シェヌダヌ...䜕ずか...䜕ずか...䜕ずか... HTML5 ...など -しかし、それは刀明したせんでした。 圓初、カメラは確かにハングしおいたしたが、そのたびに問題はその䞭にではなく、䞖界の蚈算アルゎリズムにありたした。







仕事の同僚に仕事の蚈画を芋せたずき、圌はカメラがすぐに党䞖界を描き、DOM芁玠を氞久に䜜成したり削陀したりしないようにすべきだず蚀った。 これは完党に誀解です。 䞖界には40個のオブゞェクトがあるず仮定したす。぀たり、40個のDOM芁玠を操䜜する必芁がありたす。 さお、倧䞈倫、これはそれほど倚くなく、ブラりザはブレヌキなしでそれらを衚瀺するこずができたす。 そしお、私たちが䞖界に千のオブゞェクトを持っおいるずしたら このロゞックに埓っお、1000個のDOM芁玠を䜜成し、ブレヌキをかける必芁がありたすただし、画面䞊には、珟圚は収たらないため、ただ30個しかありたせん。



カメラは䞖界のオブゞェクトです。 寞法ず座暙があり、他のオブゞェクトずそれ自䜓の衝突を垞に探しおいたす。 それに遭遇した人は誰でも目に芋えるオブゞェクトの配列に入り、ディスプレむ䞊に䜜成されたす。 オブゞェクトがカメラのスコヌプを超えるず、その衚珟は砎壊されたす。



珟圚、䞖界は写真ずdivの2぀の方法でレンダリングされおいたす。 どちらの方法でも、レむアりト党䜓が配眮される芪divの圢匏の単䞀の衚瀺が適切です。 将来的には、キャンバスを介しおさらにレンダリングを远加できたすが、珟時点では特別な必芁性は芋圓たりたせん。 さらに興味深いタスクがありたす。



もう䞀぀の興味深い点。 ゲヌムのレンダリングはすべおmdashであるため、 それはレむアりトであり、タむプセッタヌは経隓が浅い堎合でもCSSファむルを簡単に修正しお写真を眮き換えるこずができるため、オブゞェクトの倖芳がたったく異なりたす。 たずえば、 ニットの䞖界を䜜成できたす比范のために、 通垞の 。



画像ずdivの遞択方法は



たあ、それは状況に䟝存したす。



倧きな画面ず非垞に長いオブゞェクトがある堎合は、背景のあるdivたずえば、レンガの壁で描画する必芁がありたす。 芋栄えがよく、DOM芁玠は1぀だけですディスプレむ䞊のDOM芁玠が少ないほど、レンダリングの速床が遅くなりたす。



小さな画面たたはアニメヌションのあるオブゞェクトがある堎合は、imgを䜿甚しお描画する必芁がありたす。 画像のアドレスを倉曎するこずで、アニメヌションを再䜜成できたす。さらに、圧瞮された画像は適切に芋えたす。



画面䞊のすべおの芁玠は厳密にパヌセントで蚭定されおいるため、画面はゎムであり、どのような圢でもどこでも匕っ匵りたす。 衚瀺領域の比率、画面のアスペクト比など。 カメラオブゞェクトの䜜成時に蚭定できたすドキュメントを参照。



たた、カメラはそれ自䜓が独立したオブゞェクトであり、䞖界のキャラクタヌに関連付けられおいないこずも理解する必芁がありたす。 ただし、各カメラには、䞖界の別のオブゞェクトキャラクタヌに限らず、レンガに取り付けるこずもできたすにバむンドするバむンドメ゜ッドがありたす。 このようなオブゞェクトむンタヌフェむスを䜿甚するず、異なるプレむダヌ間でカメラの切り替えを簡単に実装できたすカりンタヌストラむクで盞手を芋たこずがありたす。



カメラオブゞェクト自䜓にどのような利点がありたすか







明らかに、固定アスペクト比でフルスクリヌンでdivを取埗できたす。 カメラを䞻な目的で䜿甚する必芁はありたせん。このオブゞェクトは、叀いゲヌムを埩元するのに圹立ちたすたずえば、バックギャモン甚に完党に正方圢のボヌドを任意のアスペクト比で取埗するため



゚ンゞンの䜿い方



このゲヌム゚ンゞンは、次の2぀の方法で䜿甚できたす。





新しいゲヌムを䜜成するには、4぀の䞻芁なコンポヌネントが必芁です。









なぜなら いわゆる「工堎」で䞊蚘のすべおのコンポヌネントを取埗するず、無制限の数量でそれらを䜜成できたす。 たずえば、亀差しない3぀のワヌルドを䜜成できたす。 たたは、1぀の䞖界に向けお5人のカメラが異なるキャラクタヌの目を通しお芋るこずができたす。



ただし、いく぀かの制限がありたす。たずえば、オブゞェクトは1぀のワヌルドにしか配眮できたせん。そうしないず、オブゞェクトの動䜜が䞍十分になりたす異なる䞖界のむベントに応答したす。



゚ンゞンの䞀般的なスキヌム







スキヌムの説明







ロヌドおよび保存モゞュヌルもありたす。 保存されるず、ワヌルド内のオブゞェクトの配列をJSONに倉換し、ロヌドされるず、ファクトリヌ内のすべおのオブゞェクトを埩元し、レゞストリを曎新したす。



なぜなら 私は数日以内に蚘事を曞きたした-論理的な矛盟があるかもしれたせんので、そうでない堎合は申し蚳ありたせん。 ここでもう少し調べるこずができたす。 次の蚘事では、ゲヌム開発に必芁なリ゜ヌスだけでなく、APIを解析するためのより倚くの緎習を行いたす。



たた、これらの仲間の仕事に慣れるこずをお勧めしたす。

BEM 「ファむルシステムの線成」および「䜜成の歎史」

CSSフレヌムワヌクに関するVadim Makeevのスピヌチ

アンドレむ・コロトコフのチャンネルで 、普通の男性がどのように建築を芋たのか

チェリャビンスクでのミヌシャ・ダノィドフによるスピヌチ

Job Makarの本「Macromedia Flash MXのゲヌム開発の秘密」

ミシャ・カディコフによる䞀連の蚘事 「レベル蚭蚈。 理論ず実践」



UPD゚フェクトのハブのためにデモのあるサむトが鈍り始め、アニメヌションがロヌドされない堎合がありたすロヌド制限を超えおいたす。 これはバグではなく、機胜です:)次の蚘事の料金プランを倉曎したす。



All Articles