DXRuby 1.4.1 リファレンスマニュアル
3.1 Windowモジュール

ウィンドウ生成、グラフィック描画、画面更新などを行うことができます。

Window.loop do
  ...
end

  メインループになります。
  実行されるとデフォルト設定ではウィンドウ(640*480pixel)が作られ、閉じられたら終了します。
  このループは秒間60回実行(60FPS)になるよう、待ち時間が自動調整されます。

Window.draw( x, y, image, z=0 )

  絵の描画をします。
  xとyは座標で、左上が(0,0)になります。
  imageはImageクラスもしくはRenderTargetクラスのオブジェクトです。
  zは描画順序で、小さい数字が奥になります。マイナスや実数も使えます。
  省略すると0になり、同じ値の場合は最初にdrawしたものが一番奥になります。

Window.drawScale( x, y, image, scalex, scaley, centerx=nil, centery=nil, z=0 )
Window.draw_scale( x, y, image, scalex, scaley, centerx=nil, centery=nil, z=0 )

  縦、横の拡大率を指定して描画します。
  1が等倍で実数が使えます。
  横に-1を設定すると左右反転、縦に-1を設定すると上下反転の絵が描画できます。
  centerx/centeryは画像の左上を(0,0)とした画像の拡大原点で、省略すると画像の中心となります。

Window.drawRot( x, y, image, angle, centerx=nil, centery=nil, z=0 )
Window.draw_rot( x, y, image, angle, centerx=nil, centery=nil, z=0 )

  回転角度と中心を指定して描画します。
  angle(角度)は0を基準として、時計回りに増えていって360で一周します。
  centerx/centery(中心点)は画像の左上を(0,0)とした画像の回転中心位置の指定で、省略すると画像の中心になります。

Window.drawAlpha( x, y, image, alpha, z=0 )
Window.draw_alpha( x, y, image, alpha, z=0 )

  アルファ値を指定して描画します。
  範囲は0(完全に透明)から255(完全に不透明)までです。

Window.drawAdd( x, y, image, z=0 )
Window.draw_add( x, y, image, z=0 )

  加算合成描画をします。

Window.drawSub( x, y, image, z=0 )
Window.draw_sub( x, y, image, z=0 )

  減算合成描画をします。

Window.drawShader( x, y, image, shader, z=0 )
Window.draw_shader( x, y, image, shader, z=0 )

  シェーダ処理を適用して描画をします。

Window.drawEx( x, y, image, hash={} )
Window.draw_ex( x, y, image, hash={} )

  ※DXRuby1.4.1 update!(offset_sync追加)
  拡縮回転半透明加算合成が同時にできます。
  hashには以下のキーが指定できます。
  :scale_x  ・・・横の拡大率。省略すると1になります。従来のscalexでも可。
  :scale_y  ・・・縦の拡大率。省略すると1になります。従来のscaleyでも可。
  :center_x  ・・・回転、拡大の中心点。省略すると画像の中心になります。従来のcenterxでも可。
  :center_y  ・・・回転、拡大の中心点。省略すると画像の中心になります。従来のcenteryでも可。
  :alpha  ・・・アルファ値(0〜255)。省略すると255になります。
  :blend  ・・・:alpha、:none、:add、:add2、:subで合成方法を指定します。省略すると:alphaとなります。
                :noneは透明色、半透明色もそのまま上書き描画します。
                :addはソースにアルファ値を、:add2は背景に255-アルファ値を適用します。
                :subはアルファ値を全ての色の合成に、:sub2はRGBの色をそれぞれ別々に合成に適用します。
  :angle  ・・・360度系で画像の回転角度を指定します。拡大率と同時に指定した場合は拡大率が先に適用されます。
  :shader ・・・Shaderオブジェクトを指定すると描画にシェーダ処理が反映されます。

  :z  ・・・描画順指定
  :offset_sync  ・・・true/falseで指定します。trueを指定すると描画時の指定座標x/yに、画像のcenter_x/yで指定した位置が来るように補正されます。省略時はfalseです。

