確定事項まとめメモ

少しブランクがあいたので、自己再確認も含めてまとめ。

・キャラとアニメーションの実装
・描画キューに積むもの:
 テクスチャ
 使用する矩形領域
 描画先の左上の点(≠キャラの座標)
・アニメーションさせるときはテクスチャの使用領域だけを変更
・毎フレーム変更だと早すぎるのでウェイト管理が必要
・平常時、ダメージ時…などに応じてアニメーションクラスを差し替えればOKになる

・クラスデザイン
・キャラクタクラスのアクション:
 移動、攻撃、描画登録、グリッド登録、あたり判定
・描画登録はアクションとするか?
→実際の描画はスプライトレイヤーが行うので直接的には不要、登録するだけ
・あたり判定は?
→グリッドに当たり判定を行わせるのでICollidableインターフェースを実装するだけでOK
・グリッドの管理を行うのは?
→GridManagerクラスが必要か

・キャラクタの要件
・必要なもの:
 座標 Point : キャラの「中心座標」
 キャラのサイズ Size: 描画先を算出するのに必要 const
 アニメーション管理 Animator : 固定のものも含める

・エフェクトの扱い
キャラクタとエフェクトの違い:あたり判定程度
→あたり判定はICollidableインターフェースで実装済み

・表示周り
 処理→描画登録→処理→描画登録→……
・Draw()メソッドで
 アニメータ処理のコール
 テクスチャや位置を計算して描画要求を登録
・キャラクタ停止時(ポーズなど)にアニメーションが進んでしまう
→フラグで管理する

・StageOBJ と Animatorの関係
→StageOBJのコンストラクタで、自分が使用するAnimatorを作成する
・アニメーション制御はAnimatorのメソッドを使用(停止/再開,リセット等)
・StageOBJ.Draw()内でAnimator.GetData()を呼びだし、それに応じて描画登録

投稿者 Zawa : 09:02 | コメント (0) | トラックバック (0)

現時点決定事項メモ051012

現時点決定事項メモ051005の続き。

【入力処理】
・前回と同じようにManagedDirectInputで処理
・入力処理は別スレッドで走らせる

低 DirectInput
| ラッパー(各ボタンレベルで管理)
高 InputManager (各ボタンを機能名にマッピング)

・InputManagerの処理方法
・前回強引にOPだけ別処理にしたらスパゲッティった
・キーの状態を格納したオブジェクトを
 デリゲート呼びだしする
・OP、ステージ開始前、ステージ中、
 ポーズ中、ステージ後、コンティニュー確認、ED等で
 呼び出すデリゲートを変えることで実装

【スプライトのデザイン】
・SpriteLayerクラス : IDisposableインターフェースを実装
Direct3D.Spriteインスタンスを内包する
描画要求情報をキューに保持する
一括描画命令を受けてキューの中身を描き出す
基本的に毎フレームごとにキューをクリアする

・描画要求情報
・DrawRequestクラス
Direct3D.Textureインスタンス、
テクスチャ上の使用する領域を持つRectangle、
描画先の左上の点を示すPointを持つ
<< アルファ値を持たせるかどうか微妙なところ? >>

【あたり判定グリッドのデザイン】
・CollisionGridクラス
キューを内包し、あたり判定を行い
オブジェクトに通知を行う

・衝突の検知方法
→座標とあたり半径から距離ベースでの計算
→レーザー等は別処理にする必要がある

・衝突の通知方法
→ICollidableインターフェースで処理

・あたり判定のパターン
自弾 vs 敵OBJ → 消滅/ダメージ
自機 vs 敵弾 → 死亡/消滅
自機 vs 敵OBJ → 死亡/なにもなし
自機 vs アイテム → アイテム処理/消滅

整理すると:
自弾/敵弾 = 当たっても当てられても消滅
自機 = 相手がアイテムならアイテム処理
    そうでないなら死亡
敵OBJ = 当ててきたOBJの攻撃力分ダメージを受ける
アイテム = 消滅

→自機 vs 敵OBJ では、自機の攻撃力=0とすればよい

・インターフェースだけで統一的に処理するために:
・アイテムならアイテムの種類、弾なら攻撃力などの
 パラメータを取得する方法が必要
・同様に距離計算を行うために座標/あたり半径を
 取得する方法が必要

・よって、ICollidableインターフェースは
void ICollidable.Collide(object param);
object ICollidable.GetCollideParam();
PointRadius ICollidable.GetInfo();
となる。

