Added all the callbacks to Window and GameState, removed all but one usage of global variables ().

This commit is contained in:
2022-06-05 09:19:30 -05:00
parent 0a62e5180a
commit ca73a2d8e8
11 changed files with 178 additions and 97 deletions

View File

@@ -95,7 +95,7 @@ module CyberarmEngine
end end
def window def window
$window CyberarmEngine::Window.instance
end end
def control_down? def control_down?

View File

@@ -7,7 +7,7 @@ module CyberarmEngine
attr_reader :alpha attr_reader :alpha
def initialize(options = {}) def initialize(options = {})
$window.current_state.add_game_object(self) if options[:auto_manage] || options[:auto_manage].nil? window.current_state.add_game_object(self) if options[:auto_manage] || options[:auto_manage].nil?
@options = options @options = options
@image = options[:image] ? image(options[:image]) : nil @image = options[:image] ? image(options[:image]) : nil
@@ -55,9 +55,9 @@ module CyberarmEngine
if $debug if $debug
show_debug_heading show_debug_heading
$window.draw_circle(@position.x, @position.y, radius, 9999, @debug_color) Gosu.draw_circle(@position.x, @position.y, radius, 9999, @debug_color)
if @debug_text.text != "" if @debug_text.text != ""
$window.draw_rect(@debug_text.x - 10, (@debug_text.y - 10), @debug_text.width + 20, @debug_text.height + 20, Gosu.draw_rect(@debug_text.x - 10, (@debug_text.y - 10), @debug_text.width + 20, @debug_text.height + 20,
Gosu::Color.rgba(0, 0, 0, 200), 9999) Gosu::Color.rgba(0, 0, 0, 200), 9999)
@debug_text.draw @debug_text.draw
end end
@@ -102,13 +102,13 @@ module CyberarmEngine
end end
def _x_visible def _x_visible
x.between?(($window.width / 2) - @world_center_point.x, ($window.width / 2) + @world_center_point.x) || x.between?((window.width / 2) - @world_center_point.x, (window.width / 2) + @world_center_point.x) ||
x.between?((@world_center_point.x - $window.width / 2), ($window.width / 2) + @world_center_point.x) x.between?((@world_center_point.x - window.width / 2), (window.width / 2) + @world_center_point.x)
end end
def _y_visible def _y_visible
y.between?(($window.height / 2) - @world_center_point.y, ($window.height / 2) + @world_center_point.y) || y.between?((window.height / 2) - @world_center_point.y, (window.height / 2) + @world_center_point.y) ||
y.between?(@world_center_point.y - ($window.height / 2), ($window.height / 2) + @world_center_point.y) y.between?(@world_center_point.y - (window.height / 2), (window.height / 2) + @world_center_point.y)
end end
def heading(ahead_by = 100, _object = nil, angle_only = false) def heading(ahead_by = 100, _object = nil, angle_only = false)
@@ -153,10 +153,6 @@ module CyberarmEngine
@color = Gosu::Color.rgba(@color.red, @color.green, @color.blue, int) @color = Gosu::Color.rgba(@color.red, @color.green, @color.blue, int)
end end
def draw_rect(x, y, width, height, color, z = 0)
$window.draw_rect(x, y, width, height, color, z)
end
def button_up(id) def button_up(id)
end end
@@ -190,12 +186,12 @@ module CyberarmEngine
# Duplication... so DRY. # Duplication... so DRY.
def each_circle_collision(object, _resolve_with = :width, &block) def each_circle_collision(object, _resolve_with = :width, &block)
if object.class != Class && object.instance_of?(object.class) if object.class != Class && object.instance_of?(object.class)
$window.current_state.game_objects.select { |i| i.instance_of?(object.class) }.each do |o| window.current_state.game_objects.select { |i| i.instance_of?(object.class) }.each do |o|
distance = Gosu.distance(x, y, object.x, object.y) distance = Gosu.distance(x, y, object.x, object.y)
block.call(o, object) if distance <= radius + object.radius && block block.call(o, object) if distance <= radius + object.radius && block
end end
else else
list = $window.current_state.game_objects.select { |i| i.instance_of?(object) } list = window.current_state.game_objects.select { |i| i.instance_of?(object) }
list.each do |o| list.each do |o|
next if self == o next if self == o
@@ -206,9 +202,9 @@ module CyberarmEngine
end end
def destroy def destroy
if $window.current_state if window.current_state
$window.current_state.game_objects.each do |o| window.current_state.game_objects.each do |o|
$window.current_state.game_objects.delete(o) if o.is_a?(self.class) && o == self window.current_state.game_objects.delete(o) if o.is_a?(self.class) && o == self
end end
end end
end end
@@ -220,13 +216,13 @@ module CyberarmEngine
def self.each_circle_collision(object, _resolve_with = :width, &block) def self.each_circle_collision(object, _resolve_with = :width, &block)
if object.class != Class && object.instance_of?(object.class) if object.class != Class && object.instance_of?(object.class)
$window.current_state.game_objects.select { |i| i.instance_of?(self) }.each do |o| window.current_state.game_objects.select { |i| i.instance_of?(self) }.each do |o|
distance = Gosu.distance(o.x, o.y, object.x, object.y) distance = Gosu.distance(o.x, o.y, object.x, object.y)
block.call(o, object) if distance <= o.radius + object.radius && block block.call(o, object) if distance <= o.radius + object.radius && block
end end
else else
lista = $window.current_state.game_objects.select { |i| i.instance_of?(self) } lista = window.current_state.game_objects.select { |i| i.instance_of?(self) }
listb = $window.current_state.game_objects.select { |i| i.instance_of?(object) } listb = window.current_state.game_objects.select { |i| i.instance_of?(object) }
lista.product(listb).each do |o, o2| lista.product(listb).each do |o, o2|
next if o == o2 next if o == o2
@@ -238,9 +234,9 @@ module CyberarmEngine
def self.destroy_all def self.destroy_all
INSTANCES.clear INSTANCES.clear
if $window.current_state if window.current_state
$window.current_state.game_objects.each do |o| window.current_state.game_objects.each do |o|
$window.current_state.game_objects.delete(o) if o.is_a?(self.class) window.current_state.game_objects.delete(o) if o.is_a?(self.class)
end end
end end
end end

