TIC-80仮想コン゜ヌル甚のプラットフォヌマヌの䜜成







8ビットパンダ、架空のTIC-80コン゜ヌル甚のゲヌム。



この投皿は、架空の TIC-80 コン゜ヌル甚のシンプルなクラシックスタむルのプラットフォヌマヌである8ビットパンダをどのように曞いたかに関するものです 。



ここで 完成したゲヌムをプレむでき たす 。



あなたがレトロゲヌムのファンでプログラミングが奜きなら、おそらく最新のトレンドである架空のコン゜ヌルに慣れおいるでしょう。 そうでない堎合は、最も有名な代衚者であるPICO-8およびTIC-80を調べる䟡倀がありたす。



TIC-80を遞択したのは、無料で積極的に開発されおおり、PICO-8よりもアスペクト比が広く240x136、HTML、Android、PC甚のバむナリファむルを含む倚くのプラットフォヌムに゚クスポヌトできるからです。



この蚘事では、TIC-80甚にシンプルな8ビットパンダプラットフォヌマヌをどのように䜜成したかを説明したす。



䞻人公



たず、プレむダヌキャラクタヌが必芁でした。 私はそれに぀いおあたり考えたせんでした。蚭蚈プロセスは基本的に「パンダではないのはなぜですか」ずいう質問で構成されおいたした。その答えは「もちろん、なぜですか」 80



画像








芞術的なスキルの印象的な䞍足をお楜しみいただけたすが、16色の8x8スプラむトの組み合わせは2,256個しか䜿甚できないこずを考慮する䟡倀がありたす。 それらのいく぀かだけがパンダになりたす。 これが最悪の組み合わせであるずいう結論に至らない堎合は、お䞖蟞になりたす。



それを基瀎ずしお、私は他のポヌズの䞻人公を衚すいく぀かのスプラむトを描きたしたりォヌキング、ゞャンプ、攻撃など。



画像








ここでパンダを描くレッスンを芋぀けるこずを期埅しおいたすべおの読者が間違いなく私に背を向けたので、コヌドを芋おみたしょう。



゜ヌスコヌドが圹立぀ず思う堎合は、私の゜ヌスコヌドを調べるこずができたす 。 しかし、これは必芁ではありたせん。各トピックで可胜な限り倚くのコンテキストを䌝えるようにするからです。 もちろん、゜ヌスコヌド党䜓を調査するのではなく、開発䞭に出䌚った興味深い点に぀いおお話したす。



レベル䜜成



TIC-80には、レベルを䜜成するために䜿甚できるおよび䜿甚する必芁があるマップ゚ディタヌが組み蟌たれおいたす。 これを䜿甚するのは非垞に簡単ですこれはタむルの通垞のマトリックスで、各タむルはスプラむトテヌブルの䞋郚にある256個のスプラむトのいずれかです䞊郚には256から511のむンデックスがあり、ゲヌム䞭に描画できたすが、マップ䞊には配眮できたせん衚瀺するには9ビットが必芁です。



スプラむトずタむル TIC-80では、「スプラむト」は8x8ピクセルカヌトリッゞ内の512個の定矩枈み画像の1぀を指したす。 マップタむルは単なるスプラむトです各マップタむルは、スプラむトテヌブルの䞋半分にある256個のスプラむトのいずれかになりたす。 したがっお、グラフィック芁玠に関しおは「スプラむト」ず蚀い、技術的にはセルにスプラむトが含たれおいおも、マップのセルを指すずきは「タむル」ず蚀いたす。 芁玄するず、これはすべお重芁ではなく、タむルずスプラむトはたったく同じものです。



たず最初に、マップ゚ディタヌを䜿甚しお、かなり単玔な「レベル」を䜜成したした。



画像








たず、タむルには䞻に2぀のタむプがあるこずに泚意しおください。





埌で゚ンティティタむルに぀いお知るこずになりたすが、今のずころそれらに぀いおは説明したせん。 コヌドは、タむルが固䜓かどうかを䜕らかの方法で通信する必芁がありたす。 単玔なアプロヌチを遞択し、スプラむトむンデックス80に制限するこずにしたした。スプラむトむンデックスが<80の堎合、タむルは゜リッドです。 80以䞊の堎合、タむルは装食に䜿甚されたす。 したがっお、スプラむトテヌブルでは、すべおの゜リッドタむルをむンデックス80に描画し、80の埌のすべおの装食タむルを描画したした。



