Module: DXOpal::Window
- Defined in:
- opal/dxopal/window.rb
Constant Summary
- @@fps =
60
- @@real_fps =
0
- @@real_fps_ct =
1
- @@real_fps_t =
Time.now
- @@width =
640
- @@height =
480
- @@block =
nil
- @@paused =
false
- @@bgcolor =
Constants::Colors::C_BLACK
Class Method Summary collapse
-
._img ⇒ Object
Return internal DXOpal::Image object (for experimental/hacking use).
- ._init(w, h) ⇒ Object
-
._loop(time = 0) ⇒ Object
(internal) call @@block periodically.
- .bgcolor ⇒ Object
- .bgcolor=(col) ⇒ Object
- .draw(x, y, image, z = 0) ⇒ Object
- .draw_box(x1, y1, x2, y2, color, z = 0) ⇒ Object
- .draw_box_fill(x1, y1, x2, y2, color, z = 0) ⇒ Object
- .draw_circle(x, y, r, color, z = 0) ⇒ Object
- .draw_circle_fill(x, y, r, color, z = 0) ⇒ Object
- .draw_ex(x, y, image, options = {}) ⇒ Object
- .draw_font(x, y, string, font, option = {}) ⇒ Object
- .draw_line(x1, y1, x2, y2, color, z = 0) ⇒ Object
- .draw_pause_screen ⇒ Object
- .draw_pixel(x, y, color, z = 0) ⇒ Object
- .draw_rot(x, y, image, angle, center_x = nil, center_y = nil, z = 0) ⇒ Object
- .draw_scale(x, y, image, scale_x, scale_y, center_x = nil, center_y = nil, z = 0) ⇒ Object
- .draw_triangle(x1, y1, x2, y2, x3, y3, color, z = 0) ⇒ Object
- .draw_triangle_fill(x1, y1, x2, y2, x3, y3, color, z = 0) ⇒ Object
-
.enqueue_draw(z, *args) ⇒ Object
(internal).
- .fps ⇒ Object
- .fps=(w) ⇒ Object
- .height ⇒ Object
- .height=(h) ⇒ Object
-
.load_resources(&block) ⇒ Object
Load resources specified with Image.register or Sound.register Call block when loaded.
-
.loop(&block) ⇒ Object
Start main loop.
-
.pause ⇒ Object
(DXOpal original) Pause & resume.
- .paused? ⇒ Boolean
- .real_fps ⇒ Object
- .resume ⇒ Object
- .width ⇒ Object
- .width=(w) ⇒ Object
Class Method Details
._img ⇒ Object
Return internal DXOpal::Image object (for experimental/hacking use)
110 |
# File 'opal/dxopal/window.rb', line 110 def self._img; @@img; end |
._init(w, h) ⇒ Object
100 101 102 103 104 105 106 107 |
# File 'opal/dxopal/window.rb', line 100 def self._init(w, h) canvas = `document.getElementById("dxopal-canvas")` `canvas.width = w` `canvas.height = h` img = Image.new(w, h, canvas: canvas) Input._init(canvas) return img end |
._loop(time = 0) ⇒ Object
(internal) call @@block periodically
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'opal/dxopal/window.rb', line 49 def self._loop(time=0) @@img ||= _init(@@width, @@height) t0 = Time.now # Calculate fps if t0 - @@real_fps_t >= 1.0 @@real_fps = @@real_fps_ct @@real_fps_ct = 1 @@real_fps_t = t0 else @@real_fps_ct += 1 end # Update physics Sprite.matter_tick(time) if Sprite.matter_enabled? # Detect inputs Input._on_tick # Call user code @@draw_queue = [] if @@paused Window.draw_pause_screen else DXOpal.dump_error(&@@block) end # Draw @@img.box_fill(0, 0, @@width, @@height, @@bgcolor) sorted = @@draw_queue.sort{|a, b| a[0] == b[0] ? a[1] <=> b[1] : a[0] <=> b[0] } sorted.each do |item| case item[2] when :image then @@img.draw(*item.drop(3)) when :image_rot then @@img.draw_rot(*item.drop(3)) when :image_scale then @@img.draw_scale(*item.drop(3)) when :draw_ex then @@img.draw_ex(*item.drop(3)) when :font then @@img.draw_font(*item.drop(3)) when :pixel then @@img.[]=(*item.drop(3)) when :line then @@img.line(*item.drop(3)) when :box then @@img.box(*item.drop(3)) when :box_fill then @@img.box_fill(*item.drop(3)) when :circle then @@img.circle(*item.drop(3)) when :circle_fill then @@img.circle_fill(*item.drop(3)) when :triangle then @@img.triangle(*item.drop(3)) when :triangle_fill then @@img.triangle_fill(*item.drop(3)) end end `window`.JS.requestAnimationFrame{|time| _loop(time) } end |
.bgcolor ⇒ Object
120 |
# File 'opal/dxopal/window.rb', line 120 def self.bgcolor; @@bgcolor; end |
.bgcolor=(col) ⇒ Object
121 |
# File 'opal/dxopal/window.rb', line 121 def self.bgcolor=(col); @@bgcolor = col; end |
.draw(x, y, image, z = 0) ⇒ Object
123 124 125 |
# File 'opal/dxopal/window.rb', line 123 def self.draw(x, y, image, z=0) enqueue_draw(z, :image, x, y, image) end |
.draw_box(x1, y1, x2, y2, color, z = 0) ⇒ Object
153 154 155 |
# File 'opal/dxopal/window.rb', line 153 def self.draw_box(x1, y1, x2, y2, color, z=0) enqueue_draw(z, :box, x1, y1, x2, y2, color) end |
.draw_box_fill(x1, y1, x2, y2, color, z = 0) ⇒ Object
157 158 159 |
# File 'opal/dxopal/window.rb', line 157 def self.draw_box_fill(x1, y1, x2, y2, color, z=0) enqueue_draw(z, :box_fill, x1, y1, x2, y2, color) end |
.draw_circle(x, y, r, color, z = 0) ⇒ Object
161 162 163 |
# File 'opal/dxopal/window.rb', line 161 def self.draw_circle(x, y, r, color, z=0) enqueue_draw(z, :circle, x, y, r, color) end |
.draw_circle_fill(x, y, r, color, z = 0) ⇒ Object
165 166 167 |
# File 'opal/dxopal/window.rb', line 165 def self.draw_circle_fill(x, y, r, color, z=0) enqueue_draw(z, :circle_fill, x, y, r, color) end |
.draw_ex(x, y, image, options = {}) ⇒ Object
135 136 137 |
# File 'opal/dxopal/window.rb', line 135 def self.draw_ex(x, y, image, ={}) enqueue_draw([:z] || 0, :draw_ex, x, y, image, ) end |
.draw_font(x, y, string, font, option = {}) ⇒ Object
139 140 141 142 143 |
# File 'opal/dxopal/window.rb', line 139 def self.draw_font(x, y, string, font, option={}) z = option[:z] || 0 color = option[:color] || [255, 255, 255] enqueue_draw(z, :font, x, y, string, font, color) end |
.draw_line(x1, y1, x2, y2, color, z = 0) ⇒ Object
149 150 151 |
# File 'opal/dxopal/window.rb', line 149 def self.draw_line(x1, y1, x2, y2, color, z=0) enqueue_draw(z, :line, x1, y1, x2, y2, color) end |
.draw_pause_screen ⇒ Object
43 44 45 46 |
# File 'opal/dxopal/window.rb', line 43 def self.draw_pause_screen Window.draw_box_fill(0, 0, Window.width, Window.height, C_BLACK) Window.draw_font(0, 0, "...PAUSE...", Font.default, color: C_WHITE) end |
.draw_pixel(x, y, color, z = 0) ⇒ Object
145 146 147 |
# File 'opal/dxopal/window.rb', line 145 def self.draw_pixel(x, y, color, z=0) enqueue_draw(z, :pixel, x, y, color) end |
.draw_rot(x, y, image, angle, center_x = nil, center_y = nil, z = 0) ⇒ Object
131 132 133 |
# File 'opal/dxopal/window.rb', line 131 def self.draw_rot(x, y, image, angle, center_x=nil, center_y=nil, z=0) enqueue_draw(z, :image_rot, x, y, image, angle, center_x, center_y) end |
.draw_scale(x, y, image, scale_x, scale_y, center_x = nil, center_y = nil, z = 0) ⇒ Object
127 128 129 |
# File 'opal/dxopal/window.rb', line 127 def self.draw_scale(x, y, image, scale_x, scale_y, center_x=nil, center_y=nil, z=0) enqueue_draw(z, :image_scale, x, y, image, scale_x, scale_y, center_x, center_y) end |
.draw_triangle(x1, y1, x2, y2, x3, y3, color, z = 0) ⇒ Object
169 170 171 |
# File 'opal/dxopal/window.rb', line 169 def self.draw_triangle(x1, y1, x2, y2, x3, y3, color, z=0) enqueue_draw(z, :triangle, x1, y1, x2, y2, x3, y3, color) end |
.draw_triangle_fill(x1, y1, x2, y2, x3, y3, color, z = 0) ⇒ Object
173 174 175 |
# File 'opal/dxopal/window.rb', line 173 def self.draw_triangle_fill(x1, y1, x2, y2, x3, y3, color, z=0) enqueue_draw(z, :triangle_fill, x1, y1, x2, y2, x3, y3, color) end |
.enqueue_draw(z, *args) ⇒ Object
(internal)
178 179 180 |
# File 'opal/dxopal/window.rb', line 178 def self.enqueue_draw(z, *args) @@draw_queue.push([z, @@draw_queue.length, *args]) end |
.fps ⇒ Object
112 |
# File 'opal/dxopal/window.rb', line 112 def self.fps; @@fps; end |
.fps=(w) ⇒ Object
113 |
# File 'opal/dxopal/window.rb', line 113 def self.fps=(w); @@fps = w; end |
.height ⇒ Object
117 |
# File 'opal/dxopal/window.rb', line 117 def self.height; @@height; end |
.height=(h) ⇒ Object
118 |
# File 'opal/dxopal/window.rb', line 118 def self.height=(h); @@height = h; end |
.load_resources(&block) ⇒ Object
Load resources specified with Image.register or Sound.register Call block when loaded
16 17 18 19 20 |
# File 'opal/dxopal/window.rb', line 16 def self.load_resources(&block) RemoteResource._load_resources do DXOpal.dump_error(&block) end end |
.loop(&block) ⇒ Object
Start main loop
When called twice, previous loop is stopped (this is useful when implementing interactive game editor, etc.)
26 27 28 29 30 |
# File 'opal/dxopal/window.rb', line 26 def self.loop(&block) already_running = !!@@block @@block = block _loop unless already_running end |
.pause ⇒ Object
(DXOpal original) Pause & resume
33 34 35 36 37 |
# File 'opal/dxopal/window.rb', line 33 def self.pause @@paused = true @@draw_queue.clear draw_pause_screen end |
.paused? ⇒ Boolean
38 |
# File 'opal/dxopal/window.rb', line 38 def self.paused?; @@paused; end |
.real_fps ⇒ Object
114 |
# File 'opal/dxopal/window.rb', line 114 def self.real_fps; @@real_fps; end |
.resume ⇒ Object
39 40 41 42 |
# File 'opal/dxopal/window.rb', line 39 def self.resume raise "Window.resume is called before Window.loop" if @@block.nil? @@paused = false; Window.loop(&@@block) end |
.width ⇒ Object
115 |
# File 'opal/dxopal/window.rb', line 115 def self.width; @@width; end |
.width=(w) ⇒ Object
116 |
# File 'opal/dxopal/window.rb', line 116 def self.width=(w); @@width = w; end |