Advanced Search
Search Results
132 total results found
AIの課題(5月12日)
見張りモンスターAIを設計せよねらい敵は何を見ているのか? ↓ それをどんなフラグにするのか? ↓ フラグによってどの行動を選ぶのか? ↓ それをif文にするとどうなるのか?課題タイトル「お宝を守るモンスターを設計しよう」シチュエーションあなたはダンジョンゲームの敵AIを作ることになった。モンスターは部屋の中にある宝箱を守っている。プレイヤーは部屋に侵入して、宝箱を開けようとする。モンスターは状況に応じて行動を変える。モンスターの基本行動使ってよい行動は以下。Idle その場で待つ Pat...
AI モンスターの知能
モンスターに視覚を与えるisFindPlayer は誰が決めているのか?1. 前回までの確認前回、モンスターの行動を if文 で切り替える考え方を学びました。例えば、次のような処理です。if (isAttackRange) { Attack(); } else if (isFindPlayer) { ChasePlayer(); } else { Idle(); }この処理では、モンスターは次のように行動します。条件行動攻撃範囲にいる攻撃するプレイヤーを見つけている追い...
既存ゲームを改良するよ(何様じゃい!)
既存ゲームの「足りない部分」を見つけて進化案を考える手順書 この課題でやること この課題では、前回分析したゲームをもとにして、 「このゲームはどこが弱いのか」 「どこを足せばもっと面白くなるのか」 を考えます。 ただし、完全に別のゲームを作るのではありません。 元のゲームの面白さを残したまま、 足りない部分を補って、少し進化させることが目的です。 対象ゲーム 前回分析した次のゲームの中から、自分が選んだものを使います。 パックマン クルクルランド デビルワールド ドンキーコングJR 手順1 分析したゲーム名...
状態遷移でモンスターを管理
ゲームAI課題:状態遷移でモンスターの行動を管理しよう 「今、モンスターは何をしているのか?」を設計する 1. 今日のテーマ 前回は、モンスターに「視覚」を与える考え方を学びました。 isFindPlayer = CheckCanSeePlayer(); このように、モンスターがプレイヤーを見つけているかどうかを判定しました。 そして、その結果を使って行動を変えました。 if (isAttackRange) { Attack(); } else if (isFindPlayer) { Chase...
3Dの移動計算(回転して移動)[ゲーム数学、プログラミング基礎]
戦車を「向いている方向」に動かすプログラムを作ろう 1. 今日の目標 今回は、3D空間で戦車を動かす処理を作ります。 完成すると、次の操作ができるようになります。 キー 動き Aキー 左に回転する Dキー 右に回転する Wキー 戦車が向いている方向に進む 今回のポイントは、ただ前に進むだけではありません。 ワールドの+Z方向に進むのではなく、 戦車が向いている方向に進む という処理を作ります。 2. 今日作る処理の方針 今回の移動処理は、次の流れで作ります。 Aキー・Dキーで戦車の角...
ゲームにおけるフィードバックの研究
ゲーム研究レポート ゲームにおける入力・出力・フィードバックを調べる この授業でやること この授業では、1つのゲームだけを詳しく調べるのではなく、 いろいろなゲームを見比べながら、 入力・出力・フィードバック の関係を調べます。 ゲームでは、プレイヤーがボタンやキーを押すと、 ゲーム内で何かが起こります。 そして、その結果をプレイヤーに伝えるために、 画面・音・エフェクト・振動・UIなどの反応が返ってきます。 この流れを、次のように考えます。 入力 ↓ ゲーム内の処理 ↓ 出力 ↓ フィードバック ↓ プレイヤーの...
その1
第1章:シャドウマップの考え方 この章の目的 コードを書く前に、なぜ「ライトから見たZ値」を比べると影がわかるのかを理解する。 この章は説明だけ。コード変更はしない。 1. 普通のライト計算だけでは影は出ない 今のライト計算では、だいたい次のことをしている。 面の向きとライト方向を比べる ↓ ライトの方を向いていれば明るい ライトと逆を向いていれば暗い これは「その面がライト方向を向いているか」を見ているだけ。 しかし、影を出すには次のことも調べる必要がある。 ライトとその場所の間に、別の物体があるか 手前に...
その2
第2章:ライトを仮想カメラとして扱う この章の目的 シャドウマップを作るには、ライトから見た画面が必要になる。 そのために、ライト用のビュー行列と射影行列を追加する。 この章では、まだ画面は変わらない。 考え方 普通の描画では、カメラから見た画面を作っている。 カメラ位置 ↓ 見る シーン シャドウマップでは、ライトから見た画面を作る。 ライト視点の仮想カメラ位置 ↓ 見る シーン 今回のライトは平行光源として扱う。 平行光源には本来「位置」はない。 しかし、シャドウマップを作るには「ライトから見た画...
その3
第3章:シャドウマップ用テクスチャを作る この章の目的 ライトから見たZ値を保存するためのテクスチャを作る。 まだそのテクスチャには何も描かない。 この章でも画面は変わらない。 考え方 シャドウマップは普通の色画像ではない。 色を保存する画像ではなく、ライトから見たZ値を保存する画像 DirectXでは、テクスチャ本体と、その使い道を分けて考える。 ID3D11Texture2D ├─ DepthStencilView : 深度を書き込む口 └─ ShaderResourceView : シェーダー...
その4
第4章:深度だけを書く ShadowMap.hlsl を作る この章の目的 ライト視点で深度だけを書くための専用シェーダーを作る。 通常描画用の Simple3D.hlsl とは別に、ShadowMap.hlsl を追加する。 この章でも画面は変わらない。 考え方 通常描画では、色・テクスチャ・ライト計算を使う。 しかしシャドウマップ作成では、必要なのはライトから見たZ値だけ。 必要:頂点をライト視点に変換する 不要:色、テクスチャ、ライティング ピクセルシェーダーは何もしなくてよい。 SV_POSITION ...
その5
第5章:モデルをシャドウマップに描けるようにする この章の目的 通常描画用の Draw() とは別に、シャドウマップ作成用の DrawShadow() を追加する。 この章でも画面は変わらない。 考え方 普通の Draw() は、画面に表示するための描画。 Draw() 色を出す テクスチャを読む ライト計算をする カメラ視点で描く シャドウマップ用の描画では、色はいらない。 DrawShadow() 色を出さない テクスチャを読まない ライト計算もしない ライト視点のWVPだけ...
その6
第6章:描画を2パス構成にする この章でやること Stage::Draw() の描画を2回に分けます。 パス1:ライト視点で深度だけ描く(シャドウパス) パス2:カメラ視点で普通に描く(メインパス) あわせて、第7章でシェーダーがライトVP行列を使えるよう、 CONSTANTBUFFER_STAGE に matLightVP を追加して毎フレーム送ります。 この章が終わっても画面の見た目は変わりません。 影が出るのは第7章からです。 この章でのコード変更点 ファイル 変更内容 Stage.h CO...
その7
第7章:Simple3D.hlslで深度比較して影を出す この章でやること Simple3D.hlsl のピクセルシェーダーで、シャドウマップを読んで影を判定します。 この章で初めて画面に影が出ます。 ただし影のエッジはジャギー(ギザギザ)になります。 なめらかにするのは第8章で行います。 この章でのコード変更点 ファイル 変更内容 Stage.cpp メインパスの前後にシャドウマップSRVをセット/解除 Simple3D.hlsl g_shadowMap・g_shadowSampler の宣言...
その8
第8章:比較サンプラーで影のエッジをなめらかにする この章でやること 影のエッジのジャギー(ギザギザ)を改善します。 第7章では Sample() で1点だけ読んで影を判定していました。 この章では SampleCmpLevelZero() に差し替えて、近隣の複数点を平均した判定にします。 この章が終わると影のエッジが少しなめらかになります。 この章でのコード変更点 ファイル 変更内容 Simple3D.hlsl SamplerState を SamplerComparisonState に変更(...
その9(おまけ)
第9章:影が出ないときの確認ポイント 目的 つまずきやすいところを、症状別に確認できるようにする。 1. 影がまったく出ない 確認すること Stage::Draw() で Direct3D::BeginShadowPass() を呼んでいるか。 Model::DrawShadow(hDonut_) を呼んでいるか。 Direct3D::EndShadowPass() を呼んでいるか。 Stage::Draw() のメインパス前に PSSetShaderResources(1, 1, &pShadowSRV) を...
DirectXTKとAudio
Step 00 DirectXTK Audio の基本 この回の目的 この回では、DirectXTK Audio で使う基本的なクラスの役割を整理します。 音を鳴らすプログラムでは、いきなりコードを書く前に、次の3つを分けて考えることが大切です。 AudioEngine … 音を鳴らす仕組み全体 SoundEffect … 音声ファイル1個分のデータ SoundEffectInstance … 実際に再生中の音 この3つの違いが分かると、DirectXTK Audio ...
前準備その2 スマポ
スマートポインタ入門 目的 この資料では、C++ の std::unique_ptr の基本的な使い方を学びます。 今回の目標は、スマートポインタを深く理解することではありません。 まずは、次のことが分かれば十分です。 new で作ったものは delete で消す必要がある std::unique_ptr を使うと delete を自動でやってくれる std::make_unique は unique_ptr 用の new のようなもの この考え方を使って、あとで DirectXTK Audio の AudioE...
01 音を鳴らしてみるだけ
第1回 DirectXTK Audioで音を1回鳴らす この回に入る前に 先にDirectXTKとAudio を読み、次の3つの役割を確認しておきます。 AudioEngine : 音を鳴らす仕組み本体 SoundEffect : wavファイルを読み込んだ音データ SoundEffectInstance : 再生中の音を操作するもの この回では、まず AudioEngine と SoundEffect だけを使います。 目標 この回では、DirectXTK Audioを使って、...
02 Engineに組み込んでゆくぅ
第2回 Audio機能をEngineに組み込んでゆくぅ 目標 この回では、第1回で TestScene に直接書いた音声処理を、エンジン側の機能として分離します。 最終的に、ゲーム側から次のように使える形にします。 file_path testPath = "Assets/Audio/test.wav"; Audio::Load("test", testPath); Audio::Play("test"); DirectXTK Audioの細かい処理は、Audio の中に隠します。 今回変更するファイル Eng...
03 SEとBGMを別扱いに(なんで?)
第3回 効果音とBGMを分ける 目標 この回では、Audio機能を次の2種類に分けます。 SE : 効果音。短い音。何度も鳴る。 BGM : 背景音楽。長い音。基本的に1曲を流し続ける。 最終的に、次のように使える形にします。 file_path shotPath = "Assets/Audio/SE/shot.wav"; file_path stagePath = "Assets/Audio/BGM/stage.wav"; Audio::LoadSE("shot", shotPath); Audio::Lo...