View File

@@ -9,7 +9,7 @@ module CyberarmEngine
@options = options @options = options
@game_objects = [] @game_objects = []
@global_pause = false @global_pause = false
$window.text_input = nil unless options[:preserve_text_input] window.text_input = nil unless options[:preserve_text_input]
@down_keys = {} @down_keys = {}
end end
@@ -30,48 +30,23 @@ module CyberarmEngine
@game_objects.each(&:update) @game_objects.each(&:update)
end end
def draw_bounding_box(box) def needs_redraw?
x = box.x true
y = box.y
max_x = box.max_x
max_y = box.max_y
color = Gosu::Color.rgba(255, 127, 64, 240)
# pipe = 4
# Gosu.draw_rect(x-width, y-height, x+(width*2), y+(height*2), color, Float::INFINITY)
# puts "BB render: #{x}:#{y} w:#{x.abs+width} h:#{y.abs+height}"
# Gosu.draw_rect(x, y, x.abs+width, y.abs+height, color, Float::INFINITY)
# TOP LEFT to BOTTOM LEFT
$window.draw_line(
x, y, color,
x, max_y, color,
Float::INFINITY
)
# BOTTOM LEFT to BOTTOM RIGHT
$window.draw_line(
x, max_y, color,
max_x, max_y, color,
Float::INFINITY
)
# BOTTOM RIGHT to TOP RIGHT
$window.draw_line(
max_x, max_y, color,
max_x, y, color,
Float::INFINITY
)
# TOP RIGHT to TOP LEFT
$window.draw_line(
max_x, y, color,
x, y, color,
Float::INFINITY
)
end end
def destroy def drop(filename)
@options.clear end
@game_objects.clear
def gamepad_connected(index)
end
def gamepad_disconnected(index)
end
def gain_focus
end
def lose_focus
end end
def button_down(id) def button_down(id)
@@ -90,6 +65,54 @@ module CyberarmEngine
end end
end end
def close
window.close!
end
def draw_bounding_box(box)
x = box.x
y = box.y
max_x = box.max_x
max_y = box.max_y
color = Gosu::Color.rgba(255, 127, 64, 240)
# pipe = 4
# Gosu.draw_rect(x-width, y-height, x+(width*2), y+(height*2), color, Float::INFINITY)
# puts "BB render: #{x}:#{y} w:#{x.abs+width} h:#{y.abs+height}"
# Gosu.draw_rect(x, y, x.abs+width, y.abs+height, color, Float::INFINITY)
# TOP LEFT to BOTTOM LEFT
Gosu.draw_line(
x, y, color,
x, max_y, color,
Float::INFINITY
)
# BOTTOM LEFT to BOTTOM RIGHT
Gosu.draw_line(
x, max_y, color,
max_x, max_y, color,
Float::INFINITY
)
# BOTTOM RIGHT to TOP RIGHT
Gosu.draw_line(
max_x, max_y, color,
max_x, y, color,
Float::INFINITY
)
# TOP RIGHT to TOP LEFT
Gosu.draw_line(
max_x, y, color,
x, y, color,
Float::INFINITY
)
end
def destroy
@options.clear
@game_objects.clear
end
def add_game_object(object) def add_game_object(object)
@game_objects << object @game_objects << object
end end

