Rubyの標準添付ライブラリFiddleでゲームプログラミングする

この記事はRuby Game Developing Advent Calendar 2016 - Adventar の12日目です。11日目は土屋つかささんのrubyゲーム開発にユニットテスト/テスティングフレームワークを導入する(2)【実践編】 - 土屋つかさの技術ブログは今か無しかでした。Ruby...ゲ…

連鎖性言語を作る11

原因がまったく想像できない難解なバグに遭遇した場合、怪しいところから調べるのではなく、当たり前に大丈夫なはずのところから本当に大丈夫であることを確定していくほうが結果的に速く原因に辿り着けることがある。急がば回れという話だが、真剣におかし…

連鎖性言語を作る10

オレ言語のコードをRubyコードに変換してevalすれば、VMで実行するのと比べてディスパッチが無くなって速くなる。毎回evalするとRubyのコンパイルが発生してオーバーヘッドがあるので、evalでProcを生成して、実行時はそれを呼ぶだけ、という形にしておくの…

連鎖性言語を作る9

VMの命令列にコンパイルして実行するようになったのでなんとなくVMっぽい気がする感じになったところで、命令が2個しかないのは物足りない。これを増やすことを考えてみよう。オレ言語はスタック指向であり、スタックマシンのVMとは相性がよい。相性がよいと…

連鎖性言語を作る8

オレ言語の実装として、Rubyの配列にオブジェクトを詰めたものをASTとして扱っているのは特徴的だ。実際コード自身がオブジェクトを並べたような見た目をしているのでこれはこれで直感的とも言える。ところでVMはそのASTを解釈して実行しているわけなので、…

連鎖性言語を作る7

スタックエフェクトはForthではコメントだがFactorではコンパイル時にチェックされる記述になっている。コンパイルはワードの定義時ではなく実行時にされる。らしい。 例えば、 : aaa ( x -- x ) drop ;などと定義すると、これを呼び出すときに「effect-erro…

連鎖性言語を作る6

