Module: Miyako::Screen

Defined in:
lib/Miyako/API/layout.rb,
lib/Miyako/API/screen.rb

Overview

画面管理モジュール

Constant Summary collapse

DefaultWidth =

デフォルトの画面解像度(幅)

640
DefaultHeight =

デフォルトの画面解像度(高さ)

480
FpsMax =

fpsの最大値(1000fps)

1000
WINMODES =

画面モードの数(ウインドウモード、フルスクリーンモード)

2
WINDOW_MODE =

ウインドウモードを示す値

0
FULLSCREEN_MODE =

フルスクリーンモードを示す値

1
ScreenFlag =

ウインドウモード・フルスクリーンモードを切り替える際のフラグを示す配列

$miyako_use_opengl ? [SDL::OPENGL, SDL::OPENGL | SDL::FULLSCREEN] : [SDL::HWSURFACE | SDL::DOUBLEBUF | SDL::ANYFORMAT, SDL::HWSURFACE | SDL::DOUBLEBUF | SDL::ANYFORMAT | SDL::FULLSCREEN]
@@initialized =
false
@@fps =

fps=0 : no-limit

0
@@fpsView =
false
@@fpscnt =
Screen::get_fps_count
@@interval =
0
@@min_interval =
3
@@min_interval_r =
@@min_interval / 1000
@@t =
0
@@freezing =
false
@@mode =

@@mode = FULLSCREEN_MODE

WINDOW_MODE
@@unit =
SpriteUnitFactory.create
@@pos =
Size.new(0,0)
@@size =
Size.new(DefaultWidth, DefaultHeight)
@@in_the_scene =
false
@@screen =
nil
@@viewport =
nil
@@pre_render_array =
SpriteList.new
@@auto_render_array =
SpriteList.new

Class Method Summary collapse

Class Method Details

.auto_render_arrayObject

自動描画インスタンス配列を取得する

Screenモジュールに属しているオートレンダー(自動描画)配列にアクセス可能 この配列に取り込んだインスタンスは、配列インデックスの順に描画される また、配列の要素は、必ずrenderメソッドを実装していなければならない(renderメソッドで描画するため) 但し、配列の要素が配列のときは、再帰的に描画が可能

返却値

自動描画配列


127
128
129
# File 'lib/Miyako/API/screen.rb', line 127

def Screen::auto_render_array
  @@auto_render_array
end

.bitmapObject

画面を管理するインスタンスを取得する

返却値

画面インスタンス(SDL::Screenクラスのインスタンス)


156
157
158
# File 'lib/Miyako/API/screen.rb', line 156

def Screen::bitmap
  return @@screen
end

.broad_rectObject

現在の画面の最大の大きさを矩形で取得する

但し、Screenの場合は最大の大きさ=画面の大きさなので、rectと同じ値が得られる

返却値

画像の大きさ(Rect構造体のインスタンス)


223
224
225
# File 'lib/Miyako/API/screen.rb', line 223

def Screen::broad_rect
  return Screen.rect
end

.capture(param, rect = ([0, 0] + @@size.to_a)) ⇒ Object

現在表示されている画面を画像(Spriteクラスのインスタンス)として取り込む

param

Spriteインスタンスを生成するときに渡すパラメータ(但し、:sizeと:typeのみ使用する)

rect

取り込む画像の矩形(4要素の配列もしくはRect構造体のインスタンス)

デフォルトは画面の大きさ

返却値

取り込んだ画像を含むSpriteクラスのインスタンス


291
292
293
294
295
296
297
# File 'lib/Miyako/API/screen.rb', line 291

def Screen::capture(param, rect = ([0, 0] + @@size.to_a))
  param = param.dup
  param[:size] = Size.new(*(rect[2..3]))
  dst = Sprite.new(param)
  SDL.blit_surface(*([@@screen] + rect.to_a << dst.bitmap << 0 << 0))
  return dst
end

.center_xObject

画像の回転・拡大・縮小の中心座標を取得する

x方向の中心座標を取得する

返却値

中心座標。


189
190
191
# File 'lib/Miyako/API/screen.rb', line 189

def Screen::center_x
  return @@unit.cx
end

.center_x=(pos) ⇒ Object

