2010-01-01から1年間の記事一覧

ソースを隠蔽する手段

コンパイルして実行形式にしてしまう言語であれば、公開する人の意思でソースを出すかどうかを決めることができる。 その場合、ソースを出すのは一手間かかるため、どっちかというと公開したいという思いが無ければされない。 Rubyのようなスクリプト言語の…

evalとシンボル

Ruby用ゲームライブラリのMiyakoの2.1.9がリリースされて、なんだか2.1系も熟成されてきたなあーという感じ。 ところでMyakoの公式サポート掲示板がしばらく前にできている。 http://cyross.bbs.fc2.com/ テトリス作ってる人がいて、なんだか楽しそう。 我が…

メタプログラミングの基本とか

Rubyはメタプログラミングができる言語だ。 高度なことをしようと思うと特異クラスなどの詳細を知る必要が出てくるが、そういうことをそれなりに知っている人でなければ、特異メソッドぐらいは理解できても特異クラスが出てきた時点でよくわからなくなってし…

ハッシュ引数

Rubyではメソッドの引数の最後がハッシュの場合、{}を省略することができる。 これをキーワード引数のように使うことで、柔軟なメソッドを作れるようになっている。 DXRubyでも、Window.drawExはハッシュを引数にすることで各種効果を自由に取捨選択してつけ…

ライセンスのお話。

Twitterでライセンスの話を呟いていたら、zlib/libpngライセンスをお勧めされた。 http://sourceforge.jp/projects/opensource/wiki/licenses/zlib_libpng_license DXRubyがなぜMITライセンスなのかというと、できるだけ緩いライセンスにしておきたかったか…

ライティング

とりあえずできたけど、理屈通りに動いていない。 何かが間違っているのだとは思うが、それが解決するまでリリースはできないなあ。 ライティングはそれなりに複雑で、これをどのように提供するのかは悩むところ。

HTTP 418 I'm a teapot.

プリセットのメッシュのひとつ、ティーポットを作るメソッドを追加してみた。 require 'dxruby' mesh = Mesh.createTeapot Window.loop do Window.drawMesh([100,100,-1000],[150,0,0],[200,200,200],mesh) end なぜ真っ白なのかと言うと、DXRuby1.1はまだラ…

なんで?

ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]にて。 class Object TEST1 = 1 p ancestors # => [Object, Kernel, BasicObject] end module Kernel TEST2 = 2 p ancestors # => [Kernel] end p Object.const_get("TEST1") # => 1 p Kernel.con…

ウィンドウメッセージを処理する

Windowsのいろいろな機能を使うために、ウィンドウメッセージを処理しなければならない場合がある。 たとえばIMEでの文字入力。 IMEの起動はAPIでできるが、入力した文字の受け取りはメッセージで届くので、それを受け取らなければならない。 文字列ならバッ…

Ayame

Seleneの作者が前身Luna用に作ったサウンドドライバAyameを、Rubyから呼べるようにしてみよう、ということで作ったAyame/Ruby。 圧縮/無圧縮wav、ogg、mp3を再生することができる。 http://dxruby.sourceforge.jp/files/ayameruby001-mswin32-ruby18.zip htt…

微妙なコマンドDSL

夜勤だったのだが暇すぎてボケーっとしている間に思いついたもの。 class Sprite @@command_hash = {} def self.define_command(name, &block) @@command_hash[name] = @@command_temp = [] mod = Module.new def mod.method_missing(m, *arg) @@command_tem…

DXRuby1.0.8リリース

せっかくなのでブログにも書いておこう。 各種不具合修正と微妙な機能強化をしたDXRuby1.0.8をリリースしてきた。 http://dxruby.sourceforge.jp/ あ、まだWebなおしてなかった。 今回は細かいことをいろいろと修正したマイナーバージョンアップ的感じ。 末…

バイオリズム

なんか気分が乗らないなーと思ってバイオリズムを調べたりしていた。 ついでに計算&表示するプログラムを作った。 点で描画しているから縮小したらかなり暗い。 require 'dxruby' require 'date' birthday = Date.new(2010, 1, 1) # ここに誕生日を入れる s…

Rubyとゲームとその方向性など

とりあえず、DXRubyのダウンロード数は地味に地味に増えている。一日平均すると5つぐらい? http://sourceforge.jp/projects/dxruby/devel/ ActiveScriptRubyに同梱されいて、最新のものならDXRubyも最新の1.0.7となっているから、古いのを使ってる人か、別…

mingw版のRuby1.9.1

