「ゲーム開発」カテゴリーアーカイブ

ゲーム開発38:DXライブラリに差し替える

ここしばらくDXライブラリをいじってました。

DirectX9を使った自作のライブラリで一通り2Dゲームは組めるようになってるんだけど、Wave以外の音楽再生やら画像処理やら、まだまだ足りない機能がたくさんあります。それに将来的に3Dやる事も考えると、基底部分だけでも途方もない作業量になります。

あと互換性の問題が怖い。前に「動きません」とメール来た事があるんだけど、正直俺一人じゃ色んなハードウェアやOSの検証なんて無理だしね。

そんな苦労を取っ払うために、基底部分をDXライブラリに差し替えちゃいました。まぁ80ファイル以上あるソースコードのうち、4ファイルが差し替わっただけなんだけどね。

これでゲーム部分の開発に専念できます。ついでだから全体的な処理も見直してみようかな。

ゲームエンジン・アーキテクチャ読了

gameenginearchitectureゲームエンジン・アーキテクチャ読み終わりました。アンチャーテッドの開発者が書いた本で、800ページ以上あります。

ゲームエンジンを作るために必要な機能について一通り書かれてます。丁寧に書かれているため、わかり易いです。まぁわからない箇所もあったけど、単に俺の勉強不足か。あと理論が書かれてるだけで、実装方法についてはほとんど書かれてません。

以下自分用メモとして思った事などを…

11.6
アニメーション同士を組み合わせるアニメーションブレンディングという手法でキャラクタの多様な動きをリアルタイムに作ってるんだね。怪我の度合いで動きを変えるとか、武器を構えたまま歩いたりとか。しかし不自然にならないように結構複雑な処理が必要です。

11.7
アニメーションブレンディングした後、さらに不自然なところを直すため、ポスト処理を行います。例として平らじゃない地面に身を屈めて、地面から物を拾い上げるアニメーションについて書かれてたけど、改めて考えると物凄く大変だ。

11.11.5.4
歩いてる時に地に足が着いているように見せるための処理。これもリアルさを考えると重要だね。

12.4.8.7
人が倒れる時とかの挙動の物理シミュレーションをラグドールと言います。確かにやられたアニメーションパターンを全部は用意してられないし、壁とか床とかで動き変わるから必要だね。

12.5.3.2
地形の当たり判定と見た目が違う場合、狭い隙間とかに弾を撃ち込めないというのは確かにと思った。弾を撃つ時だけはレンダリング用のポリゴン見て当たりを判断するのか。

14.4
ゲームワールドのロード方法。一度に1つのレベルを読み込む、狭い空間を通らせてる間に次の広いレベルを読み込むエアロック、ストリーミングで随時読み込むという3つの方法。

14.6.3
オブジェクトとサブシステムの相互依存性。猫を抱いてる人とか、ジープに乗ってる人が持ってる武器の弾倉とか、依存関係大変だ。

一通り読んで思ったのは「無理だw」という事。全ての機能を作る必要はないけど、それでも3Dをやるという事は思った以上に大変なんだね。

今作ってるのは2Dのゲームだからいいけど、3Dゲーム開発する時にはフリーのゲームエンジンを利用させてもらおうかな。ただUnity 3DとかIrrlichtとか色々あるみたいだけど、どれが良いんだろ。

プレイ動画を作成してみる2

冬コミで配布した同人ゲームのプレイ動画です。
http://www.yagasuri.com/prog/

前に動画作った時から時間経ったせいで、作り方忘れてたり(汗) ちゃんと工程をメモっとかないとダメだね。

ともかく出来た動画を眺めてみたけど、やっぱ地味かな。今後はアクションや敵を増やしたり、グラフィックを描き直したり等、色々手を入れてきたいです。

ゲームコーディング・コンプリート読了

gamecodingcompleteゲームコーディング・コンプリート 一流になるためのゲームプログラミングを読み終わりました。ウルティマシリーズの開発者が書いた本です。この本は図や表がほとんど無く、文字とソースコードのみなので、読むのに結構苦労しました。理解出来ないところも多々あったり…ちなみに800ページ以上あります。

しかし現場の人が書いた本は有益ですね。実戦的なのは勿論、失敗談や他のプログラマの話とかが書かれたコラムが面白い。

以下自分用メモとして思った事などを…

第2章
ゲームアーキテクチャですが、本書ではアプリケーションレイヤー、ゲームロジック、ゲームビューの3つに分けてました。俺は勝手に基底部分なんて呼んでたけど、アプリケーションレイヤーの方がかっこいいねw

第3章
スマートポインタとかSTLとかの説明があるんだけど、そういえば全然使いこなしてないな…そのうちちゃんと勉強しよう。

第10章
「本書の中で、この第10章が最も重要かもしれない」と書かれたゲームのイベント管理。イベントデータの引き回し面倒だなぁと思ってたんで、この章の考え方は参考になりました。イベントデータを持ち歩くんじゃなくて、イベントマネージャに管理させるという方法。確かにこうしないと大規模なゲーム作るの無理だわ。