画像の回転・拡大・縮小の中心座標を取得する

x方向の中心座標を取得する

pos

中心座標


196
197
198
# File 'lib/Miyako/API/screen.rb', line 196

def Screen::center_x=(pos)
  @@unit.cx = pos
end

.center_yObject

画像の回転・拡大・縮小の中心座標を取得する

y方向の中心座標を取得する

返却値

中心座標。


203
204
205
# File 'lib/Miyako/API/screen.rb', line 203

def Screen::center_y
  return @@unit.cy
end

.center_y=(pos) ⇒ Object

画像の回転・拡大・縮小の中心座標を取得する

y方向の中心座標を取得する

pos

中心座標


210
211
212
# File 'lib/Miyako/API/screen.rb', line 210

def Screen::center_y=(pos)
  @@unit.cy = pos
end

.check_mode_error(screen = nil) ⇒ Object

:nodoc:


279
280
281
282
283
284
# File 'lib/Miyako/API/screen.rb', line 279

def Screen::check_mode_error(screen = nil) #:nodoc:
  unless Screen::set_screen(screen)
    raise MiyakoError, "Sorry, this system not supported display...";
    exit(1)
  end
end

.clearObject

画像を消去する

画像を黒色()で塗りつぶす


312
313
314
315
# File 'lib/Miyako/API/screen.rb', line 312

def Screen::clear
  return unless @@screen
  @@screen.fillRect(0, 0, @@screen.w, @@screen.h, [0, 0, 0, 0])
end

.disable_renderObject


361
362
363
# File 'lib/Miyako/API/screen.rb', line 361

def Screen::disable_render
  @render_attr = false
end

.enable_renderObject


357
358
359
# File 'lib/Miyako/API/screen.rb', line 357

def Screen::enable_render
  @render_attr = true
end

.fpsObject

:nodoc:


137
138
139
# File 'lib/Miyako/API/screen.rb', line 137

def Screen::fps # :nodoc:
  return @@fps
end

.fps=(val) ⇒ Object

:nodoc:


141
142
143
144
# File 'lib/Miyako/API/screen.rb', line 141

def Screen::fps=(val) # :nodoc:
  @@fps = val
  @@fpscnt = @@fps == 0 ? 0 : Screen::get_fps_count
end

.fps_viewObject

:nodoc:


146
147
148
# File 'lib/Miyako/API/screen.rb', line 146

def Screen::fps_view # :nodoc:
  return @@fpsView
end

.fps_view=(val) ⇒ Object

:nodoc:


150
151
152
# File 'lib/Miyako/API/screen.rb', line 150

def Screen::fps_view=(val) # :nodoc:
  @@fpsView = val
end

.get_fps_countObject


42
43
44
# File 'lib/Miyako/API/screen.rb', line 42

def Screen::get_fps_count
  return @@fps == 0 ? 0 : FpsMax / @@fps
end

.hObject

画面の高さを取得する

返却値

画面の高さ(ピクセル)


168
169
170
# File 'lib/Miyako/API/screen.rb', line 168

def Screen::h
  return @@size[1]
end

.init(screen = nil) ⇒ Object

画面関連の初期化処理

呼び出し時に、別プロセスで生成したSDL::Screenクラスインスタンスを引数として渡すと、 Miyakoはこのインスタンスを利用して描画を行う ただし、既に初期化済みの時はMiyakoErrorが発生する

screen

別のプロセスで生成されたSDL::Screenクラスのインスタンス。省略時はnil

Raises:


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/Miyako/API/screen.rb', line 75

def Screen.init(screen = nil)
  raise MiyakoError, "Already initialized!" if @@initialized  #プログラムで使用する色深度を示す。デフォルトは現在システムが使用している色深度

  $miyako_bpp ||= SDL.video_info.bpp  #色深度が32ビット以外の時はエラーを返す

  raise MiyakoError, "Unsupported Color bits! : #{$miyako_bpp}" unless [32].include?($miyako_bpp)

  if $miyako_use_opengl
    SDL::GL.set_attr(SDL::GL::RED_SIZE, 8)
    SDL::GL.set_attr(SDL::GL::GREEN_SIZE, 8)
    SDL::GL.set_attr(SDL::GL::BLUE_SIZE, 8)
    SDL::GL.set_attr(SDL::GL::ALPHA_SIZE, 8)
    SDL::GL.set_attr(SDL::GL::DEPTH_SIZE, 32)
    SDL::GL.set_attr(SDL::GL::STENCIL_SIZE, 32)
    SDL::GL.set_attr(SDL::GL::DOUBLEBUFFER, 1)
  end

  Screen::check_mode_error(screen)
  @@initialized = true
