ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

TIPS

確率の計算

あるアイテム4つから1つ選び出す。アイテムにはそれぞれ選びだされる確率が設定されている。 このような処理を行いたかったので、次のように書いてみた。 int select() { int odds[] = { 15, 30, 20, 35 }; // アイテムそれぞれの確立 int dice = rand()%100…

2次元での内積と外積

3次元では内積の結果はスカラー値、外積の結果はベクトルとなる。2次元の場合は外積の結果もスカラー値となる。 ・内積 a・b = |a||b|cosθ = ax * bx + ay * by ・外積 a×b = |a||b|sinθ = ax * by - ay * bx 演算対象のベクトルが両方とも長さ1の単位ベクト…

ラジアンと度数の変換

DirectXにはラジアンと度数の変換を行うマクロが定義されている。 #define D3DXToRadian( degree ) ((degree) * (D3DX_PI / 180.0f)) #define D3DXToDegree( radian ) ((radian) * (180.0f / D3DX_PI)) ちなみにPIは次のように定義されている。 #define D3DX…

Sleipnirで右クリックメニューを編集する

タブブラウザSleipnirで、文字を選択して右クリックをしたときに出るメニューに自分の好きな機能を追加する方法。Sleipnirをインストールしたフォルダ(デフォルトならC:\Program Files\Fenrir & Co\Sleipnir)のresources\languages\default\japaneseにあるBr…

デバッグ時の未初期化変数の値

初期化し忘れたポインタにアクセスして落ちて、0xCDCDCDCDになっているのをよく見る。 VisualStudioでデバッグビルドした場合、初期化していないポインタには0xCDCDCDCDが入っている。エラーで落ちた場合、変数の値を調べることによって原因を見つける助けに…

Win32 APIにブレークポイントを貼る方法

CRIチャンネルの記事。 http://cri-ch.tv/hirase/7947.html?1195736212 シンボルでブレークポイントを貼ればよいという話。そのWin32APIのシンボルファイルをネットからダウンロードするように設定するとは知らなかった。 シンボルファイルにブレークポイン…

deleteを使うときのマクロ

DirectXのサンプルを見ていたら、DXUT.hに確保したメモリを安全に解放するためのマクロがあったので引用。 #ifndef SAFE_DELETE #define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } } #endif #ifndef SAFE_DELETE_ARRAY #define SAFE_DELETE_ARRAY(…

バッチファイルでファイル名だけ取り出す

バッチファイルでは引数を%で取得することが出来る。たとえば次のようなバッチファイルtest.batがあったとき。 @echo off echo %1実行すると次のようになる。 > test.bat 123 123ここで引数にファイル名をフルパスで指定したときに、バッチファイル内ではフ…

Immutable Interface

クラスのインスタンスを、あるクラスからは読み書きができるが、別のあるクラスからは読み取り専用とする手法。 読み取り専用のインタフェースを作りそれを実装してクラスを作成し、読み取り専用にしたいクラスに対してはそのインタフェースとして渡すように…

値sをn回に分けて足す方法

あるパラメータをsだけ増加させるとき、それをn回に分けて増加するような場合。 1回の増加が変わらず一定のとき、その1回分の増加量yは次の通り。 y = s / n 1回の増加がだんだんと線形に増えていくような場合の、x回目の増加量yは次の通り。 y = 2 * s / (n…

コントロールを配列で作る方法で参考にしたサイト。 C# と VB.NET の入門サイト さらに人から教えてもらったC#やVisual StudioなどのTIPSが載っているサイト。いろんなTIPSが数多く載っているので便利。 .NET Tips - DOBON.NET

CGで使う数学

http://www.cs.brown.edu/~scd/facts.html CGで使われるいろんな定数や式が書かれたページ。結構参考になる。ただ、フォントの関係か式がちょっと読みにくい。 via 404 Blog Not Found:グラフィックに役立つ数学的事実

だんだん大きく、だんだん小さく

なにか振動するアニメーションをさせたいとき、だんだん大きくしたり、だんだん小さくしたりする値を得る方法。 基本となる式は次のようなもの。 y = cos(x) * x 貼り付けた画像はこの式をBearGraphで表示してみたもの。 あとはこの式をちょっといじって、自…

番兵とパンの耳

CRIチャンネルで「パンの耳」と呼んでいるテクニックについての記事が。 http://cri-ch.tv/iwai/182.shtml 私もこのテクニックを知っていたけど、パンの耳とは聞いたことが無かった。記事では「番人」のテクニックの応用と書かれている。私は番人より「番兵…

浮動小数点数の比較

二つの浮動小数点数を比較するとき、次のようなコードを書いてはいけない。 float a; float b; if ( a == b ) // 間違ったコード { } 浮動小数点数では誤差が含まれるので、これでは正しく判定されない。正しく判定するには二つの値の差の絶対値がある一定値…

目的の角度へ回転する

たとえば、誘導弾のように、ある角度を目的の角度へと近づける方法。 現在の角度と目標の角度の差を求めて、近づく方向へ角度を加えていけばよい。このとき注意するのは差が180度よりあった場合には、遠回りの回転をしないように180度以下に丸めること。 flo…

2つのベクトルの内積の符号

2つのベクトルの内積の値によって、次のようなことが分かる。 0の場合は直交している。 プラスの場合は鋭角。 マイナスの場合は鈍角。 鋭角が直角より小さくて、鈍角が直角より大きい。鋭角、鈍角って普段あんまり使わないから、パッと頭の中にイメージが出…

放物線のジャンプ

放物線を描くジャンプは等加速度運動で表現すればよい。 コードとしては次のような感じ。値や関数は適当。 float Acc = 0.0; // 加速度 float PosY = 0.0; // Y座標 #define JUMPPOWER (100.0) // ジャンプ力 #define GRAVITY (0.98) // 重力 // ジャンプ開…

だんだん加速、だんだん減速

たとえば、カーソル移動なんかで最初すばやく移動し始めるのだけれども、目的の場所に近づくにつれて移動が遅くなるという処理をやりたくて調べたところ、FLASHではこういうのをイージングというらしい。で参考にしたサイト。 【数学・DHTML】 イージング [E…

はてなダイアリーのシンタックス・ハイライト

ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ はてなダイアリーにソースコードの色付け機能が追加されたのでさっそく試してみる。 以前書いたテストコード(id:toburau:20060630) class Test {} public Func() …

角度を0から360度に丸める

とあるソースで見たやりかた。 float rot; while( rot > 2.0f*PI ) rot -= 2.0f*PI; while( rot while文を使うのが面白いと思った。

atan2

ベクトルで角度を求めるメソッドを実装していて、atan2の引数を間違っていたことに気が付いた。 第1引数がyで第2引数がx。 double x, y; Math.Atan2( y, x ); なんでyが先なんだろう。y/xのアークタンジェントだから、その順番に合わせたのかな。

ラジアンと度数の変換

度数 = ラジアン / PI * 180 ラジアン = 度数 / 180 * PI これくらいの式は考えずにパッと出てこないといけないんだけど。

座標系

昨日のベクトルの回転を考えていたら、座標系がこんがらがってきたので勉強。 3D座標系では左手座標系と右手座標系があり、X軸の正方向を右側、Y軸の正方向を上としたとき、Z軸の正方向が向こう側に行くのが左手座標系、手前になるのが右手座標系。 OpenGLは…

ベクトルの回転

2次元ベクトルを回転させたときの座標変換は次の通り。 x' = x * cosθ - y * sinθ y' = y * cosθ + x * sinθ このとき回転方向は時計回りが正。追記(11/17): 座標系はX軸の正方向が右側、Y軸の正方向が下向きのとき。このときに角度の正方向は時計回りになる…

角度を求める

アークタンジェントを使って角度を求める方法。Cの標準ライブラリではatanとatan2の二つがあり、atanはXとYの比を引数に渡し、atan2はXとYを引数に渡す。0除算を考えなくて良い分、atan2のほうが使いやすい。 #include double x,y; double rad; rad = atan2(…

メソッドの戻り値を自分にする

昨日のコーディングテクニックの話。 まずはサンプルソース。例によって処理内容はまったく意味が無い。 class TestClass { private: int mNum1; int mNum2; public: TestClass* SetNum1(int i) { mNum1 = i; return this; } TestClass* SetNum2(int i) { mN…

アラインメント

BITMAPFILEHEADERを使って読み込んだBMPファイルの構造を調べようとしたらうまく値が取れなかった。それはアラインメントが原因と分かった。調べてみたところアラインメントを調整する #pragma pack という命令があった。 #pragma pack(push, 2) // アライン…

ファイルサイズを取得する方法

fopen_sでオープンしたファイルのファイルサイズを取得するには、fseekでファイルポインタを終端に移動して、その位置をftellで取得すれば良い。このままファイルに対して作業するなら、fseekでファイルポインタを先頭に戻しておくことを忘れずに。 FILE *fp…

ジョイスティックを使う方法その2

ボタンが4つより多いジョイスティックの場合は、JOYINFOの代わりにJOYINFOEXを利用する。基本的な使い方は変わらないが、JOYINFOEX構造体のdwSizeとdwFlagsの値を必ず設定しなければならない。 JOYINFOEX JoyInfo; JoyInfo.dwSize = sizeof(JOYINFOEX); Joy…