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

wingui.rbに機能追加した

winguiRuby改め、wingui.rb。 ちょっとした思い付きで、ウィンドウを新規作成するだけではなく、ウィンドウハンドルを渡してサブクラス化する機能を追加してみた。 これが思った以上にうまく動き、予想外に面白い効果を得ることができた。 具体的には以下の…

メモリマップドファイルとWindowsのイベント

前にメモリマップドファイルの話を書いたときに作ったものを、参考になる人もいるかもしれないからアップしとく。 Ruby/DLを使ってメモリマップドファイルを作成し、WindowsのEventで同期を取るプロセス分散処理。Ruby1.8専用。 http://dxruby.sourceforge.j…

RGSS2を知る(28)

Rectクラスの===。 p Rect.new(100,100,100,100) == Rect.new(100,100,100,100) # => true p Rect.new(101,101,100,100) == Rect.new(100,100,100,100) # => false p Rect.new(101,101,98,98) === Rect.new(100,100,100,100) # => false p Rect.new(100,100,…

RGSS2を知る(29)

TableクラスのMarshal。 t = Table.new(2,3,4) c = 1 for i in 0..1 for j in 0..2 for k in 0..3 t[i,j,k] = c c += 1 end end end open("c:\\test.txt","w+b") do |fh| fh.write(Marshal.dump(t)) end 結果はこんなかんじ。 04 08 75 3A 0A 54 61 62 6C 65…

DXRubyの今後とか

いまはとりあえずFreeRGSSをがんばっている。 でもDXRubyに飽きたとかそういうわけではない。 しいて言うなら、FreeRGSSは市販のライブラリに対して自分がどこまでやれるのか直接的に比較できる材料であり、Direct3Dで実装するという技術的なチャレンジであ…

winguirubyとFreeRGSS

WindowsアプリをRubyで作るためのライブラリ、winguiruby(仮名)。 またもや置き場所が無いので間借り状態。こういうの、どうしたらいいのかな。まあ、そのうち消すかもしれない。 http://dxruby.sourceforge.jp/files/winguiRuby.zip Ruby1.8のDLを使って…

RGSS2を知る(25)

ピンポイントに調べた。 class Bitmap def initialize(*) end end b = Bitmap.new(200,100) b.clear このコードはBitmapのinitializeを無効にする。 通常、Cで書く拡張ライブラリでは、newしたときにCのallocate関数でオブジェクトメモリを確保し、Rubyのini…

RGSS2を知る(26)