いやはや、参りました。 約50%の負荷で約1000オブジェクト、Rubyのコードだけで動くようになってしまった。 何をしたかと言うと、いままでmswin32版のRuby1.9.1を使っていたのを、mingw32版に換えただけ。 正確には ruby 1.9.1p376 (2009-12-07 revision 260…

コマンドDSLの拡張

コマンド列を作ってキャラを動かそうとしているわけだが、これを配列として定義することの欠点の一つは「後方参照ができない」である。 Rubyではすべてが実行されるコードであるため、変数は格納する前に参照することができない。変数はオブジェクトの参照で…

Rubyのクロージャとforとeachと1.8と1.9

Rubyにはクロージャと言うものがある。 ようするに手続きオブジェクトで、Proc.newなどで作ることができる。 こいつのポイントは、それが作られた環境(ローカル変数とか)のスコープと値を保持するところだ。環境を閉じ込めるからクロージャという。らしい…

コマンドDSLの定義

RubyはDSL(DomainSpecificLanguege)に向いた言語だと言われる。 DSLってのは特定用途に特化した仕様のミニ言語で、何かを定義する専用にちょっとした宣言・定義文を作ってそれで書けば確かにやりやすい。 そういうミニ言語をRubyのプログラム内に埋め込もう…

ふりこ

見た目にしょぼいサンプルを乱発しております。 ワイヤーアクションを作ろうと思ったら、なにはともあれ振り子の動きが必要だ。 require 'dxruby' # ワイヤーの情報 wx = 320 wy = 0 length = 220 line_image = Image.new(1, 1, [255,255,255]) # 自キャラ x…

Fiberを利用してみる

そんなことを考える人は当然のように既にいるわけだが。 yhara氏のサイトroute477より。 http://route477.net/d/?date=20080210#p01 FiberはRuby1.9で追加されたクラスで、一般的にはコルーチンと呼ばれる。ゲーム関係ではマイクロスレッド。 これを使うと、…

DXRubyExtensionの簡単な使い方の例

見た目が賑やかで複雑なサンプルよりも、こういうもののほうがよかったかもしれない。 require 'dxruby' require 'dxrubyex' class Toufu attr_reader :collision, :x, :y @@image = Image.new(50,50,[255,255,255]) def initialize @x = rand(590) @y = ran…

弾幕生成機能

必要な機能に絞って、BulletGeneratorとSpriteに分離させた。 とりあえずライブラリ側のコードをのっけると長すぎだから、ここではそれを利用するコードだけとしておく。だからそのままでは動かない。 調子に乗って弾を多くしすぎたのでちょっと重くなった。…

GC負荷を制御する

ちょっと試したら意外に効果が得られたので書いておく。 Rubyにおいて、特に一定時間内に処理を行う必要のあるアクションゲームなどを作る場合には、GCの処理で一瞬止まるのが大きな問題となる。 GCの対策として打てる手は3つ。 (a) 毎フレームGCを動かす (b…

コマンド呼び出しコマンド

このあいだのやつに:call_commandを追加してみた。 回数指定で別のコマンド列を呼び出すことができる。 コマンド列が終わったら元の場所に戻る必要があるし、無制限にネストができるようにもしたかったから、@stackを追加した。 class Sprite attr_accessor …

キャラ移動の仕組み

久しぶりに更新。 何かやっていたかというと、Ruby1.9.1のVMを調べたり、そんな感じ。 別にそれで何かすごいことを発表しようというわけではなく、前から考えていたキャラ移動をコマンド列でラクに作ろうという試みのプロトタイプができたかなー、という話。…

シェーダで画像のくりぬき

今日のんはDXRuy1.1.12dev対応。 画像をクリヌキするシェーダを書いてみた。 DXRuby1.0の機能でどうにかならんかと思って考えていたのだが、手が思いつかなかった。 背景が黒で、黒く抜くだけなら、黒い絵に透明色の円を描いて重ねればいいが、やりたいこと…

レーザーの判定とか

DXRuby公式サイトの掲示板に久しぶりに書き込みがあった。 内容は高速で移動する物体の衝突判定、ということだったのだが、簡単なゲームで扱うのはだいたい遅い物体と速い物体の衝突だろうということで、そのような回答になった。 これがもし、高速で移動す…

衝突判定と拡張ライブラリ

2Dのシンプルなアクションゲームを作る場合、衝突判定は円と円、もしくは矩形と矩形で判定することになる。 そのような簡単な判定でも、すべてのオブジェクト同士が衝突する可能性があるものを総当りで検出していると、たかだか50個ぐらいのオブジェクトを動…

DXRuby1.0.8を考える

DXRuby1.0.7をリリースしたのが11月。 そこから出た不具合も、言うほど致命的なものがなかったので放置してきたが、いい加減たまってきたのと、1.1系の修正も面倒なのとか難しいのとかが残ってきたので気分転換に1.0.8を考える。 まったくもっていい加減。ロ…

3D機能で2D描画をする話

DirectX9には2D描画機能が無い。描画はすべて3Dだ。 一応D3DXSpriteが用意されていて、これは内部で3D処理をやっているが、インターフェイスは2D描画として扱える。でもちょっと遅い。もっと高速な2D描画が必要なら、3D機能を使って2D描画することになる。 3…