画面に線を引くテスト。
Window.drawScaleを使って1ピクセルのImageを引き伸ばすのは、塗りつぶした四角形をシンプルに描画する方法として、メモリ的にも速度的にもたぶん最も効率的だ。
hikaruさんのブログ
http://www.hikaruna.net/blog/?p=296
PCの世界ではどこでそう決まってるのかは知らないが1ピクセルは小さな四角であり、それを前提とすれば、drawExで色々と応用ができる。
例えば自由な2点間に線を引く。
require 'dxruby' module Window def self.drawLine(x1, y1, x2, y2, c, z = 0) pixel = Image.new(1, 1, c) sx = Math.sqrt(((x1 - x2)**2) + ((y1 - y2)**2)) angle = Math.atan2(y2 - y1, x2 - x1) / Math::PI * 180 Window.drawEx((x2 + x1) / 2, (y2 + y1) / 2, pixel, :scalex=>sx, :scaley=>1, :centerx=>0.5, :centery=>0.5, :angle=>angle, :z=>z) end end Window.loop do Window.drawLine(100,100,200,200,[255,255,0]) end
サンプルに入れてあるlaser.rbもこれに近い手でレーザーを描画している。
このコードでは線を引くたびにImageが生成・破棄されるから、hikaruさんがやってるようなキャッシュの機構などがあるといいかもしれない。
おまけ。2色グラデーションの線を引く。
require 'dxruby' module Window def self.drawGradationLine(x1, y1, x2, y2, c1, c2, z = 0) temp_pixel = Image.new(4, 1) temp_pixel[0,0] = temp_pixel[1,0] = c1 temp_pixel[2,0] = temp_pixel[3,0] = c2 pixel = temp_pixel.slice(1,0,2,1) sx = Math.sqrt(((x1 - x2)**2) + ((y1 - y2)**2)) / 2 angle = Math.atan2(y2 - y1, x2 - x1) / Math::PI * 180 Window.drawEx((x2 + x1) / 2, (y2 + y1) / 2, pixel, :scalex=>sx, :scaley=>1, :centerx=>1.0, :centery=>1.0, :angle=>angle, :z=>z) end end Window.loop do Window.drawGradationLine(100,100,200,200,[255,255,0], [255,0,0]) end
追記。
このグラデーションは少し微妙だ。
2つのテクセルの中心がそれぞれ、線の前から1/4、後ろから1/4に来るから、端から端まで綺麗にグラデーションしない。
おそらく、現在のDXRubyのAPI仕様ではこの手法についての対策は無い。
DXRubyのWindowモジュールにネイティブで追加するなら、テクスチャ座標を好きなように細工できるから、綺麗に描画できるようになるだろう。
こういった機能の追加については前から考えているが、テクスチャの動的生成、破棄が発生するため、どうしたものか悩んでいる。