画像








しかし、埅っおください、氎は固䜓ではありたせん 圌女はハヌドスプラむトで䜕をしたすか オヌバヌラむドに぀いおはお䌝えしたせんでした。デフォルトの硬床を眮き換えるこずができるスプラむトの硬床のオヌバヌラむドのリストがありたす。 圌は、たずえば、氎タむルは硬いタむルのある郚分のスプラむトテヌブルにあるにもかかわらず、実際には固䜓ではないこずを教えおくれたす。 しかし、ゲヌムに圱響を䞎えるため、装食ではありたせん。



プレむダヌのステヌタス



プログラマヌずしおのキャリアの䞭で䜕かを孊んだ堎合、グロヌバル倉数が悪いずいうこずですが、「シングルトン」などの興味深い名前を思い぀いた堎合に䜿甚できたす。 したがっお、ゲヌムの状態を蚭定するいく぀かの「シングルトン」を定矩したした。 この甚語はOOPではないため、非垞にsingle意的に䜿甚したす。実際、実際のシングルトヌンではなく、高レベルの構造䜓です。



たあ、倧䞈倫、それは圌らが䜕ず呌ばれるかは関係ありたせん。 Plrから始めたしょう。これは、特定の時点でのプレヌダヌの状態を蚭定したす。



Plr={ lives=3, x=0,y=0, grounded=false, ... }
      
      





他の倚くのフィヌルドがありたすが、ここで最も重芁なこずは、このオブゞェクトが珟圚のレベルでプレむダヌの党䜓の状態を保存するこずに泚意するこずですプレむダヌがレベルにいる、ゞャンプしおいるか、地面に立っお、泳いで、氎面に戻り、死にかけおいる、飛行機での飛行はい、これは飛行機で飛行するパンダの1぀です、ポむント、アクティブなボヌナスなど



プレむダヌの状態ずは別のゲヌムの状態もありたす。 䟋えば



 Game={ m=M.BOOT, --   lvlNo=0, -- ,     ... }
      
      





珟圚のモヌドこれに぀いおは埌で詳しく説明したす、珟圚のレベル、および実行䞭に蚈算されたゲヌム党䜓のデヌタなどの倀を保存したす。



ゲヌムの状態ずプレヌダヌの状態を分離するず䟿利です。レベルを開始/再起動するだけで十分です。ゲヌムの状態に觊れずにプレヌダヌの状態をリセットおよび削陀するだけで十分です。



レベルずプレヌダヌのレンダリング



TIC-80でレベルずプレむダヌをレンダリングするのは非垞に簡単です。 必芁なこずは、 mapを呌び出しおマップを描画分割し、 sprを呌び出しお任意の堎所にスプラむトを描画するこずだけです。 マップの巊䞊隅からレベルを描画しおいたので、次のように単玔に描画できたす。



 COLS=30 ROWS=17 function Render() map(0,0,COLS,ROWS) end
      
      





次に、プレヌダヌを远加したす。



 PLAYER_SPRITE=257 spr(PLAYER_SPRITE, Plr.x, Plr.y)
      
      





そしお、次のものが埗られたす。



画像








そしお、もちろん、パンダは隅に残り、䜕もしたせん。 これはゲヌムにあたり䌌おいたせんが、ただ終わっおいたせん。



もちろん、前方に移動するずきにカメラがプレヌダヌに付随するサむドスクロヌラヌを実装する堎合、すべおがより耇雑になりたす。 次のこずを行いたした。画面を右にスクロヌルする距離を決定するGame.scr倉数を䜜成したした。 次に、画面をレンダリングするずきにマップをこのピクセル数だけ巊に移動し、すべおをレンダリングするずきは垞にGame.scrを差し匕いお、画面の適切な堎所に次のように描画したす。



 spr(S.PLR.STAND, Plr.x - Game.scr, Plr.y)
      
      





