銀色瓦版

絵が趣味の管理人がだらだら書く日記。

なんとなくゲームプログラミング#14

prog14.png

前回のプログラムの最終形となったもの
結局ゲーム部分は完成せず、ただの落下物シミュレーションになった

ひたすら球が落ちてきて跳ね返るだけ
地面は1時間で適当に作った3Dモデル。ボールが当たると傾く
ボールの衝突時の力を地面とか他のボールとかに伝播させようとしたらなんかすごいややこしくなった
中央にプレイヤーキャラクターとしてののワさんを置いておいたのだが、結局ののワさんがこのシミュレーションに物体として加わる事はなかった

結論:素人がゲームに独学でリアルな物理演算組み込もうとしても無駄
  1. 2009/11/23(月) 01:29:34|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0

なんとなくゲームプログラミング#13 また新しいゲーム

prog13.png

学祭展示用ゲームの開発中
当然XNA製
Xbox360上で動かせればいいなと考えている

今回のスクリーンショットは実験として作った、質量・重力・弾性係数を定義した落下物シミュレーション
3次元ベクトルの反射は、入射ベクトルと接触面の法線ベクトルを与えると反射ベクトルを計算してくれるReflectメソッドがあるので超便利
動いている様子をGIFアニかなにかで載せられればよかったのだけど、面倒だったので中止
何も考えずに組むと、境界線付近で振動する。きもい

こういうのは大抵誤差とかなんとかで単純な計算式だけでは収束しないから、まあ適当に誤差範囲でも定義して、収束するようし向ければいいのではないだろうか

それでも振動したり突然停止する……とか思っていたら、重大な欠陥があった
とりあえずMSDNのチュートリアルに書かれていたことを丸々転載してみる

> なぜ、将来の位置を計算してそれをテストするのではなく、単に現在の位置で有効性をテストできないのかと疑問に思われたかもしれません。その答えは、現在の位置のみをテストした場合、無効な動きを防ぐには遅すぎるためです。テストが行われる時点で、乗り物の位置は既に更新されています。新しい位置が無効 (境界を越えるケース) であったとします。これにより、以降のテストが失敗し、結果として乗り物は現在の位置で動かなくなります。どう考えても、これはプレイヤーが制御する乗り物の最適な動作ではありません。
> 将来の位置を確認し、無効な動きを防止するべきでしょう。この確認により、プレーヤーは現時点では有効な位置にいるため、別のこと (バックなど) を試みることができ、動かなくなることはありません。


ということで次フレームの位置を計算して判別するようプログラムを組むと、だいたいうまくいった
  1. 2009/10/18(日) 11:50:37|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0

なんとなくゲームプログラミング#12

ss2.png

1時間でできるビジュアルノベルソフト
サークルの合宿でのプレゼン用

フリーで出回ってるスクリプタや専用言語などによるプログラムに比べると面倒かもしれない。
しかしXNAの導入としては割といい部類かも。

気が向いたら詳細は後で。
  1. 2009/09/18(金) 07:36:09|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0

メタセコイア無料版ではテクスチャ貼り付けなどができないので、3Dポリゴン制作をBlenderに移行。
また一から操作を覚える作業が始まる……
  1. 2009/09/16(水) 10:21:36|
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

なんとなくゲームプログラミング#11

スパロボを作っていたと思っていたら、いつのまにかダンジョン探索ゲーになっていたでござる の巻
prog11.jpg
  1. 2009/09/10(木) 12:09:28|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0

なんとなくゲームプログラミング#10 グラフィクス系の話

お前は複数の3Dモデルを描画するために深度によるソートが必要だと思っていたようだが、別にしなくても描ける

3D画面の上に、2Dのキャラの顔だったりメッセージウィンドウだったりを表示するためにSpriteBatchを使うのだが、一旦SpriteBatch.Begin()を呼び出してしまうと、GraphicsDeviceのRenderStateが変更されてしまうようで、要するに次に3Dを表示しようとしたときバグったようになる。
これを解決するために、RenderStateプロパティに値を設定し直す。

GraphicsDevice.RenderState.DepthBufferEnable = true;
GraphicsDevice.RenderState.AlphaBlendEnable = false;
GraphicsDevice.RenderState.AlphaTestEnable = false;
GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap;
GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap;

MSDNのサンプルを眺め回したところ、これだけ設定すれば元に戻るっぽい。
  1. 2009/09/04(金) 19:47:18|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0

なんとなくゲームプログラミング#9 シーン遷移の話

深夜更新でもなんともないぜ

タイトル画面からゲーム本編に移ったり、フィールド画面から戦闘に移行したりすることを勝手にシーン遷移とか呼んでる。
これを実現するには、なにか適当にフラグの変数を作ってswitch文で分岐させれば簡単だし、MSDNに載っているXNAを使ったゲームのサンプルでもそうなっているのだけど、以前偉大なる先輩が分岐を使いまくって階層が深くなるのはエレガントでなくてイクナイ、とおっしゃっていたので、デリゲートを使って実現してみる。

最近忘れっぽいのでメモしておく
// デリゲートの名前と引数を定義するでござる
delegate void デリゲート(int 引数);

class hoge
{
// デリゲート型変数を宣言するでござる
デリゲート イベント;

public hoge()
{
// デリゲート型変数にメソッドを代入するでござる
イベント = 実行するメソッド;
}

public void イベントを呼び出すメソッド()
{
// デリゲートでイベントを呼び出すでござる
イベント(引数);
}

public void 実行するメソッド(int 引数)
{
// 実行内容を書くでござる

// デリゲートに次のメソッドを代入し直すでござる
イベント = 次に実行するメソッド;
}

public void 次に実行するメソッド(int 引数)
{
// 次に実行する内容を書くでござる
}
}


不思議なことにデリゲート型変数には二つ以上のメソッドも代入できるらしい。
すでにメソッドが代入されたデリゲート型変数に+=演算子を使って新たに代入するだけ。
この状態のデリゲートを呼び出すと、登録されたメソッドが順に全て実行されるとか。

匿名メソッドやラムダ式を使うとあらかじめメソッドを宣言してなくてもデリゲートが使えるので楽。
定義済みデリゲートを使うとデリゲートを定義する必要もないのでさらに楽。

// デリゲートの定義が要らないでござる
class hogehoge
{
// Action<T>ジェネリックデリゲートは.NET Framework 2.0から使えるでござる
Action<int> イベント;

public hogehoge()
{
// ラムダ式をデリゲート型変数に代入するでござる
イベント = (引数) =>
{
// 実行する内容を書くでござる

// デリゲート型変数にラムダ式を代入し直すでござる
イベント = (引数) =>
{
// 次に実行する内容を書くでござる
}
};
}

public void イベントを呼び出すメソッド()
{
イベント(引数);
}
}

あれ、微妙にカオスに
  1. 2009/09/04(金) 03:59:15|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0
次のページ

プロフィール

銀之助

Author:銀之助
画像はTWにおける自キャラ
とりあえずメッセ
glow_of_the_sky@hotmail.com

FC2カウンター

Twitter

 

テイルズ時計

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

リンク

このブログをリンクに追加する

ブログ内検索

RSSフィード

Powered By FC2ブログ

Powered By FC2ブログ
ブログやるならFC2ブログ