リテインスタックを作ろう。これは通常のデータスタックとは別のスタックで、一時保存用のものとなる。作るのは非常に簡単で、VMにインスタンス変数を追加して、データスタックとのやりとりをする>r、r>を追加する。 @retain_stack = [] :">r" => ->{@retain…

連鎖性言語を作る5

ループで悩んでいたのだが、とりあえずなるべく簡単に実装するということで、こんな感じにした。 :loop => ->{quot=@stack.pop;loop{self.run(quot);if @break_flg then @break_flg=false;break;end}}, :break => ->{@break_flg=true}, VMはこんな感じ。 def…

連鎖性言語を作る4

色々と調べていたらRubyでForthを作った人のブログ(Forthを作るのじゃ | TECHSCORE BLOG)があった。この記事では作っているのがForthなのでQuotationは無く、シンプルな作りによりParserも無いため、コロン定義は例のコンパイルモード/実行モード切り替え方…

連鎖性言語を作る3

現在のオレ言語の実装にはひとつ問題点がある。それは、数字のリテラルをRubyのオブジェクトに変換して保持し、計算はRubyのメソッドを呼んでいるところだ。それにより挙動がRubyの仕様に引きずられる。これは文字列についても同様であり、Rubyの文字列には+…

連鎖性言語を作る2

連鎖性言語というのは英語でConcatenative Languageと言って、要するに連結、繋げて書く言語のことである。ま、左から右に繋がっているので。対比される言葉は適用型言語(Applicative Language)。CとかRuby、関数型言語など、だいたいほとんどの言語は適用型…

連鎖性言語を作る

スタック指向言語、とか、連鎖性言語、などと呼ばれる言語がある。有名どころではForthやPostScriptあたりで、かなり古くから存在していて、最近ではFactorといった関数オブジェクトを扱える実用的なものまである。 基本的なコードの例としては、 1 2 + prin…

DXRuby1.4.5(´・ω(´・ω・`)

SEGVする不具合を修正してリリースした。 踏む人が現れると申し訳ないので修正後は急いでリリースしたほうがよいという知見が得られた(当たり前DXRuby最近なにもしてないのかと言うと、実際のところ他の何かをしているわけでもなくここんとこ全面的に何もし…

DXRuby1.4.4(´・ω・`)

RenderTargetバグの修正漏れによりWindow.resize時にコケることがある不具合が発生していたので修正してリリースした(´・ω・`) まだSEGVする現象が残っているようで、自分の目で見てはいるのだが再現性が低く調べようがないのでとりあえずはこれで様子見。も…

DXRuby1.4.3リリース中

とりあえずDXRuby1.4.3のgemだけリリース。パッケージ作るのいつも面倒だったので今回からはgemだけにしようかと考え中。 Ayameを同梱しようと思ったのだが、gemではどうもbinディレクトリにdllをコピーすることができないようなので挫折。やりかたわかる人…

コンポーネント指向

前からぼんやりと考えてはいたのだが、なんとなくこんな感じ?ってイメージがなんとなくできてきたような気がしたのでなんとなく作ってみた、という話。 コンポーネント指向というとオブジェクト指向とかそんな感じの雰囲気に思えるが、実際のところ定義はさ…

敗軍の将は兵を語らず

とかいうタイトルを付けつつ、別に将でもないので語りまくる。 dxsdl2r リポジトリはこちら。 描画系をOpenGLに書き換えた。理由はスケーリングや回転のSDL2の座標関連の扱いが気に入らなかったから。あと、3D描画を試したかったから。 ということで3D関連の…

物理エンジンを作る4

四角を回転させることにチャレンジしてみよう。回転した四角同士の衝突判定はDXRubyで普通に可能だが、衝突した反応を計算するためには、衝突点と作用線を求める必要がある。それがあれば先日の計算にそれらをぶち込むことで結果が計算できる、はずである。 …

物理エンジンを作る3

反発するようにしてみよう。前回のコードでは衝突した場合に作用法線方向の速度を0にするだけだったのでピタっと止まっていたが、反発させると弾むような動きを作ることができる。衝突後に回転させたりするのも、円と四角が衝突した場合に自然に反応するのも…

物理エンジンを作る2

前回は中身のほぼ無いコードだった。今回はこれにちょっとだけ追加しよう。いきなり難しい計算などは無理ゲーなので、とりあえずは回転しない四角を動かすところから。 ComplexVector 速度の表現をComplexでやるのはよいのだが、2Dの力学計算は基本的にVecto…

物理エンジンを作る

今年最初の記事はまたオモムキを変えて、DXRuby用2D物理エンジン(モドキ)を作ってみよう。 物理エンジンとは Box2DやChipmunkのような、物体の衝突をなんとなくそれっぽく計算してくれるライブラリである。基本的には剛体(変形しない物体)を扱い、物理エンジン…

1年まとめ

はてなダイアリーの記事一覧は1ページに50日分。そこから数えると今年は53個の記事を書いたらしい。俺は1日に多くても1個しか記事を上げないから、平均すると1週間に1個のペースで記事を書いたということだ。ムラはあるけど。 ということで今年のまとめ。 ・…

名前空間にやさしいRefinementsの使い方

Ruby2.1にはRefinementsが正式に導入された。ネットで検索すると色々出てくるが、特に衝撃的な便利さということもなく、知ってるけど使ったことは無い、みたいな人も多そうである。ぶっちゃけ、どんなときに使うの?って聞かれると答えにくい。 そうだなー。…

ComplexSpriteと相対表現

ACの記事で複素数ネタを書いたが、そこにオマケとして計算を保持するクラスをつけておいた。これを使って階層Spriteを作ってみた。 https://gist.github.com/mirichi/2b25b0a58e93bf780df6 昔作ったEntityクラスの焼き直しで、あっちは行列を使っていたのだ…

パーリンノイズ

ゲームやCGなどでよく使われる技術の一つにパーリンノイズというものがある。 地形などを生成する場合に単純にランダムにすると変になるけども、パーリンノイズは勾配を生成して補間してくれるのでなめらかに変化するランダム地形が作れる。地形だけじゃなく…

複素数を扱う

DXRuby Advent Calendar 2015の20日目の記事です。 19日目はあおいたくさんの[Ruby][DXRuby] ピザ焼けなかったので野良メイドを拾って育てるゲーム作りました - あおたくノートでした。「野メイド」はGUIフレームワークSpriteUIを使ったテキストSLGというこ…

mrubyのVMにバーストMOVEを実装する

ふと思いついたので久しぶりにmrubyのVMをいじる。久しぶりすぎてcodegenが分離したことを知らなくてしばらく探し回った。 VMというものの実装ではVM命令のディスパッチの負荷がどこまでもついてまわることになるが、これを0にするにはコードをCなどに変換し…

パフォーマンスの測定など

SDL2を使った互換インターフェイスなどを構築してみたので、現時点の実装で動作するベンチマークとして、DXRubyサンプルのsprite_simple.rbを動かしてパフォーマンスを測定してみた。 60fpsで動作する最大のオブジェクト数を適当に手で調べた結果である。う…

sdl2rでゲームライブラリを作る(10)

Spriteクラスを作ろう。 DXRubyのクラス群の中では唯一、DirectXを直接叩かないのがSpriteである。描画に必要な情報をまとめ、DXRubyの描画機能を呼び出すことで間接的にDirectXにアクセスする。なので作ろうと思えば他のライブラリでも同様のものは作れるだ…

ブロックのはなし

RubyのProcやlambdaについての記事は検索するとよく出てくるが、ブロックはなぜかいまいちスポットライトが当たらない。あってもProcの説明のオマケみたいな感じが関の山。 この記事ではそんな不遇なブロックについて焦点を当ててみたい。 ブロックとは何か …