end

.initialized?Boolean

画面関係の初期化がされた?

Returns:

  • (Boolean)

97
98
99
# File 'lib/Miyako/API/screen.rb', line 97

def Screen.initialized?
  @@initialized
end

.open(screen = nil) ⇒ Object

画面のサーフェスを生成する

グローバル変数$miyako_open_screen==falseの時に有効 画面サーフェスを生成し、表示させる 事前に何もせずにrequire 'Miyako/miyako'を行うと本メソッドが自動的に呼ばれる。 require 前に“$miyako_open_screen=false”と記述すると、本メソッドの呼び出しが抑制される。

screen

別のプロセスで生成されたSDL::Screenクラスのインスタンス。省略時はnil


253
254
255
256
257
258
# File 'lib/Miyako/API/screen.rb', line 253

def Screen::open(screen = nil)
  @@screen = screen ? screen : SDL::Screen.open(*(@@size.to_a << $miyako_bpp << ScreenFlag[@@mode]))
  SpriteUnitFactory.apply(@@unit, {:bitmap=>@@screen, :ow=>@@screen.w, :oh=>@@screen.h})
  @@size = Size.new(@@screen.w, @@screen.h)
  @@viewport = Viewport.new(0, 0, @@screen.w, @@screen.h)
end

.posObject

画面の左上位置を取得する

位置は必ずを返す

返却値

Size構造体


175
176
177
# File 'lib/Miyako/API/screen.rb', line 175

def Screen::pos
  return @@pos.dup
end

.pre_renderObject

プリレンダー配列に登録されたインスタンスを画面に描画する

Screen.pre_render_arrayに登録したインスタンスを描画する


319
320
# File 'lib/Miyako/API/screen.rb', line 319

def Screen::pre_render
end

.pre_render_arrayObject

事前描画インスタンス配列を取得する

Screenモジュールに属している事前レンダー(プリレンダー)配列にアクセス可能 この配列に取り込んだインスタンスは、配列インデックスの順に描画される また、配列の要素は、必ずrenderメソッドを実装していなければならない(renderメソッドで描画するため) 但し、配列の要素が配列のときは、再帰的に描画が可能 描画は、Screen.pre_renderメソッドの明示的呼び出しで実行される

返却値

自動描画配列


117
118
119
# File 'lib/Miyako/API/screen.rb', line 117

def Screen::pre_render_array
  @@pre_render_array
end

.rectObject

現在の画面の大きさを矩形で取得する

返却値

画像の大きさ(Rect構造体のインスタンス)


216
217
218
# File 'lib/Miyako/API/screen.rb', line 216

def Screen::rect
  return Rect.new(*([0, 0]+@@size.to_a))
end

.renderObject

画面を更新する

描画した画面を、実際にミニ見える形に反映させる 呼び出し時に画面の消去は行われないため、消去が必要なときは明示的にScreen.clearメソッドを呼び出す必要がある また、自動描画配列にインスタンスを入れているときは、このメソッドを呼び出した時に描画されるため (つまり、表示の最後に描画される)、描画の順番に注意して配列を利用すること


327
328
329
330
331
332
333
334
335
336
# File 'lib/Miyako/API/screen.rb', line 327

def Screen::render
  Shape.text(
    {
      :text => (FpsMax/(@@interval == 0 ? 1 : @@interval)).to_s() + " fps",
      :font => Font.sans_serif
    }
  ).render if @@fpsView
  Screen::update_tick
  @@screen.flip
end

.render_attrObject


349
350
351
# File 'lib/Miyako/API/screen.rb', line 349

def Screen::render_attr
  @render_attr
end

.render_attr=(value) ⇒ Object


353
354
355
# File 'lib/Miyako/API/screen.rb', line 353

def Screen::render_attr=(value)
  @render_attr = value ? true : false
