module DXOpal::Window

Public Class Methods

_img() click to toggle source

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

# File lib/dxopal/window.rb, line 127
def self._img; @@img; end
_init() click to toggle source
# 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) click to toggle source

(internal) call @@block periodically

# 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
bgcolor() click to toggle source
# File lib/dxopal/window.rb, line 151
def self.bgcolor; @@bgcolor; end
bgcolor=(col) click to toggle source
# File lib/dxopal/window.rb, line 152
def self.bgcolor=(col); @@bgcolor = col; end
draw(x, y, image, z=0) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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={}) click to toggle source
# 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={}) click to toggle source
# 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) click to toggle source
# 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_screen() click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source

(internal)

# File lib/dxopal/window.rb, line 209
def self.enqueue_draw(z, *args)
  @@draw_queue.push([z, @@draw_queue.length, *args])
end
fps() click to toggle source
# File lib/dxopal/window.rb, line 129
def self.fps; @@fps; end
fps=(w) click to toggle source
# File lib/dxopal/window.rb, line 130
def self.fps=(w); @@fps = w; end
height() click to toggle source
# File lib/dxopal/window.rb, line 141
def self.height; @@height; end
height=(h) click to toggle source

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

# 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) click to toggle source

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

# File lib/dxopal/window.rb, line 18
def self.load_resources(&block)
  RemoteResource._load_resources do
    DXOpal.dump_error(&block)
  end
end
loop(&block) click to toggle source

Start main loop

When called twice, previous loop is stopped (this is useful when implementing interactive game editor, etc.)

# 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
pause() click to toggle source

(DXOpal original) Pause & resume

# File lib/dxopal/window.rb, line 36
def self.pause
  @@paused = true
  @@draw_queue.clear
  draw_pause_screen
end
paused?() click to toggle source
# File lib/dxopal/window.rb, line 41
def self.paused?; @@paused; end
real_fps() click to toggle source
# File lib/dxopal/window.rb, line 131
def self.real_fps; @@real_fps; end
resume() click to toggle source
# 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
width() click to toggle source
# File lib/dxopal/window.rb, line 132
def self.width; @@width; end
width=(w) click to toggle source

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

# 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