Module: DXOpal::Window

Defined in:
lib/dxopal/window.rb

Constant Summary collapse

@@fps =
60
@@fps_ts =
nil
@@fps_ct =
0
@@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

Class Method Details

._imgObject

Return internal DXOpal::Image object (for experimental/hacking use)



127
# File 'lib/dxopal/window.rb', line 127

def self._img; @@img; end

._initObject



116
117
118
119
120
121
122
123
124
# File 'lib/dxopal/window.rb', line 116

def self._init
  canvas = `document.getElementById("dxopal-canvas")`
  # If user did not change Window.width/Window.height, set the canvas size here
  self.width = @@width
  self.height = @@height
  img = Image.new(self.width, self.height, canvas: canvas)
  Input._init(canvas)
  return img
end

._loop(timestamp) ⇒ Object

(internal) call @@block periodically



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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/dxopal/window.rb', line 52

def self._loop(timestamp)
  @@img ||= _init

  # Calculate fps
  frame_msec = 1000.0 / @@fps
  @@fps_ts ||= timestamp
  passed_msec = timestamp - @@fps_ts
  @@fps_ts = timestamp
  @@fps_ct += passed_msec
  if @@fps_ct >= frame_msec
    @@fps_ct -= frame_msec
  else
    `window`.JS.requestAnimationFrame{|time| _loop(time) }
    return
  end

  # Calculate real_fps
  t = Time.now
  if t - @@real_fps_t >= 1.0
    @@real_fps = @@real_fps_ct
    @@real_fps_ct = 1
    @@real_fps_t = t
  else
    @@real_fps_ct += 1
  end

  # Update physics
  Sprite.matter_tick(timestamp) 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

.bgcolorObject



151
# File 'lib/dxopal/window.rb', line 151

def self.bgcolor; @@bgcolor; end

.bgcolor=(col) ⇒ Object



152
# File 'lib/dxopal/window.rb', line 152

def self.bgcolor=(col); @@bgcolor = col; end

.draw(x, y, image, z = 0) ⇒ Object



154
155
156
# File 'lib/dxopal/window.rb', line 154

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



184
185
186
# File 'lib/dxopal/window.rb', line 184

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



188
189
190
# File 'lib/dxopal/window.rb', line 188

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



192
193
194
# File 'lib/dxopal/window.rb', line 192

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



196
197
198
# File 'lib/dxopal/window.rb', line 196

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



166
167
168
# File 'lib/dxopal/window.rb', line 166

def self.draw_ex(x, y, image, options={})
  enqueue_draw(options[:z] || 0, :draw_ex, x, y, image, options)
end

.draw_font(x, y, string, font, option = {}) ⇒ Object



170
171
172
173
174
# File 'lib/dxopal/window.rb', line 170

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



180
181
182
# File 'lib/dxopal/window.rb', line 180

def self.draw_line(x1, y1, x2, y2, color, z=0)
  enqueue_draw(z, :line, x1, y1, x2, y2, color)
end

.draw_pause_screenObject



46
47
48
49
# File 'lib/dxopal/window.rb', line 46

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



176
177
178
# File 'lib/dxopal/window.rb', line 176

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



162
163
164
# File 'lib/dxopal/window.rb', line 162

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



158
159
160
# File 'lib/dxopal/window.rb', line 158

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



200
201
202
# File 'lib/dxopal/window.rb', line 200

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



204
205
206
# File 'lib/dxopal/window.rb', line 204

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)



209
210
211
# File 'lib/dxopal/window.rb', line 209

def self.enqueue_draw(z, *args)
  @@draw_queue.push([z, @@draw_queue.length, *args])
end

.fpsObject



129
# File 'lib/dxopal/window.rb', line 129

def self.fps; @@fps; end

.fps=(w) ⇒ Object



130
# File 'lib/dxopal/window.rb', line 130

def self.fps=(w); @@fps = w; end

.heightObject



141
# File 'lib/dxopal/window.rb', line 141

def self.height; @@height; end

.height=(h) ⇒ Object

Set window height and resize the canvas Set `nil` to maximize canvas



144
145
146
147
148
149
# File 'lib/dxopal/window.rb', line 144

def self.height=(h)
  canvas = `document.getElementById("dxopal-canvas")`
  @@height = h || `window.innerHeight`
  `canvas.height = #{@@height}`
  `canvas.style.height = #{@@height}`
end

.load_resources(&block) ⇒ Object

Load resources specified with Image.register or Sound.register Call block when loaded



18
19
20
21
22
# File 'lib/dxopal/window.rb', line 18

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.)



28
29
30
31
32
33
# File 'lib/dxopal/window.rb', line 28

def self.loop(&block)
  already_running = !!@@block
  @@block = block
  return if already_running
  `window`.JS.requestAnimationFrame{|time| _loop(time) }
end

.pauseObject

(DXOpal original) Pause & resume



36
37
38
39
40
# File 'lib/dxopal/window.rb', line 36

def self.pause
  @@paused = true
  @@draw_queue.clear
  draw_pause_screen
end

.paused?Boolean

Returns:

  • (Boolean)


41
# File 'lib/dxopal/window.rb', line 41

def self.paused?; @@paused; end

.real_fpsObject



131
# File 'lib/dxopal/window.rb', line 131

def self.real_fps; @@real_fps; end

.resumeObject



42
43
44
45
# File 'lib/dxopal/window.rb', line 42

def self.resume
  raise "Window.resume is called before Window.loop" if @@block.nil?
  @@paused = false; Window.loop(&@@block)
end

.widthObject



132
# File 'lib/dxopal/window.rb', line 132

def self.width; @@width; end

.width=(w) ⇒ Object

Set window width and resize the canvas Set `nil` to maximize canvas



135
136
137
138
139
140
# File 'lib/dxopal/window.rb', line 135

def self.width=(w)
  canvas = `document.getElementById("dxopal-canvas")`
  @@width = w || `window.innerWidth`
  `canvas.width = #{@@width}`
  `canvas.style.width = #{@@width}`
end