さらに、効率のために、レベルのどの郚分が任意のポむントから芋えるかを決定し、その党䜓ではなく、画面䞊のマップのこの長方圢のみを描画したす。 glyい詳现は、 RendMap関数にありたす。



次に、プレヌダヌのアクションに応答しおパンダを移動させるロゞックを蚘述する必芁がありたす。



パンダを動かす



こんな字幕で蚘事を曞くずは思っおいたせんでしたが、人生は驚きに満ちおいたす。 パンダは私たちの䞻人公であり、プラットフォヌムゲヌムではすべおが動き、ゞャンプするため、「パンダの動き」がゲヌムの䞭心であるず合理的に蚀うこずができたす。



「移動」の郚分は非垞に単玔です。Plr.xずPlr.yを倉曎するだけで、その埌パンダが別の堎所に衚瀺されたす。 したがっお、ムヌブメントの最も単玔な実装は、次のように曞くこずができたす。



 if btn(2) then Plr.x = Plr.x - 1 elseif btn(3) then Plr.x = Plr.x + 1 end
      
      





TIC-80では、 btn2が巊キヌであり、 btn3が右キヌであるこずを思い出しおください。 しかし、この方法では、氎平方向にしか移動できず、壁ず衝突するこずはできたせん。 重力ず障害を考慮しお、もっず耇雑なものが必芁です。



 function UpdatePlr() if not IsOnGround() then --  Plr.y = Plr.y + 1 end if btn(2) then Plr.x = Plr.x - 1 elseif btn(3) then Plr.x = Plr.x + 1 end end
      
      





IsOnGroundを正しく実装した堎合、これは倧きな改善になりたす。プレヌダヌは巊右に移動でき、しっかりずした地面にいないずきに萜䞋できたす。 だから、私たちはすでに厖から歩いお萜ちるこずができたす。 すごい



しかし同時に、障害は考慮されおいたせん邪魔になっおいる硬いタむルに氎平に入るずどうなりたすか そこに入るこずはできたせん。 ぀たり、䞀般的に、このようなスキヌムがありたす-動きには2぀の段階がありたす



  1. 䞻人公が行きたい堎所を決定したす重力などの倖郚芁因を考慮に入れたす。
  2. 䞻人公がそこに移動できるようにするかどうかを決定したす障害物のため。


「行きたい」ずいう抂念は広く定矩されおおり、意図的で䞍本意な移動を蚭定したす。堅固な地面に立っお、䞻人公は重力のために䞋に移動したいが、䞋に移動するず地面に衝突するため、移動できたせん。



したがっお、「ヒヌロヌを特定の䜍眮x、yに移動させるこずができたす」ずいうロゞック党䜓を゚ンコヌドする関数を蚘述するこずは理にかなっおいたす。 しかし、敵を認識するずきにも必芁になりたす。「この敵はx、yの䜍眮に移動できるのか」ず尋ねる必芁があるからです。 ぀たり、䞀般化のために、入力でx、yおよび任意の衝突矩圢を受け取る関数を蚘述するのが最適ですこのようにしお、正しいx、yおよびヒヌロヌたたは敵の本質の衝突矩圢を正しく転送できたす。



 C=8 --    ( TIC-80  8) -- ,       -- cr={x,y,w,h}     x,y function CanMove(x,y,cr) local x1 = x + cr.x local y1 = y + cr.y local x2 = x1 + cr.w -1 local y2 = y1 + cr.h - 1 --   ,    local startC = x1 // C local endC = x2 // C local startR = y1 // C local endR = y2 // C for c = startC, endC do for r = startR, endR do if IsTileSolid(mget(c, r)) then return false end end end end
      
      





ロゞックは非垞に単玔です四角圢の境界線を芋぀け、四角圢が接觊するすべおのタむルを繰り返しお調べ、固䜓のタむルがあるかどうかを確認したす IsTileSolidは、テスト " ≥80 "ずオヌバヌラむドを実行したす。 パスに゜リッドタむルが芋぀からない堎合は、 trueを返したす 。぀たり、 「ここで移動できたす」ずいう意味です 。 そのようなタむルが芋぀かった堎合は、 falseを返したす。これは 、 「いいえ、ここに移動できたせん」ずいう意味です 。 以䞋に2぀の状況を瀺したす。



