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

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

TIPS

マップにランダムに配置する

2次元のマップに複数のキャラクターをランダムに配置しようと思い、xとyをランダムで求めようとしたが、これだとすでに配置した位置が出てしまうことがある。 そこで、2次元の配列を1次元の配列で表し、配列に先頭からキャラクターを詰めて代入。その配列を…

vectorから重複した要素を削除する

vectorにランダムで作った数値などを格納して利用したい場合に、同じ数字は利用したくないという場合がある。そのようなときに重複した要素を削除する方法。 std::sortでソートして、std::uniqueで重複要素を削除し、eraseでサイズを調整する。 std::vector<int> </int>…

ドットで始まるファイルを作成する

emacsなどの設定ファイルは.emacsなどドットで始まるファイル名となる。これをWindowsのエクスプローラーで作ろうとすると「ファイル名を入力してください」とエラーになってしまう。 エクスプローラーで作るにはファイルの最後にドットを付ければ良い。つま…

Blender OpenGL / C header exporter

グラフィック関連のプログラムを書いているときにちょっと困るのが描画のためのテストデータ。単なるテストの場合はキューブなどシンプルなものを使うが、もうちょっと複雑な形状でテストしようとすると、どうデータを作るか困ってしまう。 そんなとき便利な…

イージング関数

Easing Function 早見表 だんだん速くとか、最初と最後はゆっくりなど、カーソルの動きなどに使うと便利な関数。そのいろいろなタイプをまとめて解説してあるサイト。 実装自体も簡単なので関数やクラスとして用意しておくと便利。 via easing関数を使おう |…

#error

C++のコードで#errorと書けば、コンパイル時にエラーを発生させることが出来る。 たとえば、TESTが定義されているときにはコンパイルエラーとしたい場合は次のようになる。 #ifdef TEST #error can't build #endif#errorの後に文字列を書いておくとエラーの…

Dropboxのパブリックフォルダを利用してWebGLの確認を行う

昨日(id:toburau:20140529)の日記で書いたjThreeの記事で、WebGLの実行にはDropboxのパブリックフォルダが利用できるというので試してみた。 WebGLはセキュリティ上、ローカルのファイルをブラウザで表示しても実行できない。オンラインのサーバーにアップす…

ブロックの90度回転

テトリスのようなブロックを90度回転する方法。 時計回りのときは、 X座標をY座標に代入 Y座標の符号を反転してX座標に代入 反時計回りのときは Y座標をX座標に代入 X座標の符号を反転してY座標に代入 ちなみに任意の角度の場合は、 x' = x cos θ - y sin θ …

パズルのピースをばらまく

本「ゲームの作り方」に載っていたジグソーパズルのピースをばらばらに配置する方法。 1.ピースをグリッド上に配置する 2.ピースの順番を入れ替える 3.マス目の中でランダムに位置をずらす 4.全体をランダムな角度で回転する ピースを単純にランダムで配置す…

Magic Number