第11章
Luaを使ったスクリプティング。自作スクリプトでキャラクタの挙動とかを操るのは知ってたけど、今は既存のスクリプト言語を組み込むんだね。

第15章
物理シミュレーションSDKのBulletを統合する方法。Bulletはオープンソースだから、いつか自作ゲームにも組み込んでみよう。

第17章
ゲームAI。3Dゲームもフィールドを線分で構成して経路探索やってるんだね。A*(スター)とか昔やった気がする。自作ゲームにも、もう少しましな思考ルーチン入れないとなぁ。

第20章
C#によるゲームエディタ。C#はGUI作るの簡単そうだな。これもそのうち触ってみよう。

第21章
ゲームのデバッグ。絶対音感を持ったプログラマのデバッグの話は面白かった。

第22章
海外のゲーム会社は時間的に余裕があって、豊富なリソース使って優雅にゲーム作ってるんだろうなぁと思ったけど、そうでもないらしい。1日18時間作業とか、スタッフがごっそり抜けて新会社設立など、日本でも聞いたような話があったり。

3Dの章とかは流し読みしただけだし、他にも理解できなかった箇所とかあるんで、そのうちまた読み返そう。

ゲーム開発37:フェードイン・フェードアウト

友人に更新が少ないって言われた>挨拶
---

画面切り替え時のフェードイン・フェードアウトを作成しました。これまでもあったんだけど、CGraphicsクラスに入れて全ゲームモードで使い回せるようにしました。

フェードのやり方は色々あると思うけど、俺は一番手前に画面全体を覆う白いスプライトを用意して、それの透過値を変えることで実現してます。

いちいち初期化するのも面倒なので、FadeMove()を呼んだらその中で初期化もループ動作も行ってます。例によって即値が入ってたり、無駄な処理があっても気にしない。

絵を描いたりボスキャラ組んだり、まだやることはたくさんあるな。

//—————————————————————————–
enum {
 FADE_IN,
 FADE_OUT,
 FADE_BLACK,
 FADE_WHITE
};

struct Fade {
 float cnt;  // 移動量
 float now;  // 現在の値
 int  color;  // 色
 int  spr_no;  // スプライトNo
 BOOL complete; // 完了フラグ
};

//—————————————————————————–
// フェード動作
// in_out:フェードインかフェードアウトか
// minutes:フェードする秒数
// color:切り替わる色
BOOL CGraphics::FadeMove(int in_out, float minutes, int color)
{
 RECT workRect;

 // 初期化
 if (fade.spr_no==-1) {
  // フェード用画像登録
  SetRect(&workRect, 0, 0, 47, 47);
  fade.spr_no=CreateSprite("data\graph\status.png", workRect);
  fade.now=1.0f;
  fade.complete=TRUE;
 }

 if (fade.complete) {
  // フェード開始
  if (in_out==FADE_OUT) {
   fade.cnt=1.0f/((float)minutes*60.0f);
   fade.now=0.0f;
  }
  else {
   fade.cnt=-1*(1.0f/((float)minutes*60.0f));
   fade.now=1.0f;
  }
  fade.color=color;
  fade.complete=FALSE;
 }
 else {
  // フェード中
  fade.now+=fade.cnt;
  if (fade.now>=1.0f && fade.cnt>0) {
   fade.now=1.0f;
   fade.complete=TRUE;
  }
  if (fade.now<=0.0f && fade.cntFadeMove(FADE_IN, 0.8f, FADE_WHITE)) {
 // フェード完了後の処理
 ………
}
// みたいにして置いておく

ゲーム開発36:坂道の当たり判定2

当たり判定を全面的に作り直しました。

これまでは「壁に当たったらそれ以上動かない」という処理をしていました。これは簡単に計算できるのですが、移動量が大きいと壁に近づけない、壁に埋まると動けなくなるという欠点がありました。それの対策のために色々と条件式を詰め込んだら、それなりに動くようになったものの、ソースがぐちゃぐちゃになったり。まぁ俺の組み方が悪いんだろうけど。

今回は「壁に埋まったら戻す」にしました。これならとにかく壁に体当りして、埋まってしまったらその分戻すというだけなので、ややこしい計算はいりません。これならラクチンだと思ったのですが…複数の物体にぶつかった際に、どこにどれだけ戻せばいいのかわからない。

これに関してはあまり深く考えずに、複数当たっていても1個ずつ処理していく事にしました。このやり方には欠点があって、処理する順番によって結果が変わる可能性があるんだけど、今のところおかしく見えないからいいか。

…といった前提があって、ようやく坂道の処理です。上記の方法では、当たった場合にどれだけ戻せば良いかを計算する訳ですが、坂道の場合、横から当たろうが上から当たろうが、当たったら必ず上方向に戻します。

下記CheckHitSlope()ではキャラクタの右下と左下の点で坂道と当たっているかを計算し、当たっていたら戻りの大きい方を実際に使う値として返しています。slopeを変えることで上り坂も下り坂も、急な坂もなだらかな坂もこの関数で計算出来ます。ちょっと効率が悪かったり、intとLONGが混在してたりするのは気にしないw

思った以上に当たり判定作り直すのに時間かかってしまったので、スケジュール的にやばくなってきました(汗)

//—————————————————————————–
// 当たり判定(坂)
// charaRect:キャラクタの矩形
// myRect:坂道の矩形
// slope:坂道の傾き
// *ret_x:X方向に戻す値
// *ret_y:Y方向に戻す値
// 戻り値:接地したか
//—————————————————————————–
int CField::CheckHitSlope(RECT charaRect, RECT myRect, float slope, int *ret_x, int *ret_y)
{
 int  ret=FALSE, work_y=0;
 LONG top=0, left=0, right=0;

 // 左下の高さと戻す量
 if (myRect.left<=charaRect.left && charaRect.lefttop) {
   left=top-charaRect.bottom;
  }
 }
 // 右下の高さと戻す量
 if (myRect.left<=charaRect.right && charaRect.righttop) {
   right=top-charaRect.bottom;
  }
 }
 // 戻す量の大きい方を使う
 if (left>right) {
  work_y=right;
 }
 else {
  work_y=left;
 }

 // 接地している?
 if (work_y<0) {
  ret=TRUE;
 }

 *ret_x=0;
 *ret_y=work_y;

 return ret;
}