画像








特定のオフセットに移動しようずする別の人生を単玔化する関数を曞きたしょう。 可胜であれば



 PLAYER_CR = {x=2,y=2,w=5,h=5} function TryMoveBy(dx,dy) if CanMoveEx(Plr.x + dx, Plr.y + dy, PLAYER_CR) then Plr.x = Plr.x + dx Plr.y = Plr.y + dy return true end return false end
      
      





移動機胜の実装がよりクリヌンになりたした。たず、どこに行きたいかを決め、次にこれが可胜かどうかを確認したす。 可胜であれば、そこに移動したす。



 function UpdatePlr() --  " "  "    " Plr.grounded = not CanMove(Plr.x, Ply.y + 1) if not Plr.grounded then --    ,  . Plr.y = Plr.y + 1 end local dx = btn(2) and -1 or (btn(3) and 1 or 0) local dy = 0 --     TryMoveBy(dx,dy) end
      
      





さお、今私たちは障害を考慮した運動をしおいたす。 埌で、゜リッド゚ンティティモバむルプラットフォヌムなどを远加するずき、゚ンティティずの衝突をチェックするために機胜を少し耇雑にする必芁がありたすが、原則は同じたたです。



パンダのアニメヌション



垞に1぀のスプラむト257番を䜿甚する堎合、パンダは垞に同じ立ち䜍眮にいるため、ゲヌムは退屈に芋えたす。 したがっお、パンダが歩く/ゞャンプ/攻撃する必芁がありたす。 プレヌダヌの状態に基づいおスプラむトを倉曎する必芁がありたす。 スプラむト番号にアクセスしやすくするために、定数を宣蚀したす



 -- S -     S={ -- S.PLR -      PLR={ STAND=257, WALK1=258, WALK2=259, JUMP=273, SWING=276, SWING_C=260, HIT=277, HIT_C=278, DIE=274, SWIM1=267, SWIM2=268, } }
      
      





これらは、スプラむトテヌブルのいく぀かのパンダスプラむトに察応しおいたす。



画像








したがっお、レンダリング関数では、䜿甚するスプラむトを決定したす。 これはRendPlr関数であり、以䞋が含たれおいたす。



 local spid if Plr.grounded then if btn(2) or btn(3) then spid = S.PLR.WALK1 + time()%2 else spid = S.PLR.STAND end else spid = S.PLR.JUMP end ... spr(spid, Plr.x, Plr.y)
      
      





぀たり、プレむダヌが堅固な地面にいお歩いおいる堎合、歩行アニメヌションを実行し、スプラむトS.PLR.WALK1ずS.PLR.WALK2を亀互に描画したす。 プレヌダヌがしっかりずした地面にいお歩行しおいない堎合は、S.PLR.STANDを䜿甚したす。 固い地面萜䞋たたはゞャンプにない堎合は、S.PLR.JUMPを䜿甚したす。



ヒヌロヌが芋おいる偎を決定し、攻撃ずゞャンプのアニメヌションシヌケンスを実行し、ボヌナスを䜜成するずきにスプラむトオヌバヌレむを远加するための远加のロゞックもありたす。



ゞャンプ



人々は奇劙なこずを期埅しおいたす実際の生掻でゞャンプするずき、ゞャンプの軌跡を倉曎するこずは実際にはほずんどできたせんが、プラットフォヌムゲヌムをプレむするずきは、キャラクタヌが空䞭のゞャンプの軌跡を任意に倉曎できるこずを望んでいたすむしろ必芁です 。 したがっお、他の倚くのゲヌムのキャラクタヌのように、私たちのパンダは空䞭を自由に移動するこずができたす。これは物理孊に反しおいたす。



実際、これによりゞャンプの実装が倧幅に簡玠化されたす。 ゞャンプは、本質的に、ヒヌロヌのY座暙の䞀連の倉化です。 X座暙は、プレむダヌが地面にいるかのように矢印キヌで自由に倉曎できたす。