VisualStudioを使ってデバッグしていると、メモリの状態が0xCDCDCDCDとなっているなど特徴的な値が入っていることがある。これはデバッグの助けとなるようにVisualStudioが値を入れているもの。そのうちいくつかは以前、この日記でも紹介した。(id:toburau:2…

擬似乱数生成アルゴリズム Xorshift

高速で質もよい疑似乱数生成アルゴリズム xorshift(xor128): ヘキサドライブ日記 http://www.jstatsoft.org/v08/i14/paper ヘキサドライブのブログの過去ログを見ていたら、擬似乱数生成アルゴリズムに関する記事があり、そこでXorshiftというアルゴリズムを…

ランダム値

tmlib.jsには整数のランダム値を生成する関数 tm.util.Random.randint(min,max)があったので、どのように実装されているかソースを見てみた。 randint: function(min, max) { return window.Math.floor( Math.random()*(max-min+1) ) + min; } randfloatでは…

浮動小数点数から整数へ

「enchant.jsスマートフォンゲーム開発講座」を読んでいたら、見慣れないコードが。 var r = randfloat(0,255)|0: randfloatは引数の範囲のランダムな値を返す関数で、その結果と0のorをrに代入している。これは色をランダムで求めている箇所のコード。0との…

ランダム値生成 修正

昨日のint版のランダム値生成では、指定した最大値が出ないという間違いがあった。Math.floor()ではなく、四捨五入のMath.round()を使うことで修正。 // ランダム値生成 var randfloat = function(min, max) { return Math.random() * (max-min) + min; }; v…

ランダム値生成

本「enchant.jsスマートフォンゲーム開発講座」に載っていた指定した範囲のランダム値を生成する関数。float版だったので、int版も作ってみた。Math.floor()で整数値へと変換している。 // ランダム値生成 var randfloat = function(min, max) { return Math…

傾き操作

Keijiro's Dev Log — ゲームのプロトタイプを操作できるようにしよう yamada/YamaController.js at master · keijiro/yamada · GitHub Radium Softwareさんがリリースしたやまだゲームで実装されている傾きセンサーを使った挙動のアルゴリズム。 やまだゲー…

ブラウザのJavaScriptでコンソール出力

ブラウザ上でJavaScriptを使ってプログラミングをするときに、コンソールに文字列を出力したいときは次のようにすればよい。 console.log('出力したいテキスト'); これでChromeなら表示メニューの開発/管理にあるJavaScriptコンソールを選んで表示されるコン…

Google ChromeでJavaScriptのデバッグ

TwitterでJavaScriptのデバッグにはFireBugやブラウザで動くWeb開発ツールがあることを教えてもらった。さっそく調べてみたら、自分が使っているGoogle Chromeには最初から開発ツールが組み込まれていた。 表示メニューの開発/管理の項目からJavaScriptコン…

距離の比較

ある2点間の距離は三平方の定理より、次のように求めることができる。 Point A,B; distance = sqrt( (B.x-A.x)*(B.x-A.x) + (B.y-A.y)*(B.y-A.y) ); xどうし、yどうしの差を二乗して足して平方根をとれば良い。 二つの距離の大小を比較するような場合、上の…

回転順番

ゲームプログラマになる前に覚えておきたい技術に書かれていたモデルのXYZ軸の回転順番。 コードを書いているときによく悩むのがモデルを回転させる各軸の順番。順番によって得られる結果が変わってきてしまうので悩ましい。 本ではモデルがZ軸を正面として…

指定した点を見る角度を求める

ゲームプログラマになる前に覚えておきたい技術に載っていた方法。ただし、そのままではなくちょっと変えている。 基準はZ軸プラス方向。そこからどのくらい回転すれば良いかを求めている。 vector target; // 目的の位置 float ax; // x軸回転角度(首を上げ…

角度の計算

ゲームプログラマになる前に覚えておきたい技術に書かれていた各平面上の角度を求める方法。 z軸プラス方向基準のzx平面上の角度 atan2(x,z) y軸プラス方向基準のyz平面上の角度 atan2(z,y) x軸プラス方向基準のxy平面上の角度 atan2(y,x) この中で一番良く…

ある数と等しいか大きな2のべき乗の数を求める

ゲームプログラマになる前に覚えておきたい技術に載っていたコード。 テクスチャの解像度は2のべき乗でなくてはならないことが多いので、自分が欲しい大きさの画像を格納できるテクスチャサイズを求める方法。たとえば100だったら128というように、ある数と…

四捨五入

floatやdoubleの値をintへと変換すると小数点以下は切り捨てられる。小数点以下を四捨五入したいときには0.5を足してから変換すれば良い。 float f = 123.456f; f += 0.5f; int i = (int)f; cout << i << endl; f = 456.789f; f += 0.5f; i = (int)f; cout <…

イーズアウト

Keijiro's Dev Log — 指数関数を使ったお手軽イーズ・アウト 目標点まで移動する処理で、1回の移動量を目標までの距離の一定割合とするとなめらかに見える。 pos += (target - pos) * 0.1; 例えば、このように書いた場合は1回の移動量が差分の1割となり、始…

デバッグ版でのみ有効なコード

Visual Studioではリリース版でビルドするときにはプリプロセッサでNDEBUGが定義されているので、これで判断すれば良い。 #ifndef NDEBUG ... デバッグ用のコード #endif デバッグ版ではない(NDEBUG)が定義されていない(#ifndef)という否定の否定なのでちょ…

unsigned intとint

ゲームプログラマになる前に覚えておきたい技術に書かれていたunsigned intとintの使い分け。 基本的にunsigned intを使うべきなのはビット演算をするとき。これ以外はintでも困らない。 intで表せる最大の値は2147483647。約21億。これを超えるような値を扱…

フレームカウンタ

フレームレートは単位時間あたりどのくらい画面更新が行われるかを表す数値。ゲームでは60フレームとか30フレームといった数値がよく出てくる。60フレームは1秒間に60回更新が行われるということ。 フレームカウンタとは更新何回目のフレームかを表すカウン…

RGBAそれぞれの値を取得

32ビットカラーを表現するのにunsigned intで0xff112233とすることがある。この値から各RGBAの値を取得するには、右ビットシフトした後、論理積ANDを取れば良い。 たとえば、ActionScript3では32ビットカラーの値は0xAARRGGBBというようにアルファ、赤、緑、…

ターミナルのlsコマンドを使いやすく

デフォルトのままのlsコマンドではちょっと不便だったので、オプションでいくつか設定した。 ls -AGp オプション'A'は隠しファイルも表示するもの。ただしカレントフォルダや親フォルダを表わす.や..は表示しない。 オプション'G'は色付きで表示。 オプショ…