個別のチュートリアルモードを設計する方法は?


7

私は、約90%完了した「ソーシャル」ゲームに取り組んでいます。残りの機能の1つはチュートリアルモードです。

基本的に、チュートリアルモードは、ユーザーがUIの一部にアクセスすることを制限し、機能(ストアアイテムなど)を制限します。チュートリアルは、特定のイベントがトリガーされた場合にのみ、特にチュートリアルに従って進行します。

コードは準備ができており、「ほぼ」動作するゲームがすでにあります。問題は、90%を実行している間、チュートリアルモードを予測していなかったことです。私の要件は、チュートリアルモードから通常モードへの読み込み/移行がないことです。これは、チュートリアルから進行状況を取得する必要があることを意味します(アセットやものの再レンダリングは不要)。

古いコードから何も変更しない方法でこれを設計するにはどうすればよいですか?プラグインするだけで簡単になりたいと思っています。古いコードにチュートリアルを詰め込みたくないので、多くのバグが発生します。


スクリプティングのサポートがある場合や、それらのスクリプトがGUIを変更できるかどうかなど、より詳細な情報を提供する必要があります...クラスの図を投入するとよいでしょう。PS:すべてを「予測」することはできないため、コードは常にリファクタリング可能である必要があります。
デン

2
ゲームのGUI要素を有効または無効にする場合は、サポートを追加する必要があります。それを実装する方法を知っているのはあなただけです(またはチームの他の人)。
最大

どの言語を使用していますか?
ジョンマクドナルド

目的C.私はiOS用に開発しています。それが最もクリーンな方法のようです。仕事を辞めたので、今は図を投稿できません。行き詰まったら投稿します。それはすでにベルを鳴らしたように見えます。
Sylpheed

回答:


3

いくつかの詳細情報は、より良い答えを得るために役立ちます。あなたが持っているゲームの種類やレベル構造がどのように見えるかについてよく知らなければ、私は暗闇の中で刺すことしかできません。

つまり、現在のプロジェクトで同じようなことをしている場合は、問題の主題をユーザーに案内する特別なレベルを作成します。たとえば、チュートリアルで使用できるようにしたいアイテムのみを使用してNPCを作成できます。

特定のUI要素へのアクセスを防ぐ限り、チュートリアルで必要な要素を追加または削除できない場合は、要素が存在するかどうかを判断するために、既存のコードにフィルターを組み込む必要がある場合があります。かどうか(「アクセス制限」を考えてください)。


それはシムズシティのようなものだとしましょう。ゲームについてはあまり詳しくありませんが、ユーザーにゲームのプレイ方法を案内するチュートリアルがあると思います。もちろん、チュートリアル中は一部のUI要素を無効にして制限を設定する必要があります。それで、最善の方法は、UIにインターフェースを提供することですか?したがって、必要に応じてそれらを無効または有効にすることができます。
Sylpheed

チュートリアルでUI要素を追加または削除できるようにするか、「アクセス制限」を条件とするようにUIを構築する必要があります。たとえば、チュートリアルで使用したくない「ゲームを保存」ボタンがある場合は、次のようなステートメントでラップすることができます(canSaveGame()){panel.add(saveButton); }ここcanSaveGame()は、アクセス制限システムの一部です。
notlesh

それらを削除する必要はありません。それらを無効にする必要があるだけです。インターフェイスを介してコードを無効化/有効化できるように、コードをリファクタリングしてみます。各チュートリアルイベントをどのように扱いますか?イベントごとに個別のオブジェクトを作成することをお勧めしますか?チュートリアルクラスが膨らんでいるようです。
Sylpheed

チュートリアルイベントの意味がわからない。なぜ特別な扱いが必要なのですか?
notlesh

チュートリアルが異なるフェーズ(イベント)に分割されているとしましょう。ユーザーは、指示に従った場合にのみ次のフェーズに進むことができます。各「チュートリアルイベント」は、何か面白いことが起こるのを待ちます。トリガーされると、現在の「チュートリアルフェーズ」に基づいて異なるイベントをリッスンする新しいチュートリアルイベントがインスタンス化されます。私の懸念は、チュートリアルに約20ステップがあることです。各ステップを異なるオブジェクトに分割する予定です。
Sylpheed

2

現在、C#ゲームのチュートリアルに取り組んでいます。イベントを使用して、チュートリアルをゲームから切り離しています。私のゲームには、エンティティの移動、破壊​​、構築、アップグレードの完了など、ゲームの状態がさまざまな方法で変化したときにトリガーされる一連のイベントがあります。私のチュートリアルは、興味のあるイベントをリッスンし、 HUDを操作します。それで十分です。それを完全に明確にするために、ゲームはチュートリアルが起こっていることを知りません。

これも重要な場合があります。私のチュートリアルは、ゲームが常にシナリオを実行するシナリオのサブクラスです。私はC#を使用しているので、あらゆるシナリオを実行してC#スクリプトファイルにトスすることができましたが、今のところ、すべてのシナリオはゲームに直接コンパイルされています。

このクラスは現在作業中ですが、少し古いバージョンがあります。http//asteroidoutpost.svn.sourceforge.net/viewvc/asteroidoutpost/trunk/Scenarios/TutorialScenario.cs? view = markup


0

私はフラッシュゲームのチュートリアルにも取り組んでおり、このように設定しています。ゲームの各部分は、Tutorialオブジェクトをチェックして、プレーヤーが実行できるアクションが利用可能かどうかを確認します。チュートリアルモジュールが存在しないか非アクティブである場合、プレーヤーは何でもできると想定できます。

たとえば、Sim Cityゲームを使用して、チュートリアルが開始したときに、適切な時間までプレイヤーが何もできないようにするとします。チュートリアルオブジェクトにPLAYER_CAN_USE_TOOLBAR、PLAYER_CAN_SWITCH_VIEWS、PLAYER_CAN_DESIGNATE_ZONEなどのフラグをすべてFALSEに設定することができます。プレーヤーがチュートリアルを進めると、これらのフラグをtrueに設定し始めることができます。

UI部分で、チュートリアルフラグが設定されていない場合に実際にアクションを実行するモデルまたはコントローラーへの信号をブロックします。

// If our tutorial module/tracker exists, but the action flag is set to false
// then leave our method early
if (mTutorial.isActive() && !mTutorial.checkFlag(PLAYER_CAN_DESIGNATE_ZONE)) {
  return false;
}
//Do the rest of the action here

特定のイベントを待機する場合、イベントをチュートリアルオブジェクトに渡して、そのチュートリアルの手順を続行するためにプレーヤーが実行する必要があることを検証できます。たとえば、プレーヤーに特定のX、Yに住宅地帯を作成する必要がある場合:

var evt:GameEvent = new GameEvent(EVENT_CREATE_ZONE, ZONE_TYPE_RESIDENTIAL, startX, startY, endX, endY);
if (mTutorial.isActive()) {
  if (!mTutorial.checkFlag(PLAYER_CAN_DESIGNATE_ZONE)) {
    return false;
  }
  //Check to see if this event is okay
  if (!mTutorial.validateEvent(evt)) {
    //Show why the player can't do this via popup
    return false;
  }
}
//Do the rest of the action here

お役に立てば幸いです。残念ながら、これを機能させるには、古いコードにチュートリアルチェックを追加する必要があります。ただし、チュートリアルオブジェクトが存在しない限り、すべてのアクションが有効であると想定することで、この統合プロセスが容易になり、バグを最小限に抑えることができます。


各チュートリアルイベントを個別のオブジェクトとして扱うことを検討します。ここからチュートリアル用のコードをデザインしてみます。ありがとう。
Sylpheed
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.