色の合成にリベンジ。 少し色のパターンを変えてみた。 b1 = Bitmap.new(100,100) b1.fill_rect(b1.rect, Color.new(50,150,255,100)) b2 = Bitmap.new(100,100) b2.fill_rect(b2.rect, Color.new(255,150,50,200)) b = Bitmap.new(640,480) b.blt(0, 0, b1,…

RGSS2を知る(27)

マーシャル関連。とりあえずColorを。 open("c:\\test.txt","w") do |fh| fh.write(Marshal.dump(Color.new(1,2,3,4))) end 04 08 75 3A 0D 0A 43 6F 6C 6F 72 25 00 00 00 00 00 00 F0 3F 00 00 00 00 00 00 00 40 00 00 00 00 00 00 08 40 00 00 00 00 00 …

RGSS2を知る(24)

微妙な話だが、freezeとdup/cloneについて。 b = Bitmap.new(100,100) p b.frozen? # => false b.freeze p b.frozen? # => true b.set_pixel(1,1,Color.new(100,1001,00)) b = b.clone p b.frozen? # => true b = b.dup p b.frozen? # => false s = Sprite.n…

FreeRGSS0.0.1とりあえず公開してみる

DXRubyで培った技術を駆使して、RGSS2のオープンソース実装「FreeRGSS」を作ってみている。 ようするにRGSSをCで再実装しているわけだ。 あちこち非互換や未実装があるが(音でないとか)、そこそこ動くようになったのと、難しいとこばっかり残ってしまってこ…

FreeRGSSについていろいろ

似たよーなライブラリ2つも作ってどーするねん。 という声が聞こえてきそうであり、俺自身もよく思う。 それだからこそFreeRGSSは互換性を確保することを目指し、同じ動作をするところまで行けたら完了となるプロジェクトとしている。 自分で機能を拡張すれ…

Win32APIとUnicode

文字コードとか勉強していたらいつのまにかWindowsのUnicode対応などに首を突っ込んでしまったのでまとめ。 Windowsは内部的にはUnicodeを使っている、とどっかで見たきがする。 VisualC++でソースの文字コードにUnicodeを使っても正常にコンパイルできるし…

Ruby1.9.1と文字列エンコード再び

DXRubyのエンコード関連を改善したいと思い、いろいろ勉強しているのでとりあえずまとめ。 Ruby1.8系では、文字列はバイナリであり、エンコードを持たない。 ファイルなどから読み込んだ文字列がなんのエンコードなのかもわからないから、ライブラリを使って…

RGSS2を知る(23)

Bitmapクラスのbltメソッドについて。 b1 = Bitmap.new(300,300) b1.fill_rect(b1.rect, Color.new(255,0,0)) b2 = Bitmap.new(300,300) b2.fill_rect(b2.rect, Color.new(0,0,255)) b = Bitmap.new(640,480) b.blt(0, 0, b1, b1.rect) b.blt(100, 100, b2, …

RGSS2を知る(22)

Windowクラスの描画系は非常に複雑だ。 いろいろと調べたがあまりにも面倒なので簡単にまとめる。 ・contentsはカーソルより手前に描画される。contentsを不透明な画像にするとカーソルが見えなくなる。 ・back_opacityは背景のみで枠には影響せず、opacity…

3D座標変換

自分用メモ。3Dの座標変換はワールド変換→ビュー変換→射影変換→ビューポート変換の順でおこなう。 ワールド変換:オブジェクトデータの頂点群を、ワールド内の姿勢にあわせて回転し、ワールド内の位置に移動させる。 ビュー変換:カメラから見た風景になるよ…

RGSS2を知る(20)

20回目になった。 おおまかな所はわかってきた気がするが、細かいところに謎が多すぎる。 ソースが無いのでしょうがない。 RGSSはソフトウェアで描画しているような気はしているのだが、ソフト描画で高速に行うのが難しいのは拡大・縮小・回転。 とりあえず…

RGSS2を知る(21)

次はTableクラス。 Cで書いた拡張ライブラリからアクセスするぶんには、Arrayの内部構造でも別に遅くはないが、Rubyから3次元配列にアクセスしようとすると、1アクセスごとにメソッド呼び出しが3回となって、さすがにちょっとしょんぼりだ。 Arrayの[]を再定…

RGSS2を知る(18)

今回はInputモジュール。 Input.dir4とかdir8とか、なんとなくわかりやすいようなメソッドが用意されているが、たとえばdir8を使って8方向に動く処理を書こうと思うとこれが大変面倒くさい。 実は俺もDXRubyのSourceForgeに公開する前のバージョンではそのよ…

RGSS2を知る(19)

InputモジュールのInput#repeat?はキーの入力をオートリピート付きでチェックしてくれる。 この間隔を調整する機能はない。 ジャンルによるだけでなく、RPGでも物によってはもっと速く動かしたいとか要望は無いのだろうか。 それはさておき、オートリピート…

RGSS2を知る(17)

Planeクラスの使い道を調べようと思ったのだが、RPGのコードを見ても使ってるところが見当たらない。 ここで使ってる!って知ってる人がいたらぜひ教えてほしい。 必要なのかどうかわからないが、互換ライブラリなら作らないといけないのでとりあえず動かし…

RGSS互換ライブラリを考える

DXRubyのViewportがバグっているようだ。 DirectXでいうViewportというのは、射影変換後のxyそれぞれ-1〜1になった座標(zは0〜1)のはみ出したものをクリッピングした後、スクリーン座標系にスケーリングするときに使う。 つまり、元の座標を640*480の座標系…

RGSSとDXRubyの画像の扱いの違い

RGSSをいじっていて思うのは、DXRubyとの画像データの持ち方の違いである。 どっちもファイルを読んでオブジェクトとして保持する機能があり、画像に対して何かしらの編集をする機能もある。 名前はDXRubyのほうはImageクラス、RGSSはBitmapクラスだ。 DXRub…

RGSS2を知る(10)

RGSSはRubyGameScriptingSystemでRGSSなのだから、Rubyではあるのだが、ライブラリはいまいちRubyぽくない動作をする(俺的感覚)。 こういう感覚は人によって違うので、たとえばDXRubyも俺が思う以上にRubyぽいと言われたり、Rubyぽくないと言われたり、まち…

RGSS2を知る(11)

マニュアルに「返される値はコピーではなく参照だから、値を変更すれば反映される」というようなことが書いてある。 気になったからもう少し調べてみた。 さっきの「←ここ」をこのように変えると、 s.tone.gray = g # ←ここ 確かに色が変わるようになった。 …

RGSS2を知る(12)

グレースケール化の処理について。 osakana.factoryさま http://ofo.jp/osakana/cgtips/grayscale.phtml このサイトさまを参考に、Spriteのグレースケール化した色と、自前計算した色が一致するような計算式を探った。 b = Bitmap.new(200,200) b.fill_rect(…

RGSS2を知る(13)

Spriteはもともとそのクラスのオブジェクトを内部に持っていて、=付きのメソッドを呼ばれると引数の値を内部オブジェクトにコピーする、ということのようだ。 Bitmapクラスのrectはプロパティとしてではなくメソッドとマニュアルに書いてあり、設定機能はな…

RGSS2を知る(14)

気が付いたらもう14回目。 RGSS2がよくわかってきたような気はあんまりしない。 今回はViewportのフラッシュについて。 以下のコードを実行すると、指定時間が違うのにどちらも同時に消える。 v1 = Viewport.new(0,0,400,300) v2 = Viewport.new(100,100,400…

RGSS2を知る(15)

休みの日に一日中こんなことやってるのってどうなん? b = Bitmap.new(100,100) b.fill_rect(b.rect, Color.new(255,255,255,255)) s = Sprite.new s.bitmap = b s.angle = 45 loop do Graphics.update end 白い四角を回転させた。 この結果から言えることは…