Window.drawFont( x, y, string, font, hash={} )
Window.draw_font( x, y, string, font, hash={} )

  文字の描画をします。
  stringは描画する文字列、fontはFontオブジェクトを指定してください。
 文字列に"\n"を入れると改行することができます。
 文字コードはSJIS限定(Ruby1.8の場合のみ)です。

  フォントにもdrawExと同等のエフェクト機能があります。
  hashには以下のキーが指定できます。
  :scale_x  ・・・横の拡大率。省略すると1になります。従来のscalexでも可。
  :scale_y  ・・・縦の拡大率。省略すると1になります。従来のscaleyでも可。
  :center_x  ・・・回転、拡大の中心点。省略すると一番左になります。従来のcenterxでも可。
  :center_y  ・・・回転、拡大の中心点。省略すると一番上になります。従来のcenteryでも可。
  :alpha  ・・・アルファ値(0〜255)。省略すると255になります。
  :blend  ・・・:alpha、:add、:add2、:sub、:sub2で合成方法を指定します。省略すると:alphaとなります。
                :addはソースにアルファ値を、:add2は背景に255-アルファ値を適用します。
                :subはアルファ値を全ての色の合成に、:sub2はRGBの色をそれぞれ別々に合成に適用します。
  :angle  ・・・360度系で画像の回転角度を指定します。拡大率と同時に指定した場合は拡大率が先に適用されます。
  :z  ・・・描画順指定
  :color  ・・・配列で[R, G, B]、それぞれ0〜255、省略すると[255, 255, 255]、白文字になります。

Window.drawFontEx( x, y, string, font, hash={} )
Window.draw_font_ex( x, y, string, font, hash={} )

  ※DXRuby1.4.1 update!(aaスイッチ追加)
  高品質な文字の描画をします。
  stringは描画する文字列、fontはFontオブジェクトを指定してください。
 このメソッドでは"\n"を入れても改行することはできませんのでご注意ください。
 文字コードはSJIS限定(Ruby1.8の場合のみ)です。

  フォントにもdrawExと同等のエフェクト機能があります。
  hashには以下のキーが指定できます。
  :scale_x  ・・・横の拡大率
  :scale_y  ・・・縦の拡大率
  :center_x  ・・・回転、拡大の中心点。省略すると一番左になります。
  :center_y  ・・・回転、拡大の中心点。省略すると一番上になります。
  :alpha  ・・・アルファ値(0〜255)。省略すると255になります。
  :blend  ・・・:alpha、:add、:add2、:sub、:sub2で合成方法を指定します。省略すると:alphaとなります。
                :addはソースにアルファ値を、:add2は背景に255-アルファ値を適用します。
                :subはアルファ値を全ての色の合成に、:sub2はRGBの色をそれぞれ別々に合成に適用します。
  :angle  ・・・360度系で画像の回転角度を指定します。拡大率と同時に指定した場合は拡大率が先に適用されます。
  :z  ・・・描画順指定
  :color  ・・・配列で[R, G, B]、それぞれ0〜255、省略すると[255, 255, 255]、白文字になります。
  :aa  ・・・アンチエイリアスのon/offをtrue/falseで指定します。省略するとtrueになります。

  また、Image#drawFontExと同様の以下のエフェクト機能もあります。
  hashで指定できます。
  :edge  ・・・袋文字を描画するかどうかをtrue/falseで指定します。省略するとfalseになります。
  :edge_color  ・・・袋文字の枠色を指定します。配列で[R, G, B]、それぞれ0〜255、省略すると[0, 0, 0]、黒い枠になります。
  :edge_width  ・・・袋文字の枠の幅を0〜の数値で指定します。1で1ピクセルとなります。省略すると2になります。
  :edge_level  ・・・袋文字の枠の濃さを0〜の数値で指定します。大きいほど濃くなりますが、幅が大きいほど薄くなります。値の制限はありませんが、目安としては一桁ぐらいが実用範囲でしょう。省略すると4になります。
  :shadow  ・・・影を描画するかどうかをtrue/falseで指定します。省略するとfalseになります。
  :shadow_edge  ・・・edgeがtrueの場合に、枠の部分に対して影を付けるかどうかをtrue/falseで指定します。trueで枠の影が描かれます。省略するとfalseになります。
  :shadow_color  ・・・影の色を指定します。配列で[R, G, B]、それぞれ0〜255、省略すると[0, 0, 0]、黒い影になります。
  :shadow_x  ・・・影の位置を相対座標で指定します。+1は1ピクセル右になります。省略するとフォントサイズ/24+1になります。
  :shadow_y  ・・・影の位置を相対座標で指定します。+1は1ピクセル下になります。省略するとフォントサイズ/24+1になります。

