Class: CyberarmEngine::Window

Inherits:
Gosu::Window
  • Object
show all
Includes:
Common
Defined in:
lib/cyberarm_engine/window.rb

Constant Summary collapse

IMAGES =
{}
SAMPLES =
{}
SONGS =
{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Common

#alt_down?, #control_down?, #darken, #draw_rect, #fill, #find_element_by_tag, #get_asset, #get_image, #get_sample, #get_song, #lighten, #opacity, #previous_state, #shift_down?, #window

Constructor Details

#initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false) ⇒ Window

Returns a new instance of Window.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/cyberarm_engine/window.rb', line 31

def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false)
  @show_cursor = false
  @has_focus = false
  @show_stats_plotter = false

  super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless)
  Window.instance = self

  @last_frame_time = Gosu.milliseconds - 1
  @current_frame_time = Gosu.milliseconds
  @delta_time = @last_frame_time
  self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.user_languages.join(', ')}"

  @states = []
  @exit_on_opengl_error = false
  preload_default_shaders if respond_to?(:preload_default_shaders)
  @stats_plotter = Stats::StatsPlotter.new(2, 28) # FIXME: Make positioning easy

  setup
end

Instance Attribute Details

#delta_timeObject (readonly)

Returns the value of attribute delta_time.



11
12
13
# File 'lib/cyberarm_engine/window.rb', line 11

def delta_time
  @delta_time
end

#exit_on_opengl_error=(value) ⇒ Object (writeonly)

Sets the attribute exit_on_opengl_error

Parameters:

  • value

    the value to set the attribute exit_on_opengl_error to.



10
11
12
# File 'lib/cyberarm_engine/window.rb', line 10

def exit_on_opengl_error=(value)
  @exit_on_opengl_error = value
end

#last_frame_timeObject (readonly)

Returns the value of attribute last_frame_time.



11
12
13
# File 'lib/cyberarm_engine/window.rb', line 11

def last_frame_time
  @last_frame_time
end

#show_cursorObject

Returns the value of attribute show_cursor.



9
10
11
# File 'lib/cyberarm_engine/window.rb', line 9

def show_cursor
  @show_cursor
end

#show_stats_plotterObject

Returns the value of attribute show_stats_plotter.



9
10
11
# File 'lib/cyberarm_engine/window.rb', line 9

def show_stats_plotter
  @show_stats_plotter
end

#statesObject (readonly)

Returns the value of attribute states.



11
12
13
# File 'lib/cyberarm_engine/window.rb', line 11

def states
  @states
end

Class Method Details

.dtObject



17
18
19
# File 'lib/cyberarm_engine/window.rb', line 17

def self.dt
  instance.dt
end

.instanceObject



27
28
29
# File 'lib/cyberarm_engine/window.rb', line 27

def self.instance
  @@instance
end

.instance=(window) ⇒ Object

Raises:

  • (ArgumentError)


21
22
23
24
25
# File 'lib/cyberarm_engine/window.rb', line 21

def self.instance=(window)
  raise ArgumentError, "Expected window to be a subclass of CyberarmEngine::Window, got: #{window.class}" unless window.is_a?(CyberarmEngine::Window)

  @@instance = window
end

.nowObject



13
14
15
# File 'lib/cyberarm_engine/window.rb', line 13

def self.now
  Gosu.milliseconds
end

Instance Method Details

#aspect_ratioObject



137
138
139
# File 'lib/cyberarm_engine/window.rb', line 137

def aspect_ratio
  width / height.to_f
end

#button_down(id) ⇒ Object



119
120
121
122
# File 'lib/cyberarm_engine/window.rb', line 119

def button_down(id)
  super
  current_state&.button_down(id)
end

#button_up(id) ⇒ Object



124
125
126
127
# File 'lib/cyberarm_engine/window.rb', line 124

def button_up(id)
  super
  current_state&.button_up(id)
end

#closeObject



129
130
131
# File 'lib/cyberarm_engine/window.rb', line 129

def close
  current_state ? current_state.close : super
end

#current_stateObject



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

def current_state
  @states.last
end

#drawObject



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/cyberarm_engine/window.rb', line 55