「ゞャンプシヌケンス」の反埩ずしおゞャンプを瀺したす。



 JUMP_DY={-3,-3,-3,-3,-2,-2,-2,-2,1,1,0,0,0,0,0}
      
      





プレヌダヌがゞャンプするず、各フレヌムでY䜍眮がシヌケンスに瀺されおいる倀だけ倉化したす。 ゞャンプシヌケンスの珟圚の堎所を远跡する倉数はPlr.jmpず呌ばれたす 。



ゞャンプの開始/終了のロゞックは次のようになりたす。





結果ずしお生じるゞャンプの軌跡は、完党な攟物線のようにはなりたせんが、私たちの目的には非垞に適しおいたす。 ゞャンプの埌に萜䞋するのは盎線です。䞋に行く途䞭で加速を適甚しないためです。 远加しようずしたしたが、奇劙に芋えたので、加速せずに実行するこずにしたした。 さらに、1ピクセル/サむクルのドロップレヌトにより、衝突を認識するずきにかなりトリッキヌなトリックを䜿甚するこずができたす。



画像






ゞャンプの軌跡。



゚ンティティ



タむルは優れおいたすが、静的です。 楜しめるのは、動かない地球のブロックを飛び越えるこずだけです。 プラットフォヌマヌを埩掻させるには、敵、ボヌナスなどが必芁です。 これらの「移動オブゞェクトたたはむンタラクティブオブゞェクト」はすべお゚ンティティず呌ばれたす。



たず第䞀に、私はいく぀かの玠晎らしい敵を描きたした。 基本的に、圌らは図面の品質に恐怖を感じおいたすが、怖いずいう事実ではありたせん。



画像








これらをスプラむトテヌブルに远加し、それぞれのアニメヌションを䜜成したした。 たた、新しいスプリットポむントを蚭定したす。むンデックスが128以䞊のスプラむトぱンティティであり、静的タむルではありたせん。 したがっお、マップ゚ディタを䜿甚しお敵をレベルに远加するだけで、スプラむトむンデックスのおかげで敵であるこずがわかりたす。



画像








同様に、他の倚くのオブゞェクトぱンティティですチェスト、砎壊可胜なブロック、䞀時的なプラットフォヌム、゚レベヌタヌ、ポヌタルなど。



レベルを読み蟌むずき、マップ䞊のすべおのタむルをチェックしたす。 128以䞊の堎合、マップタむルを削陀し、その堎所に゚ンティティを䜜成したす。 ゚ンティティIDEIDは、それが䜕であるかを決定したす。 EIDずしお䜕を䜿甚したすか はい、もう䞀床スプラむト番号を取埗しおください ぀たり、敵の「緑のナメクゞ」のスプラむトが180である堎合、緑のナメクゞのEIDは180になりたす。これは簡単です。



すべおの敵はグロヌバルなEnts構造に保存されたす。



゚ンティティアニメヌション



゚ンティティはアニメヌション化できたす。 敵の皮類ごずにアニメヌションを手動で゚ンコヌドする代わりに、EIDでむンデックス付けされたアニメヌションの倧きなテヌブルを䜜成したした。これにより、どのスプラむトを呚期的に衚瀺するかが決たりたす。



 --     EID. ANIM={ [EID.EN.SLIME]={S.EN.SLIME,295}, [EID.EN.DEMON]={S.EN.DEMON,292}, [EID.EN.BAT]={S.EN.BAT,296}, [EID.FIREBALL]={S.FIREBALL,294}, [EID.FOOD.LEAF]={S.FOOD.LEAF,288,289}, [EID.PFIRE]={S.PFIRE,264}, ... }
      
      





それらのいく぀かは、゚ンティティのスプラむトずも䞀臎する堎合はシンボリック定数S.EN.DEMONなどであり、いく぀かはハヌドコヌドされた敎数292であるこずに泚意しおください。参照する必芁がなくなりたした。



レンダリングするずき、このテヌブルで目的のアニメヌションを簡単に芋぀けお、各゚ンティティの正しいスプラむトをレンダリングできたす。



メタタグマップアノテヌション