Window.drawMorph(x1, y1, x2, y2, x3, y3, x4, y4, image, hash={} )
Window.draw_morph(x1, y1, x2, y2, x3, y3, x4, y4, image, hash={} )

  4点を自由に指定してimageを描画できます。これを使うと自在に変形した画像を描画することができます。
  ただし、実際にはhashで指定するdividexとdivideyの数だけ絵を分割して変形しますので、分割数が少ない場合/描画面積が大きい場合に見え方がぎこちなくなることがあります。その場合は分割数を増やしてください。分割数を増やすと描画枚数が増えるのでパフォーマンスは下がります。
  座標はx1から順に右回りで指定してください。順番が違う場合の描画結果は保証されません。
  
  hashには以下のキーが指定できます。
  :alpha  ・・・(0〜255)。省略すると255になります。
  :blend  ・・・:alpha、:add、:add2、:sub、:sub2で合成方法を指定します。省略すると:alphaとなります。
                :addはソースにアルファ値を、:add2は背景に255-アルファ値を適用します。
                :subはアルファ値を全ての色の合成に、:sub2はRGBの色をそれぞれ別々に合成に適用します。
  :dividex  ・・・横の分割数を指定します。省略すると1になります。
  :dividey  ・・・縦の分割数を指定します。省略すると1になります。
  :z  ・・・描画順指定
  :color  ・・・配列で[R, G, B]、それぞれ0〜255。これを指定するとimageの色にかかわらず指定の色で塗りつぶされた画像になります。

Window.drawTile( basex, basey, map, image_arr, startx, starty, sizex, sizey, z=0 )
Window.draw_tile( basex, basey, map, image_arr, startx, starty, sizex, sizey, z=0 )

  ※DXRuby1.4.1 update!(nil指定)
 
タイルチップと二次元配列を使ってマップ描画をします。nilが指定できるようになりました。
  basex、basey ・・・マップを描画する画面上の左上基点位置を指定します。ピクセル単位スクロールの都合上、実際の描画は左/上にはみ出すことがあります。マイナスの値も指定できます。nilを指定すると0となります。
  map ・・・マップの二次元配列を指定します。中の値がimage配列の要素番号になります。
  image_arr ・・・マップタイルのImageオブジェクト配列を指定します。
  startx、starty ・・・マップ内の描画開始位置をピクセル単位で指定します。nilを指定すると0となります。
  sizex、sizey ・・・描画するマップタイルの枚数を縦横の数で指定します。nilを指定すると画面サイズから適切な数が算出されます。
  z ・・・マップの描画順を指定します。

  画像のサイズはimage_arrの先頭の画像から取得します。すべて同じサイズのImageオブジェクトを使用してください。
  マップ配列の長さが要素によって異なる場合の動作は未定義です。長さはすべて一致させてください。
  描画範囲が上下左右に2次元配列からはみ出した場合、自動的にループされます。1枚絵を無限ループさせるという応用や、basex/baseyをマイナス値にして左方向へのループなどもできます。
  ピクセル単位でスクロールさせることができますが、描画は上下左右に最大1枚分はみ出すので、上に枠をかぶせて隠すように描画するか、RenderTargetに一度描画して
範囲を制限するか、ウィンドウのサイズ全体に描画してはみ出した部分を描画されないようにするかしてください。 
  image_arr配列に配列を入れ子にすることができます。Array#flatten的な処理がされて前から連番が振られますので、同じサイズの配列であれば中身を差し替えることで簡単にアニメーションすることができます。

Window.drawLine( x1, y1, x2, y2, color, z=0 )
Window.draw_line( x1, y1, x2, y2, color, z=0 )

  画面に(x1, y1)〜(x2, y2)を結ぶ線を引きます。
  colorは色配列、zは描画順指定です。

Window.drawBoxFill( x1, y1, x2, y2, color, z=0 )
Window.draw_box_fill( x1, y1, x2, y2, color, z=0 )

  ※DXRuby1.4.1 new!
  画面に(x1, y1)〜(x2, y2)を塗りつぶす矩形を描画します。
  colorは色配列、zは描画順指定です。

Window.getScreenShot( filename, format=FORMAT_JPG )
Window.get_screen_shot( filename, format=FORMAT_JPG )

  スクリーンショットをファイルに保存します。
  formatは保存形式で、はFORMAT_JPG、FORMAT_PNG、FORMAT_BMP、FORMAT_DDSのどれかを指定してください。
  省略するとFORMAT_JPGになります。

Window.getLoad
Window.get_load

  現在の処理負荷を%で取得します。
  fps=で指定したFPSでの1フレームのうち、どれだけ処理時間を使っているかを表しています。

