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

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

TIPS

mapで存在確認

std::mapを使って、キーがあるかどうかの判定に[]演算子を使ってしまうと、新たにキーが作成されてしまう。 std::map<int, int> data; if(data[0]) { // ここで新たにキーが作成される } キーがあるかどうかの判定にはmapはキーが重複しないので、count()が使える。 st</int,>…

ラムダ式

ある関数内でちょっとした処理を何回も行うけど、メンバ関数を作るまでもないようなときはラムダ式による関数オブジェクトが便利。 で、ついそのラムダ式の書き方を忘れてしまうので、ここにメモ。 auto func = [](int x) { return x+1; }; キャプチャとかも…

一定値以上の入力があったときに反応する

パッドのスティックの入力で、一定以上入力したら反応するようなとき、オンオフだけなら、入力値が一定値を超えたか判定するだけでよいが、どのくらいスティックが倒されているかも取得したい場合。 入力が0から1の値を取り、反応する最小値より小さいときは…

一つのソースファイルを垂直に分割して表示する方法

メニュー「ウィンドウ」→「新規ウィンドウ」でソースファイルを複製し、 メニュー「ウィンドウ」→「垂直タブ グループの新規作成」で垂直に分割 Visual Studioのウィンドウの分割では水平方向の分割となる。 垂直タブ ブループの作成を行えば垂直方向への分…

ChromeをEmacsキーライクに操作

AutoHotKeyを使ってGoogle ChromeをEmacsキーライクに操作できるようにした。 ; chrome.exeでの設定 #IfWinActive, ahk_exe chrome.exe ^h::Send,{BS} ^m::Send,{Return} ^p::Send,{Up} ^n::Send,{Down} ^v::Send,{PgDn} !v::Send,{PgUp} !w::Send,^c ^y::Se…

AutoHotKeyでCtrl-n,Ctrl-pをカーソル移動に

Visual Studioでのインテリセンスの項目の上下移動をCtrl-nとCtrl-pで行いたかったので、AutoHotKeyを使ってキーカスタマイズを行った。 そのスクリプトは次の通り。 #InstallKeybdHook #UseHook SendMode Input ^p::Send,{Up} ^n::Send,{Down}最初はSendMod…

ファイルのタイムスタンプを現在の値に

Windowsでファイルのタイムスタンプを現在の値へと変更する方法。 PowerShellで次のように入力。 sp -path ファイル名 -n lastwritetime $(date)フォルダに大量のファイルがあり、その中のいくつかを頻繁に使うようなとき、更新日時順に表示すればすぐにアク…

線形補間(Linear Interpolation)の式

今まで線形補間は次のように書いていた。 float lerp(float start, float end, float t) { return start + t * (end - start); } しかし、この場合だと、tが1のときに浮動小数点数の計算誤差でendの値とならないことがある。 ということで、次のように書くべ…

Simple Easing Functions

以前(id:toburau:20180406)、ここで書いたEasing関数の実装例へのリンク。 https://github.com/jesusgollonet/ofpennereasing/tree/master/PennerEasing ここでの実装されている関数は引数が4つ(t,d,b,c)あり、それぞれ、tが今の時間、dが変化時間、bが開始…

Easing

Robert Penner's Easing Functions Easing Function 早見表 UIのカーソルの動きなどに効果的なアニメーションを付けるときに使われるイージング。その大本ともいえるサイト。 さらにC++で実装したものもGitHubにあがっていた。 https://github.com/jesusgoll…

ヒットストップの計算

最近プレイしているモンスターハンターワールド。大剣でモンスターを斬る感覚が気持ちいい。その気持ちよさを表現している一つがヒットストップ。剣がモンスターに当たった瞬間などにモーションが一瞬止まったり、スローモーションになったりする表現。この…

for文で列挙型

for文で列挙型を使うとき、autoを使うと簡単に記述することができる。 たとえば、1週間を定義したenumがあるとき、月水金だけループで実行したい場合は次のように書ける。 enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; for(auto day : { Days::Mon, Days…

prefix k

いくつかコードを見ていたら、定数の変数名にプリフィックスとしてkが付いているものがあった。 const int kMax = 100; Objective-Cでよく使われているらしい。あまり最近では使われていないのかもしれないが。 コンパイル時に確定する定数にはkを頭に付ける…

enumの項目数を取得する

enumの項目数を取得するにはC#では次のようにしてできる。 public class Hello{ enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; public static void Main(){ int num = System.Enum.GetNames(typeof(Days)).Length; // enumの項目数を取得 System.Console.…

enum class

スコープを持つ列挙型 - cpprefjp C++日本語リファレンス C++11から、列挙型としてenum classが利用できる。 スコープを持つ列挙型となり、さらに整数型への暗黙の型変換が行われない。 enum class Color { Red, Green, Blue }; Color value = Color::Red; …

履歴を取る

パッドのボタン入力を60フレーム分取っておいて、コマンド入力の判定に用いるなど、データの履歴を利用したい場合がある。その場合には一定サイズのバッファに新しい入力データを追加し、古いデータを破棄することで表現できる。 STLのdeque(デック)を使って…

指定した範囲の乱数

C++11での乱数の使い方。 乱数生成器と一様分布器を組み合わせて使う。ちょっとややこしい。 #include <iostream> #include <random> int main(void){ std::random_device rnd; std::mt19937 mt(rnd()); std::uniform_int_distribution<int> rand100(0,99); for(int i=0; i<10; i++)</int></random></iostream>…

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

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との…