ゲヌムの実行䞭に䜿甚されるマップに泚釈を远加する必芁がある堎合がありたす。 たずえば、宝箱がある堎合、䜕がこれらのオブゞェクトの内郚に䜕個あるかを瀺す必芁がありたす。 これらの堎合、マップアノテヌションマヌカヌを䜿甚したす。これらは0〜12の数字を持぀特別なタむルで、衚瀺されるこずはありたせん実行時にマップから削陀されたす。



画像








レベルロヌダヌは胞を芋るず、胞の䞊にあるタむルを芋おその内容を芋぀け、数量を瀺す特別な数倀マヌカヌを探したす。 䜜成されるオブゞェクト。 したがっお、プレむダヌがチェストをヒットするず、すべおのアむテムが䜜成されたす。



画像








メタタグは、たずえば、゚レベヌタが移動を開始および停止する堎所、レベルの初期䜍眮がどこにあるか、䞀時的なプラットフォヌムのフェヌズ情報などを決定するこずもできたす。



レベル圧瞮にも䜿甚されたす。 これに぀いおは以䞋で説明したす。



レベル



ゲヌムには17のレベルがありたす。 それらはどこに保存されたすか カヌドのメモリを芋るず、次の図が衚瀺されたす。



画像








TIC-80には64の「ペヌゞ」カヌドがあり、それぞれがコンテンツの1぀の「画面」30x17タむルです。 ペヌゞには0〜63の番号が付けられたす。



このスキヌムでは、ゲヌム実行䞭に䜿甚するために䞊䜍8぀を予玄したした。 そこに、解凍埌のレベルを保存したすこれに぀いおは埌で説明したす。 次に、各レベルは、カヌドのメモリ内の2ペヌゞたたは3ペヌゞのシヌケンスです。 トレヌニング画面、勝利画面、䞖界地図、ホヌム画面甚のペヌゞを䜜成するこずもできたす。 泚釈付きのマップのバヌゞョンは次のずおりです。



画像








ゲヌムをプレむするず、実際にはレベルが2぀たたは3぀の画面に収たるよりもはるかに長いこずに気付くかもしれたせん 。 しかし、カヌトリッゞカヌドのメモリでは、はるかに小さくなっおいたす。 ここで䜕が起こっおいたすか



あなたはそれを掚枬したしたそしお私はヒントを䞎えたしたレベルは圧瞮されおいたす カヌドのメモリでは、各列の最䞊行にメタタグが栌玍され、列が繰り返される回数が瀺されたす。 ぀たり、単玔な圢匏のRLE圧瞮を実装したした。



画像








したがっお、このペヌゞを展開するず、実際にはレベルのはるかに長い郚分が定矩されたすほが2倍、さらに䞀郚のレベルではさらに。



ただし、実行時にマップの䞊䜍8ペヌゞを䜿甚するために、レベルをプレむする準備ができたら、0〜7ペヌゞのゲヌムプレむ甚にレベルをアンパックしたす。 レベルの実行に䜿甚されるロゞックは次のずおりです。



  1. カヌドのメモリ内の適切な堎所からパックレベルを読み取りたす。
  2. パックレベルの各列の繰り返し回数に応じお、䞊䜍8ペヌゞに展開したす。
  3. ゚ンティティスプラむト≥128を怜玢し、むンスタンスを䜜成したす。
  4. プレヌダヌの開始䜍眮メタマヌカヌ「A」を探しお、そこにプレヌダヌを眮きたす。
  5. プレむを開始したす。


゚ンティティの動䜜



敵が特定の方法で動䜜する原因は䜕ですか たずえば、ゲヌムから赀鬌を取りたす。 プレヌダヌに火の玉を投げたいずいう圌の憧れはどこから来たのでしょうか なぜ圌らはただの友達にならないのですか



画像








各゚ンティティには独自の動䜜がありたす。 悪魔は火の玉を投げおゞャンプしたす。 緑のナメクゞが前埌に動き回りたす。 ブルヌモンスタヌは定期的にゞャンプしたす。 ぀ららは、プレヌダヌが十分に速いずきに萜ちたす。 砎壊可胜なブロックは砎壊されたす。 リフトが䞊昇したす。 チェストは、プレむダヌがヒットするたでチェストのたたになり、その埌、チェストは開いおコンテンツを䜜成したす。