ゲーム開発35:エフェクトの準備

久しぶりにゲームプログラミングです。

今回はエフェクトを導入すべくクラスを作成しました。エフェクト管理クラスCEffectManageエフェクトクラスCEffectです。とは言え、どちらも前に作ったキャラクタ系のクラスであるCCharaManageとCCharaから当たり判定とかを削除した程度のものです。

ホントはキャラクタクラスにそのままエフェクトも乗せちゃおうかと思ったけど、何となく分けた。

CEffectを継承して着地エフェクトクラスCLandを作成。地面に着地した時に砂ぼこりが出るような処理を入れてみたら、一応ちゃんと動きました。キャラクタクラスがCLandを呼び出して、表示が終わったらdeleteしてます。まぁとりあえずこれで大丈夫かな。

エフェクトは他に攻撃&ダメージは入れるとして、あと何が必要だろう。ちょっと他のゲームを見て研究してみるか。

プレイ動画を作成してみる

hibakama-movie01自作ゲームをイベントに出す際、前々からPCを持ち込んでデモを流したいなぁと思ってました。という訳で練習を兼ねてデモムービーを作ってみた。

まず動画を取り込むためにアマレココというツールを使います。次に動画を編集するためにWindowsムービーメーカーを使いました。この時点で画質落ちた(汗) それをAviUtlで縮小してH.264形式に変換して完成。JW Player for Flashでページに貼り付けました。

ここで確認できます。
http://www.yagasuri.com/prog/

結構時間かかっちゃったけど、1回覚えれば次からはスムーズに作業できそうです。あと、もっと調べれば画質や効率が良いやり方があるんだろうけど、とりあえずはこれで。

しかしこうやって動画で見てみると、エフェクトが無いから地味だなぁ。今後のゲーム開発ではその辺を強化していきます。

ゲーム開発34:また方向性を考えてみる

冬コミから1月半。そろそろ先へ進むべくまた方向性を考えてみます。最低限のゲーム機能は既に出来てるので、見栄えとかアクションの作り込みをやるかな。

・ストーリーとキャラクタを作る
前にもこれ書いたけど、全然入れられてないなw 何となくの構想はあるので、それをちゃんと設定して入れ込んでいきます。ザコキャラの数も少なくて寂しいので、増やします。

・絵を描き直す
今ある絵は仮のものなので、ちゃんとした絵に置き換えていきます。個人的にはリアル系よりディフォルメ系の絵かな。アニメーションパターンも増やします。

・フィールド上にギミックを増やす
今は動く床くらいしか無いので、もっと増やしていきます。パズル的な要素まで入れ込みたいけど、まずは簡単なものからかな。また当たり判定作り直しになるかも…

・特殊効果(エフェクト)を入れる
攻撃した時のダメージ表示とか、フィールド上での副次的なアニメーションとかだけど、今は全然やってないんだよね。これをやらないと地味だからなぁ。

他にも必要なものがあると思うけど、とりあえずこの辺りから手をつけようかね。

完成目標8月!

ゲーム開発33:バグ修正

名称未設定 2コミケで公開したものには既知のバグがあったので修正しました。

坂道を実現するために、ちょっとした高さの障害物は乗り越えるようにしたんだけど、その判定が甘くて壁に引っ掛かってしまうというバグが発生してました。

コミケでは間に合わなかったけど、ようやく修正できました。こちらのゲーム開発ページからダウンロードして下さい。

まだ挙動の怪しい所があるけど、いちおう一通りの処理が完成したので、ようやくゲームとして作り込む作業に入れそうです。