View File

@@ -4,7 +4,7 @@ module CyberarmEngine
def initialize def initialize
@bounding_box_renderer = BoundingBoxRenderer.new @bounding_box_renderer = BoundingBoxRenderer.new
@opengl_renderer = OpenGLRenderer.new(width: $window.width, height: $window.height) @opengl_renderer = OpenGLRenderer.new(width: CyberarmEngine::Window.instance.width, height: CyberarmEngine::Window.instance.height)
end end
def draw(camera, lights, entities) def draw(camera, lights, entities)

View File

@@ -43,9 +43,9 @@ module CyberarmEngine
when :left when :left
@x = 0 + BUTTON_PADDING @x = 0 + BUTTON_PADDING
when :center when :center
@x = ($window.width / 2) - (@textobject.text_width(@text) / 2) @x = (CyberarmEngine::Window.instance.width / 2) - (@textobject.text_width(@text) / 2)
when :right when :right
@x = $window.width - BUTTON_PADDING - @textobject.text_width(@text) @x = CyberarmEngine::Window.instance.width - BUTTON_PADDING - @textobject.text_width(@text)
end end
end end
end end

View File

@@ -116,7 +116,7 @@ module CyberarmEngine
end end
private def element_parent private def element_parent
$__current_container__ CyberarmEngine::Element::Container.current_container
end end
private def container(klass, options = {}, &block) private def container(klass, options = {}, &block)
@@ -126,12 +126,12 @@ module CyberarmEngine
_container = klass.new(options, block) _container = klass.new(options, block)
old_parent = element_parent old_parent = element_parent
$__current_container__ = _container CyberarmEngine::Element::Container.current_container = _container
_container.build _container.build
_container.parent.add(_container) _container.parent.add(_container)
$__current_container__ = old_parent CyberarmEngine::Element::Container.current_container = old_parent
_container _container
end end

View File

@@ -6,6 +6,16 @@ module CyberarmEngine
attr_accessor :stroke_color, :fill_color attr_accessor :stroke_color, :fill_color
attr_reader :children, :gui_state, :scroll_position attr_reader :children, :gui_state, :scroll_position
def self.current_container
@@current_container
end
def self.current_container=(container)
raise ArgumentError, "Expected container to an an instance of CyberarmEngine::Element::Container, got #{container.class}" unless container.is_a?(CyberarmEngine::Element::Container)
@@current_container = container
end
def initialize(options = {}, block = nil) def initialize(options = {}, block = nil)
@gui_state = options.delete(:gui_state) @gui_state = options.delete(:gui_state)
super super
@@ -35,23 +45,23 @@ module CyberarmEngine
def clear(&block) def clear(&block)
@children.clear @children.clear
old_container = $__current_container__ old_container = CyberarmEngine::Element::Container.current_container
$__current_container__ = self CyberarmEngine::Element::Container.current_container = self
block.call(self) if block block.call(self) if block
$__current_container__ = old_container CyberarmEngine::Element::Container.current_container = old_container
root.gui_state.request_recalculate root.gui_state.request_recalculate
end end
def append(&block) def append(&block)
old_container = $__current_container__ old_container = CyberarmEngine::Element::Container.current_container
$__current_container__ = self CyberarmEngine::Element::Container.current_container = self
block.call(self) if block block.call(self) if block
$__current_container__ = old_container CyberarmEngine::Element::Container.current_container = old_container
root.gui_state.request_recalculate root.gui_state.request_recalculate
end end

View File

@@ -35,7 +35,7 @@ module CyberarmEngine
super super
w = @text.textobject.text_width("") w = @text.textobject.text_width("")
@text.textobject.draw("", @x + content_width - w, @y + @style.padding_top, @z, 1, 1, @text.color) @text.textobject.draw_text("", @x + content_width - w, @y + @style.padding_top, @z, 1, 1, @text.color)
end end
def choose=(item) def choose=(item)

View File