・円におけるRectangleみたいな実装
→PointRadiusクラス
座標位置と半径を持ち、PointRadiusインスタンス間で
領域が重なっているかどうかを判断する
bool PointRadius.Intersect(PointRadius);
を実装すればよりスマートに


・ToDo:
音の考慮
いい加減キャラクタのベースクラスを設計する
グラフィックアニメーション処理
ステージ処理

投稿者 Zawa : 09:02 | コメント (0) | トラックバック (0)

現時点決定事項メモ051005

まったくの趣味と暇つぶしでゲームを作ってみる計画。
その時点までの決定?事項をメモり。
たぶん他の人が見てもさっぱり面白くありません
ラクガキ用の紙をロストしても大丈夫なようにメモってるだけです


・ジャンルはSTG まずはインベーダー風を作りたい
・描画にはManaged DirectXを使う
・でもメッシュは使わず、スプライト(Direct3D.Sprite)を使う
・テクスチャはアルファチャネルをもてるPNG形式で

・ゲームに必要なリソース:起動時に一括ロード
・グローバルな構造体として使い回す
・テクスチャロードにはコールバック(Delegate)を使用
・でも読み込む記述→cnt++ というエレガントさの欠片もない実装

・ステージ背景はまずは固定で
・でも背景処理部分は作成しておく

・キャラクタとスプライトの関係:
・キャラクタクラスとレイヤークラスに分ける
・キャラクタクラスはIActor(仮名)インターフェースを実装し
→Action() メソッドを保証
・毎フレームAction()メソッドを呼び出す
→ポリモーフィズムで各種処理を実装
・void Action(int ElapsedFrame) 予定
・キャラクタの描画:下から順に描く

・敵と敵弾の関係:
・親子関係を持たせると「弾の処理」が不要になる
・その分関係がわかりにくくなる。大規模実験で経験済み
・弾は自律的に動くものとすれば外部からの制御は不要

・次の3点を満たせば親による制御は不要になる:
 ゲームエリア外に出たら自律消滅する
 弾がエリア外に出ることを保証する
 敵(=生成元オブジェクト)が死んでも弾は引き続き処理を行う

・フロー案
OnFrameRender() 関数内 BeginScene()〜EndScene()で
ステージ処理 … 敵機生成等
背景処理 … 当面は背景固定
自弾処理 … パッド/キーボードからの入力処理、あたり判定
自機処理 … あたり判定
アイテム処理 … あたり判定
敵機処理 … 移動/弾の生成
敵弾処理 … 移動
エフェクト処理 … 登録済みのエフェクトについて処理
通知関係処理 … ボーナス等の通知について処理
システムビジュアル処理 … スコア等の処理
下層からの描画処理 … Sprite.Draw(device,texture, ...)

・あたり判定の効率化
当面は弾数を増やす予定はないが、予め効率化しておくと後で楽?
剰余計算とCollections.ArrayListの処理速度にもよるが
配列の総当たりチェックよりは効率がいい…筈。

・グリッド案:
・最大あたり半径を仮に64pxとする
→65px以上のあたり判定を持つ弾は存在しない
・レーザーについては別の扱いとする
・ゲームエリア=320x448 →5x7のグリッドに分かれる
・あたり判定を持つ全てのオブジェクトは、自分がどこのグリッドに
 属するかをプロパティとして保有する
・あたり判定を行う場合は、自分の周囲3x3範囲について探索する
→従来は5*7=35 3*3=9なので1/4程度まで減らせる
・画面端では3x3範囲を例外的に扱う必要がある
→一回り大きい二次元配列を確保しておき
 NullObjectデザインパターンを適用
→添え字番号が1ずつ増える
→画面端を特例扱いする必要が無くなりスマートに

・あたり判定のアプローチ
・基本は「プレイヤー主体」
・自弾処理: 各弾が自分のまわりの敵グリッドに対し判定要請
・自機処理: 自機がまわりの敵弾グリッドに対し判定要請、続いて敵、アイテムグリッドに対し判定要請
・アイテム/敵機/敵弾処理: あたり判定処理は行わない
・接触があった場合、当該オブジェクトの適切なプロシージャが呼ばれる


・Todo:
テスト用のグラフィック作成
音の考慮
UMLモデル化

投稿者 Zawa : 22:13 | コメント (0) | トラックバック (0)