タグ

ブックマーク / mirichi.hatenadiary.org (29)

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

    この記事はRuby Game Developing Advent Calendar 2016 - Adventar の12日目です。11日目は土屋つかささんのrubyゲーム開発にユニットテスト/テスティングフレームワークを導入する(2)【実践編】 - 土屋つかさの技術ブログは今か無しかでした。Ruby...ゲーム...ユニットテスト...うっ、頭が... まあ、ゲーム関連でのユニットテストは難しい問題で、スピーカから出てくる音をマイクで拾って判定するわけにもいかないので、とりあえず全ての機能をテストすることができないのは明らかである。っていうかそもそも外部機器を扱わない部分を考えても、例えばDXRubyのSpriteで言うところのSprite#x=で設定した値がSprite#xで取得できることはテストできても、それがSprite#yで取得する値に影響を与えていないこと、などをテストし始める

    Rubyの標準添付ライブラリFiddleでゲームプログラミングする - mirichiの日記
  • DLとWin32APIとFiddle - mirichiの日記

    Rubyには外部のライブラリの呼び出しインターフェイスとしてDLというライブラリが添付されているが、Ruby2.0になってそれは廃止予定になってFiddleが追加された。他にWindows用にはWin32APIもある。このへんをまとめる。 ■Ruby1.8時代 Win32APIが独自実装で存在していた。ダイナミックリンクライブラリのインターフェイスとしてDLがあった。標準で添付されていないがDL2があった。 ■Ruby1.9時代 DLが廃止され、DL2がDLという名前で標準添付になる。互換性は無い。Win32APIは新しいDLを使うラッパライブラリとして書き直されたが、廃止予定になり代わりにDLを直接使えという警告が出る。DLの一部機能を実現するために内部的にFiddleが組み込まれる。 ■Ruby2.0時代 DLの機能はFiddleにマージされ、DLが廃止予定となる。DLをrequire

    DLとWin32APIとFiddle - mirichiの日記
  • Ayame - mirichiの日記

    Seleneの作者が前身Luna用に作ったサウンドドライバAyameを、Rubyから呼べるようにしてみよう、ということで作ったAyame/Ruby。 圧縮/無圧縮wav、ogg、mp3を再生することができる。 http://dxruby.sourceforge.jp/files/ayameruby001-mswin32-ruby18.zip http://dxruby.sourceforge.jp/files/ayameruby001-mswin32-ruby19.zip C++用のDLLだから、CPPでコードを書いた。ほとんど動くかどうかの実験レベルなので、とりあえず再生できます、程度。 Bassのように有料ソフトを作ってもライセンス料はかからず、Voxのように機能が足りないということもない感じ。なかなか良好。 ソースも公開されててフリーなので、DXRubyに組み込む方向で検討してみよう

    Ayame - mirichiの日記
  • SDL_imageとmrubyを使ってみた - mirichiの日記

    なんでもSDL_imageというやつを使わないとPNGとかJPEGは扱えないらしい。bmpだけというわけにもいかないのでそれをインストールしようとまたも試行錯誤。 まずSDL_Imageのソースをゲット。 http://www.libsdl.org/projects/SDL_image/ configureしたらなんかlibpngとかjpegとかがないと言う警告らしきものが表示された。そのへんのライブラリを先にインストールしておかないとビルドしても使えないようだ。 このへんからソースを落とす。 http://www.libpng.org/pub/png/libpng.html http://www.ijg.org/ libpngはzipファイルをダウンしたらconfigureできなかったので、tar.gzのほうをダウンしなおす。んでconfigureしたら今度はzlibが無いといってエラー

    SDL_imageとmrubyを使ってみた - mirichiの日記
  • SDL2の使い方 - mirichiの日記

    SDL2は日語の情報があんまりなくて、SDL2そのままの使い勝手でRubyから使えますというライブラリを作っても、使える人は限られるのではないかと言うことで、基的なことを書いておくことにした。とりあえずはおおまかな概念だけ。 関数の一覧および使い方はSDL2.0日語リファレンスマニュアルを参照するとよい。あとはSDL2のソースとか。 SDL2の基オブジェクト SDL2の関数を呼び出して生成するSDLオブジェクトには、だいたい ・SDL_Window ・SDL_Surface ・SDL_Renderer ・SDL_Texture といったものがある。これらはSDL2の生成関数を呼び出したら返ってくるし、関数に引数として渡して使ったりもする。OSやGPUのリソースを管理するものである。他、SDL_Mixerを使えばMix_ChunkやMix_Music、SDL_ttfではTTF_Fon

    SDL2の使い方 - mirichiの日記
  • RayMarching - mirichiの日記

    前から気になってたんだけどようやくできた。 レイマーチングはレイトレーシングの一種で、ポリゴンを使わない3D描画である。コードはこちら。CustomRenderTargetは使っておらず、通常のShaderで描画している。 レイマーチングの仕掛け まあ、難しい話は適当に検索してくれれば出てくるとは思うが、例えばシェーダだけで世界を創る!three.jsによるレイマーチングなどを見てもらうと丁寧に説明されている。 最も簡単な例としては、球体を(0,0,0)を中心に配置して、カメラ(レイの初期位置)からの距離を算出して、半径を引くと、カメラから物体表面までの距離になる。この距離のぶんだけレイを前に進める。レイの向きが球体の中心ぴったりだとこれで表面まで到達して距離0になるが、ちょっとでもズレていると表面に届かないことになるので、それを何度か繰り返すことによって、限りなく表面に近い位置まで進める

    RayMarching - mirichiの日記
  • CustomRenderTargetその5 - mirichiの日記

    今回はサンプルのmaptest.rbの話。名前がひどい気味なのはいつもの話なので気にしない。でもさすがにそのうち変えるかも。それはそれとして、動かすとこのような画面が出る。 ちなみに壁との衝突判定は面倒なのでやっていない。外側に出てどこまでも行ける。 迷路情報 classic_sampleのmeiro.rbと同じマップを使っている。これを元に3Dのワールド座標系の座標を作って頂点バッファに詰め込む感じである。迷路の頂点は通路上にいる場合に見える向きのポリゴンだけ設定していて、これを1つの頂点バッファに入れているので、描画は1回となる。この方式は簡単だが、視界に入らない頂点も頂点シェーダに投入されるので、頂点数が多い(世界が広いとか壁などの頂点数が多いとか)の場合に頂点シェーダの負荷が増える。マップをある程度のサイズで区切って視界に入りうる範囲だけを描画するとかすると軽くなる。 ワールド座標

    CustomRenderTargetその5 - mirichiの日記
  • CustomRenderTargetその4 - mirichiの日記

    初歩的な3Dサンプルということで追加したspheretest.rbだが、実行するとこんな画面が出る。マウスの方向にライトの光源があるっぽい感じにライティング処理が入っている。 今回はこれの話。つってもだらだら書くだけなのでこのへんの記事で3Dが理解できるかというと怪しい。こういう要素があって、こういうことができて、だいたいこんな感じ、みたいなのが把握できればよい、かな。詳しい話はそういうのをきちんと解説する記事がWebにはたくさんあるのでそちらで勉強していただく感じで。 光の表現 球体を作る方法については適当すぎるのでコード見てもらうかその手のサイトを見てもらうとして、ポリゴンで構成された物体に対して光を当てる話。 太陽のような遠い光源から発せられる光は、だいたいどの場所においても平行だと捉えることができる。これを利用して、光の向きを1個の3次元ベクトルで表現し、後はポリゴンの面との内積を

    CustomRenderTargetその4 - mirichiの日記
  • CustomRenderTargetその3 - mirichiの日記

    DXRuby1.5.22devをWiki(避難所)に置いておいた。しょぼいバグの修正とset_viewportのデフォルト設定追加のみ。あとサンプルの整理。 格的な3Dにはあんまり興味がないというか難しすぎて付いていけないのだが、初歩的な3Dぐらいはそれなりにやってみたい。ということで球体の描画や3D迷路を追加しておいた。 今回はそれらサンプルの中で最も簡単な立方体のやつについて。 おおまかな構成 クラスは3Dのオブジェクトを表すMaterialと、CustomRenderTargetを継承したRenderTarget3Dとなる。3Dのデータは基的には頂点の集合体なので頂点バッファを持つが、それをどのように描画するのかというロジックも物体ごとに異なるのでシェーダも一緒に持つことが多い。のでMaterialクラスはそのようになっている。更に1つの物体が複数の部品で構成されてシェーダも違う

    CustomRenderTargetその3 - mirichiの日記
  • CustomRenderTargetその2 - mirichiの日記

    ここで3Dの計算の詳細(ビューやプロジェクション変換行列の中身の計算とか)について説明するのは何か違うような気がするのでそういうのは省略するとして。って説明できるほど詳しくもない。数学苦手だし。 そうは言ってもDirect3Dはそのような行列を駆使して頂点変換し、その流れでロジックを構成するようになっているので、中身はさておき計算の概要は知っておかないと何もできない。 今回はそういう話。 頂点変換の流れ 前回のコードでは完全に省略したが、3Dを扱う場合はワールド変換→ビュー変換→プロジェクション変換→ビューポート変換、という感じで座標を変換して描画する。古来よりポリゴンを描画する3Dの計算はそのようになっていて、それなりに意味があり有用な手法であるのでDirect3D及びGPUはその手法を踏襲している。OpenGLでも同様。 ワールド変換 OpenGLだとモデル変換?ともあれ、通常は頂点バ

    CustomRenderTargetその2 - mirichiの日記
  • DXRuby1.5.21dev - mirichiの日記

    久しぶりの開発版リリース。DXRuby1.5.21devをWiki(避難所)に置いておいた。なんか20が飛んだような気がしないでもないがまあ数字に意味は無いので気にしない。 今回はCustomRenderTargetクラスとVertexBufferクラスを追加した。これらは今までよりも低レベルなインターフェイスで描画ロジックを記述することができる仕組みで、応用すると3D描画もできる。開発版なのでいろいろと荒いところがあったり、今後いきなり変わったりすることもあるんじゃないかと思うが、なんとなく動いているし新しいものなので興味ある人にどぞ〜って感じで。個人的には割と気に入っているのでいつぞやの3D機能のように無くなることはないんじゃないかなと思っている。 CustomRenderTargetとVertexBuffer いちおうリファレンスには書いてみたのだが、これの説明はなかなか難しい。ぶっ

    DXRuby1.5.21dev - mirichiの日記
  • CustomRenderTarget - mirichiの日記

    では新機能について説明。 CustomRenderTarget リファレンスにも書いてあるけども。RenderTargetを継承して作られている。現在はまだ残っているがdraw系メソッドは呼び出しても何も起こらない。消す予定。ユーザはCustomRenderTargetを継承してcustom_renderメソッドを自分で実装して使う。custom_renderに渡される引数は低レベルインターフェイスモジュールで、こいつを経由して低レベルの描画機能を呼び出す。 VertexBuffer 頂点バッファ。頂点のフォーマットをnewに渡して生成する。頂点情報の値は配列にrubyオブジェクトでIntegerやFloatを詰めてVertexBuffer#vertices=に渡す。こいつをcustom_render内で使う。 ということで以下もうちょい具体的な話。 サンプル 1.5.21devのサンプル

    CustomRenderTarget - mirichiの日記
  • ラスタライザを作る - mirichiの日記

    もう年末なのだが、ちょっと前に作ってみたラスタライザの話。といってもすごいしょぼいもので、とりあえず太さを指定した直線をDXRubyのImageに描画するというもの。 ようするに三角形2個で四角を描いているだけなのだが、それだったらImageのメソッドでできるんじゃね?って感じで、じゃあなんでこれを作ったのかというと、NanoVGみたいなベクタグラフィックスを作ってみたくて、グラデーションとかやるのに自前で描画する必要があって、とりあえず初期型という状態、なわけだ。 まあ、Rubyでベクタグラフィックス作ってなんかいいことあるのかっつーとよくわからんのだけども、そもそも趣味が作ってみたいものを作る、というものなわけで、作ってみた結果についてはどうでもいいのである。 ちなみにこのコードのキモはエッジファンクションというやつで、ラスタライザの基となる古典的な判定計算である。高速化は色々とでき

    ラスタライザを作る - mirichiの日記
  • Opal:Ruby to Javascript Compiler - mirichiの日記

    RubyのコードをJavaScriptに変換するOpalというソフトウェアがある。Opal自身はRubyで書かれていて、gemでインストールできる。これを使ってRubyコードをJavaScriptに変換してWebサイトにアップロードすると、手元でRubyで書いたコードがブラウザ上で動作してしまう、という話である。 Opalはすでにかなり開発が進んでいて、組み込みライブラリや標準ライブラリが実装されている。RailsやSinatraとの連携、jQueryのバインダなどもあり、Opal用ゲームライブラリまである。 逆に欠点はと言うと、変換する都合で直接JavaScriptを書くよりも遅いとか、文字列の破壊的変更ができないとか、そんな感じ。文字列の破壊的変更はそもそもあんまりやらないので基的には違和感はあまり無い。 opal-parser.js OpalはRubyで書かれたソフトウェアなので、

    Opal:Ruby to Javascript Compiler - mirichiの日記
  • 四角形の自由変形を考える - mirichiの日記

    前にやろうとして挫折したものだが。 http://d.hatena.ne.jp/mirichi/20090927/p1 まずはおさらいから。 なぜ三角形のポリゴンで四角形の自由変形ができないのかというと、自由変形された四角形の全てのピクセルが、4点の位置関係によって補正されるから、だ。 DirectXは三角形ポリゴンを組み合わせることで画面を作る。四角形の自由変形をするには、描画しようとする三角形はそれ以外のもう一つの点によって影響を受ける必要がある。 とりあえずDirectXにはその機能が無い。 今回はアルゴリズムから考えようということで、ソフトウェア処理で自由変形を実現する方向性で行ってみる。 たとえばこのようなコードを書く。 #! ruby -Ks require 'dxruby' Window.width = 320 Window.height = 240 Vertex = Str

    四角形の自由変形を考える - mirichiの日記
  • ブロックのはなし - mirichiの日記

    RubyのProcやlambdaについての記事は検索するとよく出てくるが、ブロックはなぜかいまいちスポットライトが当たらない。あってもProcの説明のオマケみたいな感じが関の山。 この記事ではそんな不遇なブロックについて焦点を当ててみたい。 ブロックとは何か まずはここの認識を合わせておこう。Rubyの構文において、メソッド呼び出しの後ろにくっつくことがあるdo〜end、もしくは{〜}の間にあるコードの塊をブロックと呼ぶ。 すべてがオブジェクトであるRubyでも、言語の文法を構成する要素はオブジェクトではない。例えばifとか、代入式の=や、変数などはオブジェクトではない。当たり前といえば当たり前なのだが、同様に、文法を構成する要素であるブロックはオブジェクトではない。 Procオブジェクトと一緒に「似たようなもの」と説明されると地味に理解しづらいのだが、ProcはRubyの文法とは何の関係

    ブロックのはなし - mirichiの日記
  • webMAGURO - mirichiの日記

    Opalがなかなか面白いのでDXRuby互換インターフェイスを少し進めて、Fontクラス追加とちょこっとメソッド追加を行った。ついでにタッチインターフェイスも微妙に対応。 いまんところ試作レベルにも達していないので名前をつけるほどでもないのだが、とりあえずDXRuby/Opalとでも呼んでおこうか。 MAGURO対応 2013年のDXRubyAdventCalenderの土井ヴぃ(@vivit_jc)さんの記事でMAGUROというゲームが公開されていて、DXRuby的にはシンプルな作りだったのでこれぐらいなら動くのではないかということで、今回の修正のターゲットはMAGUROの動作である。 記事はこちら。http://vivit-jc.hatenablog.com/entry/2013/12/10/235354 ソースはこちら。https://github.com/vivit-jc/magu

    webMAGURO - mirichiの日記
  • DXRubyコンパイル - mirichiの日記

    いや、とんでもなく時間がかかった。苦労した。 俺が間違っていただけなのだが、わかっている人には簡単なことでも、わかってない人には無理難題だ。 そして、わかるようになる方法がよくわからない。 試行錯誤して悩む経験が必要ということなのか。 俺はこういうのを「敷居が高い」と表現する。 わかってない初心者が変な質問をしてきたりするのは面倒だ。確かに。 んでも、オープンソース関連のプロジェクトってのは、わかってる人の集団で構成されていて、ある一定水準以上じゃないと仲間に入れません、という態度なのがどうにも。 間が無いんだな。先端を行く人と、これから始める人の。 洗練されればされるほど、先端はずーっと先に行くし、これから始める人は常に地べたスタートなのだから、その距離は開く一方だ。 こういった部分にどう対処していくか、ってのは難しい問題だ。 さて、今日はDXRubyを配布用にコンパイルした。 誰かの参

    DXRubyコンパイル - mirichiの日記
  • Ruby2.0.0-mswin32版のDXRuby1.4.0 - mirichiの日記

    作ってみたのでWikiに置いといた。 http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D5%A5%A1%A5%A4%A5%EB%C3%D6%A4%AD%BE%EC Rubyのmswin32版というのはVCでビルドしたRubyのうちmsvcrt.dllをリンクするバージョンであり、これを作るにはVC6.0が必要である。なので来であればVC6.0でビルドされたRuby2.0を用意して、同様にVC6.0で拡張ライブラリをビルドするという手順になる。 また、mingw32版はmsvcrt.dllをリンクするがmingw32を使ってビルドしたもので、VC6.0で作ったバイナリと互換性がある。だからmswin32版の拡張ライブラリがそのままmingw32版のRubyで使える。 現状VC6.0など手に入らないが、Ruby1.9.2まではVC6.0でビ

    Ruby2.0.0-mswin32版のDXRuby1.4.0 - mirichiの日記
  • DirectSoundとRubyのプログラミング - mirichiの日記

    サウンドAPIは色々あるが、バッファをロックして書き込んで再生すれば音が出るという部分についてはどれも大きな違いは無い。WindowsVista以降ならWASAPIというオーディオAPIがあり、色んな機能があって優秀なのだが、このへんのOS上ではDirectSoundはWASAPIをラップしたDirectSoundエミュレータという形で実装されているので簡単なものならDirectSoundを使っても問題は無い。むしろWineでどこまでWASAPIが実装されているのかがよくわからないのでDirectSound使っておいたほうが心配事が減る。 今回はDirectSoundを使って音を出すRubyの拡張ライブラリを作ってみようという企画である。 途中まで書いて疲れてきたので途切れているが、せっかく書いたのでアップしておく。 とりあえず作る こんな感じに最低限の部分を作る。soundtest.cと

    DirectSoundとRubyのプログラミング - mirichiの日記