@@ -12,7 +12,7 @@ module CyberarmEngine
@root_container = Element::Stack.new(gui_state: self) @root_container = Element::Stack.new(gui_state: self)
@game_objects << @root_container @game_objects << @root_container
$__current_container__ = @root_container CyberarmEngine::Element::Container.current_container = @root_container
@active_width = window.width @active_width = window.width
@active_height = window.height @active_height = window.height
@@ -90,6 +90,8 @@ module CyberarmEngine
@menu&.update @menu&.update
super super
return unless window.has_focus?
new_mouse_over = @menu.hit_element?(window.mouse_x, window.mouse_y) if @menu new_mouse_over = @menu.hit_element?(window.mouse_x, window.mouse_y) if @menu
new_mouse_over ||= @root_container.hit_element?(window.mouse_x, window.mouse_y) new_mouse_over ||= @root_container.hit_element?(window.mouse_x, window.mouse_y)
@@ -135,10 +137,6 @@ module CyberarmEngine
@active_height = window.height @active_height = window.height
end end
def tool_tip_delay
250 # ms
end
def button_down(id) def button_down(id)
super super
@@ -175,6 +173,10 @@ module CyberarmEngine
@focus.button_up(id) if @focus.respond_to?(:button_up) @focus.button_up(id) if @focus.respond_to?(:button_up)
end end
def tool_tip_delay
@tip.style.delay || 250 # ms
end
def redirect_mouse_button(button) def redirect_mouse_button(button)
hide_menu unless @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu) hide_menu unless @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu)

View File

@@ -154,6 +154,7 @@ module CyberarmEngine
}, },
ToolTip: { # < TextBlock ToolTip: { # < TextBlock
delay: 100, # ms
color: Gosu::Color::WHITE, color: Gosu::Color::WHITE,
padding_top: 4, padding_top: 4,
padding_bottom: 4, padding_bottom: 4,

View File

@@ -8,21 +8,33 @@ module CyberarmEngine
attr_accessor :show_cursor attr_accessor :show_cursor
attr_writer :exit_on_opengl_error attr_writer :exit_on_opengl_error
attr_reader :last_frame_time attr_reader :last_frame_time, :states
def self.now def self.now
Gosu.milliseconds Gosu.milliseconds
end end
def self.dt def self.dt
$window.last_frame_time / 1000.0 instance.last_frame_time / 1000.0
end
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
def self.instance
@@instance
end end
def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false) def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false)
@show_cursor = false @show_cursor = false
@has_focus = false
super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless) super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless)
$window = self Window.instance = self
@last_frame_time = Gosu.milliseconds - 1 @last_frame_time = Gosu.milliseconds - 1
@current_frame_time = Gosu.milliseconds @current_frame_time = Gosu.milliseconds
self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.language}" self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.language}"
@@ -34,13 +46,14 @@ module CyberarmEngine
end end
def draw def draw
current_state.draw if current_state current_state&.draw
end end
def update def update
Stats.clear Stats.clear
current_state.update if current_state current_state&.update
@last_frame_time = Gosu.milliseconds - @current_frame_time @last_frame_time = Gosu.milliseconds - @current_frame_time
@current_frame_time = Gosu.milliseconds @current_frame_time = Gosu.milliseconds
end end
@@ -49,6 +62,48 @@ module CyberarmEngine
@show_cursor @show_cursor
end end
def needs_redraw?
current_state ? current_state.needs_redraw? : true
end
def drop(filename)
current_state&.drop(filename)
end
def gamepad_connected(index)
current_state&.gamepad_connected(index)
end
def gamepad_disconnected(index)
current_state&.gamepad_disconnected(index)
end
def gain_focus
@has_focus = true
current_state&.gain_focus
end
def lose_focus
@has_focus = false
current_state&.lose_focus
end
def button_down(id)
super
current_state&.button_down(id)
end
def button_up(id)
super
current_state&.button_up(id)
end
def close
current_state ? current_state.close : super
end
def dt def dt
@last_frame_time / 1000.0 @last_frame_time / 1000.0
end end
@@ -61,16 +116,6 @@ module CyberarmEngine
@exit_on_opengl_error @exit_on_opengl_error
end end
def button_down(id)
super
current_state.button_down(id) if current_state
end
def button_up(id)
super
current_state.button_up(id) if current_state
end
def push_state(klass, options = {}) def push_state(klass, options = {})
options = { setup: true }.merge(options) options = { setup: true }.merge(options)
@@ -108,6 +153,10 @@ module CyberarmEngine
@states.shift @states.shift
end end
def has_focus?
@has_focus
end
# Sourced from https://gist.github.com/ippa/662583 # Sourced from https://gist.github.com/ippa/662583
def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10) def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
0.step(360, step) do |a1| 0.step(360, step) do |a1|