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

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

TIPS

C++で乱数

C言語のrand関数は乱数としての性能が良くないということで、C++の乱数ライブラリを使うことにした。 しかし、これがややこしくて難しい。ということで、自分用にメモ。 乱数のときに良く聞くメルセンヌ・ツイスタは std::mt19937 mt(0x1234); cout << mt() <…

線形補間

とある変数が Start から End へと変化するときに、Cur の値だったとき、どのくらいの割合 t なのか求める式。 float Start, End, Cur; float t = (Cur - Start) / (End - Start); t は 0 から 1 となる。もちろん、Start と End が同じ値では駄目。 こうい…

OpenOffceのcalcで指定したセルへカーソルを移動するマクロ

OpenOfficeのcalcで指定したセルへカーソルを移動させるマクロ。 oAddrConv = ThisComponent.createInstance("com.sun.star.table.CellAddressConversion") aAddr = CreateUnoStruct("com.sun.star.table.CellAddress") aAddr.Row = 0 '対象の行番号 aAddr.C…

バッチファイルでファイル一覧の文字列を作成する

あるフォルダに含まれるファイルを列挙した文字列を作成するバッチファイル @echo off @setlocal enabledelayedexpansion set FILE_LIST= for %%f in (.\test\*.txt) do ( set FILE_LIST=!FILE_LIST!%%f ) echo %FILE_LIST% set FILE_LIST=!FILE_LIST!%%fの…

ワークスペースからフォルダを削除

Visual Studio Code でワークスペースからフォルダを削除するときにちょっと詰まったので、ここに書いておく。 ワークスペースにフォルダを追加する方法は、Visual Studio Codeのエクスプローラー上の右クリックメニューの「ワークスペースにフォルダーを追…

OpenOfficeのCalcでセルの数値の書式をマクロで設定

OpenOfficeのCalcでセルの数値の書式をマクロで設定したい場合、書式を指定する番号がわかりにくかった。 そこで、まずセルの右クリックメニューの「セルの書式設定」から指定したい書式にする。 そして、そのセルをマクロでNumberFormatの値を表示する。 Ms…

OpenOfficeのCalcでボタンのセル位置を取得するマクロ

OpenOfficeのCalcでシートに配置したボタンのセル位置をマクロで取得する方法。 Doc=ThisComponent Sheet = Doc.CurrentController.ActiveSheet DrawPage = Sheet.DrawPage For I = 0 To DrawPage.Count - 1 Shape = DrawPage.GetbyIndex(I) If Shape.getNam…

Gitでコミット対象から外す

Gitでコミット対象から外したいファイルやフォルダがあるときは、 .gitignore このファイルに記述すれば良い。 ただ、この場合は、そのリポジトリを見ている人全員に影響がある。 自分しか使っていないエディタのメタファイルなど、他の人には関係のないフィ…

mapで存在確認

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

ラムダ式

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

RyanJuckett

www.ryanjuckett.com ゲーム制作で必要となるいろいろなテクニックが紹介されているサイト。 英語なのでちょっと読むのが大変だが、知っておいたほうが良さそうなものがいくつもある。 なんとか頑張って読んで実装を試してみよう。

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

パッドのスティックの入力で、一定以上入力したら反応するようなとき、オンオフだけなら、入力値が一定値を超えたか判定するだけでよいが、どのくらいスティックが倒されているかも取得したい場合。 入力が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

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