Window.openFilename( filter, title )
Window.open_filename( filter, title )

  ファイルオープンダイアログを表示します。
  ファイル名の文字列が返ってきます。文字列の文字コードはRuby1.8の場合はSJISです。Ruby1.9以降ではEncoding.default_internalのものに変換されます。nilの場合はSJISです。
  filterには[["すべてのファイル(*.*)", "*.*"]["JPGファイル(*.jpg)", "*.jpg"]]のような配列を設定します。
  titleはダイアログにタイトルバーに表示される文字列を設定します。
  キャンセルされるとnilが返ります。
  filter、titleともに渡す文字コードはRuby1.8ではSJIS、Ruby1.9以降は自動変換されますので好みの文字コードでどうぞ。

Window.saveFilename( filter, title )
Window.save_filename( filter, title )

  ファイルセーブダイアログを表示します。
  ファイル名の文字列が返ってきます。文字列の文字コードはRuby1.8の場合はSJISです。Ruby1.9以降ではEncoding.default_internalのものに変換されます。nilの場合はSJISです。
  filterには[["すべてのファイル(*.*)", "*.*"]["JPGファイル(*.jpg)", "*.jpg"]]のような配列を設定します。
  titleはダイアログにタイトルバーに表示される文字列を設定します。
  キャンセルされるとnilが返ります。
  filter、titleともに渡す文字コードはRuby1.8ではSJIS、Ruby1.9以降は自動変換されますので好みの文字コードでどうぞ。

Window.folderDialog( title, default )
Window.folder_dialog( title, default )

  ※DXRuby1.4.1 new!
  フォルダダイアログを表示します。
  選択したディレクトリ名の文字列が返ってきます。文字列の文字コードはRuby1.8の場合はSJISです。Ruby1.9以降ではEncoding.default_internalのものに変換されます。nilの場合はSJISです。
  titleはタイトルに表示される文字列を設定します。
  defaultは表示時に選択されるディレクトリを設定します。
  キャンセルされるとnilが返ります。
  filter、titleともに渡す文字コードはRuby1.8ではSJIS、Ruby1.9以降は自動変換されますので好みの文字コードでどうぞ。

Window.create

  ウィンドウを作成します。Window.loopの初めに同じ処理がされていますので、Window.loopを使わずに自分でゲームループを組み立てるときだけ使ってください。

Window.sync

  Window.fps=で指定されたfpsになるようにウェイトを入れます。Window.loopの中で同じ処理がされていますので、Window.loopを使わずに自分でゲームループを組み立てるときだけ使ってください。

Window.update

  画面を更新します。Window.loopの中で同じ処理がされていますので、Window.loopを使わずに自分でゲームループを組み立てるときだけ使ってください。

Window.loadIcon( filename )
Window.load_icon( filename )

  16*16*4bppの画像ファイルを読み込み、ウィンドウ左上のアイコンに設定します。
  指定できるのは拡張子が.icoのファイルです。

Window.hWnd

  ウィンドウハンドルを取得します。
  Window.loop、Window.createを実行する前に使用可能です。

Window.x
Window.y
Window.x=val
Window.y=val

  ウィンドウの表示位置を取得、または設定します。
  設定はWindow.loop、Window.createメソッドを呼び出す前のみ可能です。
  表示位置設定を行わずにWindow.loop、Window.createメソッドを呼び出した場合、OSデフォルト位置に設定されます。

Window.width
Window.height
Window.width=val
Window.height=val

  画面サイズを取得、または設定します。
  設定はWindow.loop、Window.createメソッドを呼び出す前のみ可能です。
  サイズ設定を行わずにWindow.loop、Window.createメソッドを呼び出した場合、幅640ピクセル、高さ480ピクセルに設定されます。

Window.caption
Window.caption=val

  タイトルバーのキャプションを取得、または設定します。
  設定を行わずにWindow.loop、Window.createメソッドを呼び出した場合、「DXRubyApplication」となります。
 設定時の文字コードはSJIS(Ruby1.8の場合、Ruby1.9以降は何でも構わない)で、取得時もSJIS(Ruby1.8の場合、1.9以降ではEncoding.default_internalに設定されたものに変換される。nilならSJIS)です。

Window.scale
Window.scale=val

  ウィンドウの画面サイズに対する拡大率を取得、または指定します。
  縦横同じ比率が適用されます。
  width、heightで指定した値に、この値を掛けたものが実際のウィンドウのサイズとなります。
  設定を行わずにWindow.loop、Window.createメソッドを呼び出した場合、1倍になります。

Window.windowed?
Window.windowed=val

  ウィンドウモード/フルスクリーンモードの取得、または設定を行います。
  trueを指定するとウィンドウモードで、falseでフルスクリーンモードになります。
  設定を行わずにWindow.loop、Window.createメソッドを呼び出した場合、ウィンドウモードになります。
  フルスクリーンモードは60fps固定となります。

