これはメカニックそこでは、Alex Wiltshire が開発者を招待し、ゲームをブロックの上に置き、レンチを使ってその最高の機能をハッキングして、どのように機能するかを確認するのを手伝ってもらいます。
ワニ男を射る矢の罠彼があなたにテレフラグをする原因となる。ジャンプ中にブーメランに捕まり、スパイクトラップに向かってジャグリングされ、それが湧き出るまで、あなたはその前で呆然としたままになります。ショップストーム。
これらは必ずしも世界で最も崇高な出来事ではありません洞窟探検、しかし、それらは驚くべきもので、面白く、魅力的で、完全に一貫性があり、論理的で正しいものです。それらは正確にはあなたのせいではないかもしれませんが、実際にはゲームのせいでもありません。それらは大きな理由の結果です –の大きな理由? - なぜ洞窟探検すごいです:
メカニック:Spelunky のすべてのオブジェクトがどのように基本的な特徴を共有しているか
なかなかステキな名前ですね。それは、その世界に存在するさまざまなアイテム、罠、モンスター、その他のオブジェクト間のすべての相互作用、およびその結果として起こり得るすべての偶然、不幸、面白く、激怒し、そして不思議な出来事の根源です。
そして、それは主に簡素化のために存在します。 「ある時点で、『Spelunky』で起こるすべての事件、たとえばこのアイテムがそれに遭遇したとき、どうやって対処できるのかと聞かれたと思います」と、2013 年の Spelunky リメイク版のプログラマー、アンディ・ハルは私に語ります。答えは、世界のすべてのオブジェクトにはデフォルトの動作とプロパティがあるということです。たとえば、オルメカは実際には美化されたプッシュブロックです。地獄のトゲ玉は飛ばされると岩になります。タカ男、ワニ男、店主が激怒すると飛び跳ねる様子は、まったく同じ運動能力を共有しています。
「ゲームをコーディングするとき、物事が自然に共有する特徴について考えるでしょう?」オリジナルの Spelunky の作成者であるデレク・ユー氏は言います。 「コードを効率的にしたいのですが、新しいことをするたびに車輪の再発明はしたくないのです。」
したがって、Spelunky の豊かさはすべて、プログラマーのショートカットとコードの構造化の方法にかかっています。そして、そのオブジェクトはすべてアイテムかモンスターのいずれかです。主な違いは、モンスターが移動のために追加の変数を自動的に継承することです。 「それらはかなり似ています」とハル氏は言う。 「おかげでコードが整理され、ショットガンを撃ちながらプッシュブロックが走り回るような奇妙な事態は発生しませんでした。」
つまり、ゲームの中核(のような)ボスであるオルメカは、モンスターではなくアイテムです。彼はプッシュブロックですが、独立して移動できること、プレイヤーが押すことができないこと、頭に他のプッシュブロックを積み重ねることができること、それらを押しつぶすことができることなど、彼を際立たせる特殊な特性を持っています。ジャンプして天井が近すぎるとブロックしてくれるので、動けなくなることはありません。コードがどのようなものかを確認したい場合は、Yu と Hull は、Spelunky のリメイク版のソース コードの一部へのアクセスを提供してくれました。これにより、オルメックと店主がなぜ興奮するのかについての洞察が得られます。
ゲームに関する限り、プロパティのリストをたどって特定の状況を解決する方法を見つけ出すだけです。これは重い物体ですか?軽い物体?壊れやすい物体?ダメージを受けることはありますか?壊れやすいものが壁にぶつかると、その物は壊れます。プレイヤーが幽霊を鞭で打った場合は、そうですね。
「幽霊について言及するのは良いことかもしれません。なぜなら、これはデフォルトが非常に興味深い状況を引き起こしたケースだからです」と Yu 氏は言います。幽霊は無敵であるはずだった。ユウの知る限り、2008 年のオリジナル版では無敵だった。しかし、人々はリメイク版でゴーストを殺す方法を見つけ出し、その方法はこれらの共通の特性に基づいています。
このゴーストは、レベルに 2 分半以上滞在している場合、クリスタル スカルを取得した場合、またはカーリーの祭壇をあまりにも多く破壊した場合に表示されます。これは、いくつかの特殊な特性を持つモンスターです。物体は衝突せず、ダメージも与えず、ヒット ポイントは 9999 です。 「おそらくフェイルセーフとしてそれを入れたと思います、そうですよね、アンディ?」ユウは言います。
「そうです、そうです、私がそれを実装していたとき、ヒットポイントを埋める必要がありました」とハルは答えた。しかし、彼はそれにダメージを与える可能性のある「何か」があるかもしれないことにも気づいていたので、ヒットポイントを 1 つも与えませんでした。 9999が正しいようです。
「それは決して私たちが真剣に考えたものではありません」と Yu 氏は言います。 「しかし、もちろん、十分に安全策を講じることはできないと思います。」
幽霊は溶岩によってダメージを受ける可能性があることが判明しました。溶岩に触れるとモンスターは 99 ヒット ポイントを失い、即死します。ある日、プレイヤーはゴーストが溶岩にぶつかり、モンスターであることから受け継いだヒットエフェクトを表示していることに気づき、ダメージを受けていることに気づきました。そして、すぐに、幽霊を溶岩に出入りさせることを 101 回行うことで殺せることが発見されました。
ユウもハルも幸せだった。 「それはゲームの素晴らしい特性です!」ユウは言います。 「それは私たちにはあまり気にならない。なぜなら、この殺せないはずのものが殺せるようになるという伝説の一部だからだ。誰かがそれを殺す方法を考え出したというのは、とても気の利いたものだった。」
もう 1 つの例は、ゲームのシティ オブ ゴールド ルートの一部である氷の洞窟で見つかるモアイ像です。プレイヤーはアンク アイテムを手に入れて自殺し、新しいアイテムであるヘジェットを手にモアイのところで復活し、モアイの口の中でドアが開いていることに気づくことになっています。モアイ自体は破壊できないように設計されており、ボールとチェーンがなければ破壊されなかったはずです。
「おかしいですよね、罰のつもりですから!」ユウは言います。カーリーの祭壇をあまりにも多く破壊すると、ボールと鎖があなたにくっついてしまい、移動が難しくなります。ボールを後ろに引きずるか、ボールを拾わなければなりません。つまり、他のものを運ぶことができません。しかし、ボールが棚の上に置かれていて、その下にぶら下がっている場合、ボールはブロックを突き破ることもできます。これは、プレーヤーが立ち往生するのを防ぐことを目的とした機能です。
モアイは実際には目に見えない無敵の床ブロックで覆われた像です。そしてプレイヤーが発見したのは、つまり、BaerTaffyとbisnapです、ボールは他のものと同じようにそれらを破壊する可能性があるということです。 「床は無敵に設定されていますが、ボールとチェーンはそれをまったくチェックしません」とユウ氏は言います。 「誰もそれをモアイに使おうとは考えもしませんでした。」
「無敵フラグをチェックしない理由は、ゲーム内で無敵である他のブロックはレベルの周りのフレーム ブロックだけだからです」とハル氏は言います。 「ボールをコーディングしていたとき、その下に選手がいる状態でボールをフレームの上に乗せる方法がないことはわかっていた。だからチェックする意味がなかった。それは見落としだった。無敵のブロックがどこか他にあったのだ!」それは私たちが予見したことではありませんでした。考慮すべき相互作用が非常に多いため、何かが亀裂をすり抜けてしまうのはほぼ確実です。」それでも、繰り返しますが、それはゲームの伝承の一部となり、まったく素晴らしいソロナスランそこで、ユウとハルがやったことは、ボールが与えるダメージを示すためにモアイのグラフィックを変更することだけでした。
しかし、ほとんどの場合、この再利用システムはグリッチやバグとは逆のものであり、興味深いインタラクションを可能にするものであり、開発とテストも容易になります。 「私たちが必要としていたのは、私たちが考えてもいなかった、すでに許容可能な形で機能していないものを見つけることだけでした」と Yu 氏は言います。
「インタラクションを処理するための専用システムをハンドコーディングした方がよいという人もいますが、問題は、インタラクションをゲームの他の仕組みから分離していることです」とハル氏は言います。 「それがすでにルールと相互作用している場合、たとえそれがわずかに良くないとしても、ゲームの残りの部分でより多くの遊びができるでしょう。それはすぐに面白くなり、それはあなたができる追加の洗練よりもはるかに価値があります別の実装で取得してください。」
つまり、地獄には回転するスパイク付きのボールがあり、切り離すと飛び散り、岩のようにレベルを突き破ります。それが機能的にそうなるからです。各アイテムは識別番号によって単純に定義されているため、ハルはスパイク ボールに、それが現在は岩であることを伝えることができます。視覚的なプロパティは維持されますが、突然、岩としてゲームの残りの部分と相互作用し始めます。フリーズ レイも同様です。同じ発射体 (ゲームではアイテムです) が銃とマンモスの胴体の両方から発射されます。完全にゲーム エンジンで実行されるカットシーンでも機能します。イントロでは、キャラクターは砂のグラフィックが前面にある目に見えないブロックの上に配置され、ゲームは右側でコントローラー入力をシミュレートします。
「実際、ゲームの終わりに、火山から撃たれて地面に落ち、落ちすぎて持っていたアイテムを落とすという興味深いインタラクションが得られます。しかし、パラシュートがあれば、実際に展開して地面に浮きます。」ユウは笑います – それは最高の笑いです、伝染するクレイジーな笑いです。
「そして、その方法で残りのカットシーンでもアイテムを保持し続けることができます。これは非常に素晴らしいことですよね?」ハルは続ける。 「これは私たちが計画していたものではありませんでしたが、ちょっとした良い工夫です。最終的には制御さえできなくなっても、ゲームはまだ機能しています。これにより、ゲーム全体の仕組みが強化されます。」
「あのエンディングのカットシーンに着地すると、落下ダメージを受けるため、実際に死ぬ可能性があるというバグがあったと確信しています」と Yu 氏は言います。
「修正はかなり不十分でした」とハル氏は言う。 「シーンの開始時に追加のライフが得られるだけで、地面に落ちるとライフが失われます。」ユウはまた笑う。
「それから血も!」ハルは言います。 「私がミイラの嘔吐物を作ったとき、その嘔吐物自体は実際にはただの緑色の血でした。私たちはそれを開発の後半で入れていましたが、私が必要としていることをすでに果たしているものは何だろうと思いました。まあ、血液、嘔吐物です」 、同じ違いです。それは押しつぶしたり跳ねたりする液体なので、血液が緑色になって嘔吐する新しいグラフィックを作成しました。もちろん、開発の後半で、血液を集めるカパラを追加しました。ゲームがリリースされるまで、私たちはこのインタラクションが存在することさえ知りませんでした。人々はミイラの嘔吐物を集めていましたが、それは当然のことながら、伝説の一部になったのです。 」
「人々は基本的にミイラを養殖し、嘔吐物が落ちる可能性のある穴のある棚の上にミイラを固定させたので、彼らは体力が99になるまで延々とプレイヤーに吐き続けました!」ユウは言います。
これが Spelunky が優れている理由ですが、明確にしておきたいのは、この方法でコーディングされたゲームは Spelunky だけではありません。ドワーフ要塞はさらにレベルアップします、そしてそれはまた、からのゲームの基礎となっていますスカイリムしかし、Spelunky の仕組みには特別な何かがあります。おそらくアクションゲームであり、原因と結果が明確で非常に読みやすいからでしょう。その理由の 1 つは、そのオブジェクトがそのプロパティでそのように定義されているためです。予期せぬことが起こると、ユウも含めてみんながそれに気づきます。 「デザイナー自身さえも驚くようなものは、デザインされたものよりも世界をより現実的に感じさせるものだと思います。」
Derek Yu は、Spelunky をどのように作ったかについての本を書き、3 月 29 日に発売されます。今すぐ予約注文したほうがいいですよ。
Spelunky がそのオブジェクトのプロパティをどのように理解しているかを示すために、Derek Yu と Andy Hull は、これまで明らかにされていなかったリメイクのソース コードの一部へのアクセスを RPS に許可しました。オルメックと店主の特徴をご紹介します。
店主
「タフ」フラグは、店主が鞭攻撃を受けないことを示します。また、彼がショットガンを持っているという事実を支配するものと、彼を拾うことができない理由もわかります。
case ENT_TYPE_MONS_SHOPKEEPER:
em = create_entity_monster(x, y, type, TEX_MONSTERS, ANIMSET_SHOPKEEPER, MONS_SIZE_SMALL, 0.2f, 0.5f, 0.4f, 10, 1, MONS_WEIGHT_MED, 6);
em->canBeStunned = true;
em->tough = true;
em->isHoldable = false;if (wantedLevel > 0)
{em->state = ENT_STATE_PATROL;
em->heldEntity = (EntityItem *)create_entity(x, y, ENT_TYPE_ITEM_SHOTGUN, true);
em->heldEntity->holder = em;
// em->heldEntity->heldOffset = Vector2(0.25f, -0.35f);
em->hasGun = false;}
それ以外
{em->状態 = ENT_STATE_IDLE;
em->hasGun = true;
em->パッシブ = true;}
e = (エンティティ *)em;
壊す;
オルメカ
あなたは、彼をウェブで捕まえたり、抱きしめたり、押しつぶしたりすることができないことをゲームに伝えるフラグを見ることができます。彼のプロパティの残りの部分は、プッシュブロックとしての彼の本当の性質によって定義されます。
case ENT_TYPE_ITEM_OLMEC:
ei = 新しい EntityItem(x, y, 1.0f, 1.0f);
ei->サブタイプ = タイプ;
ei->テクスチャ = textureManager->get_texture(TEX_OLMEC);
no->set_tile(0);
ei->高さ = 4.00f;
ei->幅 = 4.00f;
ei->collisionDown = 4.0f/2.0f;
いいえ->衝突アップ = 3.0f/2.0f;
no->collisionSide = 3.5f/2.0f;
no->solid = true;
ei->唖然とした = true;
ei->canExplode = true;
ei->isHoldable = false;
いいえ->重い = 0.0f;
ei->collideWithActive = true;
ei->無敵 = true;
ei->canExplode = false;
ei->深さ = DEPTH_CLIMBABLE – 0.5f;
卵 -> 砕ける = false;
ei->isReflective = true;
ei->状態 = ENT_STATE_RECOVER;
no->canBeWebbed = false;
//ei->collideWithFloor = false;
//ei->フライング = true;
e = (エンティティ *)ei;
levelManager->add_active_floor(ei);
壊す;