def draw
  Stats.frame.start_timing(:draw)

  current_state&.draw
  Stats.frame.start_timing(:engine_stats_renderer)
  @stats_plotter&.draw if @show_stats_plotter
  Stats.frame.end_timing(:engine_stats_renderer)

  Stats.frame.end_timing(:draw)
  Stats.frame.start_timing(:interframe_sleep)
end

#draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10) ⇒ Object



187
188
189
190
191
192
193
# File 'lib/cyberarm_engine/window.rb', line 187

def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
  0.step(360, step) do |a1|
    a2 = a1 + step
    draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r),
              cy + Gosu.offset_y(a2, r), color, z)
  end
end

#drop(filename) ⇒ Object



95
96
97
# File 'lib/cyberarm_engine/window.rb', line 95

def drop(filename)
  current_state&.drop(filename)
end

#dtObject



133
134
135
# File 'lib/cyberarm_engine/window.rb', line 133

def dt
  @last_frame_time / 1000.0
end

#exit_on_opengl_error?Boolean

Returns:

  • (Boolean)


141
142
143
# File 'lib/cyberarm_engine/window.rb', line 141

def exit_on_opengl_error?
  @exit_on_opengl_error
end

#gain_focusObject



107
108
109
110
111
# File 'lib/cyberarm_engine/window.rb', line 107

def gain_focus
  @has_focus = true

  current_state&.gain_focus
end

#gamepad_connected(index) ⇒ Object



99
100
101
# File 'lib/cyberarm_engine/window.rb', line 99

def gamepad_connected(index)
  current_state&.gamepad_connected(index)
end

#gamepad_disconnected(index) ⇒ Object



103
104
105
# File 'lib/cyberarm_engine/window.rb', line 103

def gamepad_disconnected(index)
  current_state&.gamepad_disconnected(index)
end

#has_focus?Boolean

Returns:

  • (Boolean)


182
183
184
# File 'lib/cyberarm_engine/window.rb', line 182

def has_focus?
  @has_focus
end

#lose_focusObject



113
114
115
116
117
# File 'lib/cyberarm_engine/window.rb', line 113

def lose_focus
  @has_focus = false

  current_state&.lose_focus
end

#needs_cursor?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/cyberarm_engine/window.rb', line 87

def needs_cursor?
  @show_cursor
end

#needs_redraw?Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/cyberarm_engine/window.rb', line 91

def needs_redraw?
  current_state ? current_state.needs_redraw? : true
end

#pop_stateObject



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

def pop_state
  @states.pop

  current_state.request_repaint if current_state&.is_a?(GuiState)
end

#push_state(klass, options = {}) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/cyberarm_engine/window.rb', line 145

def push_state(klass, options = {})
  options = { setup: true }.merge(options)

  if klass.instance_of?(klass.class) && klass.respond_to?(:options)
    @states << klass
    klass.setup if options[:setup]
    klass.post_setup if options[:setup]
  else
    @states << klass.new(options) if child_of?(klass, GameState)
    @states << klass.new if child_of?(klass, Element::Container)
    current_state.setup if current_state.instance_of?(klass) && options[:setup]
    current_state.post_setup if current_state.instance_of?(klass) && options[:setup]
  end
end

#setupObject



52
53
# File 'lib/cyberarm_engine/window.rb', line 52

def setup
end

#shift_stateObject



176
177
178
179
180
# File 'lib/cyberarm_engine/window.rb', line 176

def shift_state
  @states.shift

  current_state.request_repaint if current_state&.is_a?(GuiState)
end

#updateObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/cyberarm_engine/window.rb', line 67

def update
  # Gosu calls update() then (optionally) draw(),
  # so always end last frame and start next frame when update() is called.
  Stats.frame&.end_timing(:interframe_sleep)
  Stats.end_frame

  Stats.new_frame

  @delta_time = (Gosu.milliseconds - @current_frame_time) * 0.001

  @last_frame_time = Gosu.milliseconds - @current_frame_time
  @current_frame_time = Gosu.milliseconds

  Stats.frame.start_timing(:update)
  current_state&.update
  Stats.frame.end_timing(:update)

  Stats.frame.start_timing(:interframe_sleep) unless needs_redraw?
end