Window.real_fps
Window.fps
Window.fps=val

  画面の更新頻度(1秒間に何回更新するか)を取得、または指定します。
  設定を行わずにWindow.loop、Window.createメソッドを呼び出した場合、60fpsに設定されます。
  処理が重くて更新頻度が保てない場合、自動的に描画をスキップします。
  nilまたは0を指定するとウェイト無しの最高速動作となります。
  ※DXRuby1.0.6ではreal_fpsとfpsは同じ値を返しますが、将来的にfpsメソッドはfps=で設定した値を返すようになる予定です。

Window.frameskip?
Window.frameskip=val

  コマ落ち制御をするかどうかを取得、または設定します。
  trueを指定すると、fps=で指定したFPSに処理が間に合わない場合、1フレームだけ描画処理を省きます。
  描画を省いてでもfps=の動作間隔を守るモードです。
  falseを指定すると、fps=で指定したFPSに処理が間に合わなくても可能な限りの速度で動作し続けます。
  この場合、FPSは高くなりますが、ゲーム全体が遅くなります。
  指定しないとfalseになります。

Window.bgcolor
Window.bgcolor=val

  画面のクリア(毎フレーム自動的にされます)時に使う色を取得、または設定します。
  色の指定は[r, g, b]の配列です。

Window.minFilter
Window.magFilter
Window.minFilter=val

Window.magFilter=val
Window.min_filter
Window.mag_filter
Window.min_filter=val

Window.mag_filter=val

  draw_scaleやdraw_exのscale_x/yキーで拡大・縮小をする場合に使用されるフィルタを取得、または設定します。この設定はWindow.scale=には反映されません。
  minfilterは縮小時、magfilterは拡大時です。
  指定可能な定数は以下のものです。
  TEXF_POINT・・・単純拡大・縮小フィルタ
  TEXF_LINEAR・・・線形補間フィルタ(デフォルト)
  TEXF_GAUSSIANQUAD・・・4-サンプルガウスフィルタ

Window.resize( width, height )

  ウィンドウのサイズを変更します。このメソッドはウィンドウ生成後でも実行することができます。
  フルスクリーンで実行する場合、ビデオカードが対応していないサイズを指定すると例外が発生します。
  ビデオカードが対応しているサイズはWindow.getScreenModesで取得できます。

Window.active?

  ウィンドウがアクティブかそうじゃないかをtrue/falseで返します。
  非アクティブ状態の場合に一時停止するなどの場合に使います。

Window.running_time
Window.runningTime

  ※DXRuby1.4.1 new!
  ウィンドウを生成してからの経過時間をミリ秒単位で返します。ループ中のどこで何回実行してもそのフレームの開始時点の時間が返ります。

Window.getScreenModes
Window.get_screen_modes

  ※DXRuby1.4.1 update!(refreshrate追加)
  フルスクリーン時に使用可能な解像度を[[width, height, refreshrate], ...]という配列で返します。

Window.getCurrentModes
Window.get_current_modes

  ※DXRuby1.4.1 new!
  現在の画面モードとリフレッシュレートを取得できます。

Window.discard

  Window.draw系メソッドで描画した絵は描画予約されて、Window.loopを回るときかWindow.update時に実際に描画されます。
  描画される前にWindow.discardを実行すると描画予約を消去することができます。
  RenderTarget#decideを実行した場合、実行前の描画予約は消去されません。

Window.decide

  Window.draw系メソッドで描画した絵は描画予約されて、Window.loopを回るときかWindow.update時に実際に描画されます。
  Window.decideを実行すると、その時点での描画予約が確定されます。これはWindow.discardでも消去されません。
  このメソッドはWindow.discardで消去されなくするためだけに存在するので、これを実行しないと描画されないということではありません。
 

Window.before_call
Window.after_call

  ※DXRuby1.4.1 new!
  ハッシュオブジェクトを返します。このハッシュオブジェクトのキーに識別用オブジェクトを、値にProcやMethodオブジェクトを格納しておくと、Window.loopの開始時(before_call)もしくは終了時(after_call)でcallメソッドを呼び出してくれます。毎フレーム呼び出す必要がある処理を登録しておくと楽です。Proc/Methodじゃなくてもcallメソッドが呼べるオブジェクトなら何を格納しても動作します。
 識別用オブジェクトは他とぶつからなければ何でもよく、削除するときに使う程度になります。
 ループ分解している場合、before_callはInput.update時、after_callはWindow.update時に呼び出されます。