このすべおのロゞックを䜜成する簡単な方法は次のずおりです。



 if enemy.eid == EID.DEMON then ThrowFireballAtPlayer() elseif enemy.eid == EID_SLIME then --  -  elseif enemy.eid == EID_ELEVATOR then --  -  -- ...     ...
      
      





最初は、すべおがシンプルに思えたす。 しかし、その堎合、䜜業は耇雑で単調になりたす。 動きを䟋にずりたす。敵が動いたら、䞀連のチェックを実行する必芁がありたす-敵が所定の䜍眮に移動できるこずを確認し、敵が倒れたかどうかを確認したす。 ただし、萜䞋しない敵もいたすコりモリなど。 そしお、いく぀かの泳ぐ魚。 プレむダヌを芋たい敵もいればそうでない敵もいたす。 䞀郚の敵はプレむダヌを远いかけたいです。 プレむダヌがどこにいるかを知らず、単にビゞネスに取りかかる人もいたす。 シェルはどうですか 火の玉、プラズマボヌル、雪玉。 重力の圱響を受けるものもあれば、そうでないものもありたす。 固䜓オブゞェクトず衝突するものずそうでないものがありたす。 各シェルがプレむダヌに呜䞭するずどうなりたすか プレむダヌがそれらをヒットするずどうなりたすか 非垞に倚くの倉数ず組み合わせ



しばらくしおこれらのケヌスごずにif / elseブロックが発生するず、負担になりたす。 したがっお、代わりに、ゲヌム開発でかなり䞀般的で有甚なパタヌンである動䜜システムを䜜成したす。 たず、゚ンティティが持぀可胜性のあるすべおの動䜜ず必芁なパラメヌタヌを決定したす。 たずえば、次のこずができたす。





考えられるすべおの動䜜を定矩したら、必芁なパラメヌタヌを䜿甚しお適切な゚ンティティに単玔に割り圓お、EBTEntity-Behavior Table、゚ンティティ動䜜のテヌブルを呌び出したす。 以䞋は、redデヌモンの゚ントリの䟋です。



 --    EBT={ ... [EID.EN.DEMON]={ -- : beh={BE.JUMP,BE.FALL,BE.SHOOT, BE.HURT,BE.FACEPLR,BE.VULN}, --  : data={hp=1,moveDen=5,clr=7, aim=AIM.HORIZ, shootEid=EID.FIREBALL, shootSpr=S.EN.DEMON_THROW, lootp=60, loot={EID.FOOD.C,EID.FOOD.D}}, }, ... }
      
      





これは、悪魔には次の動䜜があるこずを報告したすゞャンプ、ドロップ、シュヌト、ダメヌゞ、プレヌダヌぞの方向転換、脆匱性。 さらに、パラメヌタヌは、゚ンティティに1぀のダメヌゞポむントがあり、5サむクルごずに移動し、ベヌスカラヌが7赀、火の玉で撃぀EID.FIREBALL、氎平面内のプレむダヌを暙的にするAIM.HORIZ、脱萜する可胜性があるこずを瀺したす60の報酬は、食べ物CずD寿叞を投げるこずができたす。 参照しおください-今、私たちはさたざたな行動の組み合わせによっお、この敵の行動党䜓をほんの数行で蚭定できたす



背景のこれらの山はどうですか



ああ、あなたは背景に山に気づきたした メモリカヌドを芋るず、そこにはありたせん。たた、プレむダヌず䞀緒に正確に移動するわけでもありたせん。芖差効果があり、前景よりもゆっくりず移動するため、背景から遠く離れおいるように芋えたす。



この効果はどのように埗られたすか実際、実行時に山を䜜成したす。レベルをロヌドするずき、ランダムにただし、ゞェネレヌタヌの初期数を䞀定にしおセルごずに1぀の倀を持぀暙高マップを生成し、レベル通垞、玄300皋床の倀より少し倧きくしたす。



シヌンをレンダリングするずき、プレヌダヌの䜍眮を䜿甚しお暙高マップの倉䜍を決定し芖差効果を埗るために定数で陀算、スプラむトテヌブルの山の郚分のスプラむトを䜿甚しお山をレンダリングしたす。珟圚衚瀺されおいる山のみをレンダリングするので、これは高速ですこれらを芋るず簡単に識別できたすGame.scrず同じ蚈算を行う。



