From 6f5ad9803f230fc399a37ba1d148f191f5323576 Mon Sep 17 00:00:00 2001 From: bionickatana Date: Wed, 17 Jun 2026 13:37:14 -0600 Subject: [PATCH] Added selectable gui elements --- assets/images/cursor.png | Bin 0 -> 832 bytes assets/images/cursor.xcf | Bin 0 -> 4278 bytes assets/images/delete.png | Bin 0 -> 550 bytes assets/images/delete.xcf | Bin 0 -> 5005 bytes .../images/{extrtactor.png => extractor.png} | Bin .../images/{extrtactor.xcf => extractor.xcf} | Bin main.rb | 52 ++++++++++++++++-- ui.rb | 48 ++++++++++++++-- 8 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 assets/images/cursor.png create mode 100644 assets/images/cursor.xcf create mode 100644 assets/images/delete.png create mode 100644 assets/images/delete.xcf rename assets/images/{extrtactor.png => extractor.png} (100%) rename assets/images/{extrtactor.xcf => extractor.xcf} (100%) diff --git a/assets/images/cursor.png b/assets/images/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..c5dbb41e47e78bab9b78611a1978ff9fe9e6baf3 GIT binary patch literal 832 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 literal 0 HcmV?d00001 diff --git a/assets/images/delete.xcf b/assets/images/delete.xcf new file mode 100644 index 0000000000000000000000000000000000000000..394260f40bae17f97989e5ab5076c5cd3330a509 GIT binary patch literal 5005 zcmd5=O>7)V6)xN3vEw*iJMpqYtf10am#Qhcv}?4H?7 z?1Vi~qgU_MtM^{LdiD2uI;QRMe#_u@v}%>1@C1nd0bl_zHiqgLV0s-a0+dBSE`d)a znB<;kEdL(xkq%6&E!Vb%6Qa$i^XR%S^iZ_ZaCLW~6 zK3xpLElcpgwaoU(nWE8Yxt8nCaFk+1a^+g#V&PojEH^Ay4;5aiab-h$!mp}n8}+)v zwUaQo`4k3Y#mMrL$i#9#@bs4Hba+L>I9mg)q@ng4Gvubz>WTm|eb+Do5yCOZXXuz5 z6s7K*RrwpdlZ+&7KVC0dWtIWr8d3jbBz_AH^SH8_6FGDJtKoW}}ZH*H8)wQ6le ztF2V(yi#4MXe&zx)qUAFJEo&s&tfBT{IYO5VOLpOs_x@$B>h#heIVg$0(-F+BB(d8 zcyMkX<2Uyd;EJY|EBh#X?cfSmyKd-~*6BpNip_>_k2W65rVDc(u?@|8qWyHy9W?T6 zD-_#!Ioj&+9#OGBG;L&9h7~ftKc(iL!^4WS>FH1k?)kzn`>Tpau?@Per|_O{tt#Cx z^j6AcCn)J{cT<#bt(A9W$~azSWvyA>wKH@!ZrWaHSGq*2kX(at{NavTsb5b|$o}5- z?I-!w*S!OI1S_T35Ax_huI$|qG$k@{CAoS27ZbRZjIC!daLEf>rL&%AnJt};WOY<% zAGf(au1wo;cU>O47|rtDeMwhsrcB+68}qXn<}gW5=!*b)3CC|zZyrF8s017*`pj#n z@z4T@Pm)SP14Y`zr!oUbX`Z3Kn4u46X!0zTKa!!J15M*i0mvW1BuAcpKB0lwOGHZ) z;1d}-n+V|XpL`R2@rxdceyCddmhi!%xlI1BNIb46c;sx|zuoh=(u|3|4QQPAgt}i;i+jH9JIbj$Y3KVWO%cO$yIEa#AlsJ8eTQm$$ z2a9{6gNWnB}E`spQYbGe}}RcoikX`wY*wavzb7ZZ z?TQU|$GMU+LfH!j#!yFynNC~uDF+#F@vbmC-HD_YHH=cx-r+6m%%8#V3ceI1t9-Q22@iVJi-WD~iWZ znBpL*bO?B@n#3$>#(AM<_Ju`BB$mU}EmIHpR+Lm?eL6j)aa<9O+6(B|ZR&wg+omsC zbZ2ra^uhdu^Xgl@AjF-{En$Q-q}x|*w=H;k3!Bhvf#vo>3tK(o2snaVA>k-9-knq` z+k#csRx{rO_`E>&lQFkr1?ogpE}{`A^ddsS8iOsoEbP? zL|U3uaKs#RFPXq*FQnL{;lUl3`miElcF z8+~JRP3#qXphO#m?&nOID`pxgnZ91h8!~r3?Ep^uK+bKXe90!{G++$RMjkK@$VD&# zJRv6&9`#88$&$_?HZ5mZUe1Dd1TYKwFq;BD?w?NNr_d&wlfYyzww;p`pvfkUOER(T zoV?FoXZOb!BiLqlq_m1*{&Bjt~oE#=P+u@A?7C*|e? z`RDl=_UQNnxN>QhNpl<$N0__-d~cRLdhWe(`RL#3VfN9_rTp%;e0vg_uSoeOdtJ(J z!^h|UF8}ozmj9#NsZX(;UrX7-;I$q3&Y?-R^9?C~1J~Y=^80Z3#ed2Np97wLM?N|` z!FJw~(#*5>m;WQ*#hZUi%HNJnu@Al{JJECI|W08oJ=!#N9SJf@As}nz`t!RX^N#JqfC&^)&psj%yC1^io)ptQh30gu& z30gvzNEa{$_)UhDIpioPRI(ZK9NKBHF!6K-UjR9r+NX(cI!TC7Id%gTPk>^Ma_n0%j%tpY N0Oi;lF^+Z%`!Dw9;bZ^+ literal 0 HcmV?d00001 diff --git a/assets/images/extrtactor.png b/assets/images/extractor.png similarity index 100% rename from assets/images/extrtactor.png rename to assets/images/extractor.png diff --git a/assets/images/extrtactor.xcf b/assets/images/extractor.xcf similarity index 100% rename from assets/images/extrtactor.xcf rename to assets/images/extractor.xcf diff --git a/main.rb b/main.rb index a8a98f2..2006e21 100644 --- a/main.rb +++ b/main.rb @@ -33,11 +33,15 @@ CAMERA_MIN_ZOOM = 16 # Boxes across CAMERA_MAX_ZOOM = 80 # Boxes across class NumFactory < Gosu::Window + attr_accessor :current_tool + def initialize super WIDTH, HEIGHT, :fullscreen => true self.caption = "Number factory" @background_color = Gosu::Color::BLUE + @cursor_image = Gosu::Image.new('assets/images/cursor.png') + @cursor = @cursor_image @camera_x = 0 @camera_y = 0 @@ -46,7 +50,13 @@ class NumFactory < Gosu::Window @camera_x_zoom_offset = WIDTH.to_f / (@camera_boxes * BOX_SIZE * 2).to_f @camera_y_zoom_offset = HEIGHT.to_f / (@camera_boxes * BOX_SIZE * 2).to_f - @ui = UI.new(WIDTH, HEIGHT) + @ui = UI.new(self, WIDTH, HEIGHT) + @current_tool = nil + @extractor_image = Gosu::Image.new('assets/images/extractor.png') + @belt_image = Gosu::Image.new('assets/images/belt.png') + @adder_image = Gosu::Image.new('assets/images/adder.png') + @delete_image = Gosu::Image.new('assets/images/delete.png') + @dialouges = [ #DialougeBox.new(0, 5, BOX_SIZE, BOX_SIZE, WIDTH, HEIGHT, 'this is some really good test text!', BOX_SIZE, 500) ] @@ -125,7 +135,11 @@ class NumFactory < Gosu::Window end - + # Disable cursor in the window + def needs_cursor? + false + end + def button_down(id) if id == Gosu::KB_ESCAPE close @@ -158,6 +172,9 @@ class NumFactory < Gosu::Window @camera_zoom = WIDTH.to_f / (@camera_boxes * BOX_SIZE).to_f @camera_x_zoom_offset = WIDTH.to_f / (@camera_boxes * BOX_SIZE * 2).to_f @camera_y_zoom_offset = HEIGHT.to_f / (@camera_boxes * BOX_SIZE * 2).to_f + elsif id == Gosu::KB_G + @cursor = @cursor_image + @current_tool = nil else super end @@ -224,8 +241,29 @@ class NumFactory < Gosu::Window consumer.update(delta_mult, @camera_x, @camera_y, @camera_zoom, self.mouse_x, self.mouse_y, mouse_used) end - @dialouges.each do |dialouge| - dialouge.update(delta_mult, @camera_zoom, self.mouse_x, self.mouse_y) + if !mouse_used + @dialouges.each do |dialouge| + dialouge.update(delta_mult, @camera_zoom, self.mouse_x, self.mouse_y) + end + end + + case @current_tool + when 'delete' + @cursor = @delete_image + @cursor_offset = @delete_image.height + #break + when 'belt' + @cursor = @belt_image + @cursor_offset = @belt_image.height + #break + when 'adder' + @cursor = @adder_image + @cursor_offset = @adder_image.height + #break + when 'extractor' + @cursor = @extractor_image + @cursor_offset = @extractor_image.height + #break end end @@ -278,6 +316,12 @@ class NumFactory < Gosu::Window Gosu::Image.from_text("Camera location: #{@camera_x}, #{@camera_y}", 20, font: FONT_PATH).draw(1600, 200, 1) Gosu::Image.from_text("Camera zoom: #{@camera_zoom}, #{@camera_x_zoom_offset}", 20, font: FONT_PATH).draw(1600, 225, 1) Gosu::Image.from_text("Camera viewport: (#{@camera_min_x}, #{@camera_min_y}) to (#{@camera_max_x}, #{@camera_max_y})", 20, font: FONT_PATH).draw(1600, 250, 1) + + if @cursor == @cursor_image + @cursor.draw(self.mouse_x - 16, self.mouse_y - 16, 10) + else + @cursor.draw(self.mouse_x - @cursor_offset, self.mouse_y - @cursor_offset, 10, BOX_SIZE / 32.0 * @camera_zoom, BOX_SIZE / 32.0 * @camera_zoom) + end end end diff --git a/ui.rb b/ui.rb index 8039b4e..1a83e3a 100644 --- a/ui.rb +++ b/ui.rb @@ -8,12 +8,19 @@ class UI # Setup for the UI # @param width [Integer] Width of screen in pixels # @param height [Integer] Height of the screen in pixels - def initialize(width, height) + def initialize(parent, width, height) + @parent = parent @width = width @height = height @tool_selector = [] @toolbar_width = width / 2 @toolbar_height = height / 9 + @tool_info = [ + ['extractor', 96], + ['belt', 32], + ['adder', 64], + ['delete', 32], + ] @tool_selector_image = Gosu.render(@toolbar_width, @toolbar_height) { Gosu.draw_rect( 0, @@ -22,15 +29,48 @@ class UI @toolbar_height, Gosu::Color.new(0xC0, 0xFF, 0xFF, 0xFF), 0) - Gosu::Image.from_text('tool selector', TEXT_SIZE, font: FONT_PATH).draw(TEXT_MARGIN, TEXT_MARGIN) + # Loop through the tools: + @tool_info.each_with_index do |path, idx| + Gosu::Image.new("assets/images/#{path[0]}.png").draw( + idx * (@toolbar_height + 2), + 2, + 0, + (@toolbar_height / path[1].to_f), + (@toolbar_height / path[1].to_f), + ) + end + } @x = (@width / 2) - (@toolbar_width / 2) @y = @height - @toolbar_height - + @mouse_down_last_update = false end def update(mouse_x, mouse_y) - false + managed = false + # Only check if we are clicking + if Gosu.button_down?(Gosu::MS_LEFT) + if !@mouse_down_last_update + puts 'mouse clicked' + @mouse_down_last_update = true + # Check if we are in the right y area: + if mouse_y > @y + # Check if we are within the right zone + mouse_x_inset = mouse_x - @x + if 0 < mouse_x_inset && mouse_x_inset < @toolbar_width + managed = true + item_index = mouse_x_inset / (@toolbar_height + 2) + if item_index < @tool_info.length + @parent.current_tool = @tool_info[item_index][0] + puts "Selected item!" + end + end + end + end + else + @mouse_down_last_update = false + end + return managed end def draw()