end

.render_screen(src) ⇒ Object

インスタンスの内容を画面に描画する

転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。 画面の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。 ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る) (ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない) ブロックの引数は、|インスタンスのSpriteUnit,画面のSpriteUnit|となる。

src

転送元ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)

返却値

自分自身を返す


346
347
# File 'lib/Miyako/API/screen.rb', line 346

def Screen::render_screen(src)
end

.segmentObject

Segment構造体を生成する

生成される線分は、x方向がy方向がとなる

返却値

生成したSegment構造体インスタンス


243
244
245
# File 'lib/Miyako/API/screen.rb', line 243

def Screen::segment
  return Segments.create([0, 0, @@size[0]-1, @@size[1]-1])
end

.set_mode(v) ⇒ Object

画面の状態(ウインドウモードとフルスクリーンモード)を設定する

v

ウィンドウモードのときは、Screen::WINDOW_MODE、 フルスクリーンモードのときはScreen::FULLSCREEN_MODE


103
104
105
106
107
108
# File 'lib/Miyako/API/screen.rb', line 103

def Screen::set_mode(v)
  if v.to_i == WINDOW_MODE || v.to_i == FULLSCREEN_MODE
    @@mode = v.to_i
    Screen::check_mode_error
  end
end

.set_screen(screen = nil) ⇒ Object

:nodoc:


260
261
262
263
264
# File 'lib/Miyako/API/screen.rb', line 260

def Screen::set_screen(screen = nil) #:nodoc:
  return false unless (screen || SDL.checkVideoMode(*(@@size.to_a << $miyako_bpp << ScreenFlag[@@mode])))
  self.open(screen)
  return true
end

.set_size(w, h) ⇒ Object

画面の大きさを変更する

単位はピクセル単位

w

画面の幅

h

画面の高さ

返却値

変更に成功したときは trueを返す


271
272
273
274
275
276
277
# File 'lib/Miyako/API/screen.rb', line 271

def Screen::set_size(w, h)
  return unless @@screen
  return false unless SDL.checkVideoMode(w, h, $miyako_bpp, ScreenFlag[@@mode])
  @@size = Size.new(w, h)
  self.open
  return true
end

.sizeObject

現在の画面の大きさを取得する

返却値

画像の大きさ(Size構造体のインスタンス)


236
237
238
# File 'lib/Miyako/API/screen.rb', line 236

def Screen::size
  return @@size.dup
end

.to_sprite {|dst| ... } ⇒ Object

現在表示されている画面を複製し、Spriteクラスのインスタンスとして取得

Screen.captureとの違いは、パラメータ・サイズは不変(画面の大きさで複製)で取り扱う。 引数1個のブロックを渡せば、スプライトに補正をかけることが出来る

返却値

取り込んだ画像を含むSpriteクラスのインスタンス

Yields:

  • (dst)

303
304
305
306
307
308
# File 'lib/Miyako/API/screen.rb', line 303

def Screen::to_sprite
  dst = Sprite.new(:size => Size.new(*(rect[2..3])), :type => :ac)
  Bitmap.screen_to_ac(Screen, dst)
  yield dst if block_given?
  return dst
end

.to_unitObject

画面を管理するSpriteUnitを取得する

新しいSpriteUnitを作成して返す

返却値

SpriteUnitインスタンス


182
183
184
# File 'lib/Miyako/API/screen.rb', line 182

def Screen::to_unit
  return @@unit.dup
end

.toggle_modeObject

ウインドウモードとフルスクリーンモードを切り替える


132
133
134
135
# File 'lib/Miyako/API/screen.rb', line 132

def Screen::toggle_mode
  @@mode = (@@mode + 1) % WINMODES
  Screen::check_mode_error
end

.viewportObject

現在のビューポート(表示区画)を取得する

ビューポートの設定は、Viewport#renderで行う

返却値

ビューポート(Viewportクラスのインスタンス)


230
231
232
# File 'lib/Miyako/API/screen.rb', line 230

def Screen::viewport
  return @@viewport
end

.wObject

画面の幅を取得する

返却値

画面の幅(ピクセル)


162
163
164
# File 'lib/Miyako/API/screen.rb', line 162

def Screen::w
  return @@size[0]
end