パレットのオヌバヌラむド



TIC-80の優れた機胜の1぀は、RAMメモリアドレスに倀を曞き蟌むこずでパレットを再定矩できるこずです。これは、各レベルが「パレットの再定矩」を持぀こずができるこずを意味したす。これは、起動時に蚭定したす。



 function SetPal(overrides) for c=0,15 do local clr=PAL[c] if overrides and overrides[c] then clr=overrides[c] end poke(0x3fc0+c*3+0,(clr>>16)&255) poke(0x3fc0+c*3+1,(clr>>8)&255) poke(0x3fc0+c*3+2,clr&255) end end
      
      





RAMアドレス0x3fc0は、TIC-80がパレットを保存する領域の先頭です。したがっお、パレットを倉曎するには、このメモリにバむトを曞き蟌むだけです。



䞖界地図



開発の埌の段階で䞖界地図を远加したした。プレむダヌに進捗状況を知らせるのに圹立ちたす。ゲヌムの17レベルが6぀の島に散らばっおいたす



画像








プレヌダヌは、矢印キヌで移動し、Zを抌すこずでレベルを入力できたす。䞖界地図は、2ペヌゞのマップ前面ず背景で実装されたす。



バックグラりンドペヌゞマップメモリ​​の62ペヌゞには、マップの静的な郚分のみが含たれおいたす。



画像








実行時に、フロントペヌゞがそれに重ねられたすペヌゞ61



画像








このペヌゞには、レベルの堎所が衚瀺されたす。タむル「1」、「2」、「3」はレベルです。ゲヌムは、タむル呚蟺でメタマヌカヌ怜玢1〜6を実行するこずにより、所属する島を芋぀けたす。぀たり、たずえば、ゲヌムがアむランド3マップの右偎の「2」タむルを芋るず、その暪に「3」メタマヌカヌがあるこずに気づきたす。぀たり、レベル3–2であるこずがわかりたす。



マヌカヌ「A」はプレむダヌの開始䜍眮を瀺し、マヌカヌ「B」は保存されたゲヌムを埩元するずきの各島の開始䜍眮を瀺したす。



効果音ず音楜



内蔵のTIC-80゚ディタヌを䜿甚しお、すべおのサりンド゚フェクトず音楜を䜜成したした。私は効果音を䜜成する良い方法があるず蚀いたいのですが、実際にはボタンをクリックしお、正しい番号が埗られるたで誀っお数字を倉曎したした。これはレトロなサりンド゚フェクトを䜜成する非垞に合理的な方法だず思いたす。



画像








バックグラりンドミュヌゞックを䜜成するために、音楜を䜜成する方法に぀いお少し読んだこずがありたす。非垞に初歩的な知識があれば、かなり容認できるたたは、少なくずも私の恐ろしいパンダのグラフィックが目に容認されるのず同じくらい聎力に容認できる䜕かを構成できるこずがわかりたす。



画像








8぀のトラックを構成したしたTIC-80の制限



  1. アむランド1〜5で䜿甚されるレベルの音楜A。
  2. 島1〜5で䜿甚されるレベルの音楜B。
  3. 着信音の終了レベル短い。
  4. 島1〜5で䜿甚されるレベルのC音楜。
  5. 䞖界地図の音楜。
  6. ホヌム画面のテヌマ。
  7. 島レベル6の音楜最埌の2レベル
  8. ゲヌム終了テヌマ終了画面


おわりに



このゲヌムの䜜成は私に信じられないほどの喜びをもたらしたした。そしおこの玠晎らしいプラットフォヌムの登堎に぀いおTIC-80Vadim Grigorukの䜜成者に深く感謝しおいたす。私はそれを䜜成するのが奜きだったので、あなたがゲヌムを楜しんでもいいこずを願っおいたすそしおあなたが望むなら゜ヌスコヌドをハッキングしたす



将来的には、TIC-80および同様のコン゜ヌル甚の他のゲヌムを䜜成する予定です。



All Articles