class MiniGL::Button
This class represents a button.
Attributes
The current state of the button.
The text of the button.
Public Class Methods
Creates a button.
Parameters:
- x
-
The x-coordinate where the button will be drawn in the screen.
- y
-
The y-coordinate where the button will be drawn in the screen.
- font
-
The
Gosu::Font
object that will be used to draw the button text. - text
-
The button text. Can be
nil
or empty. - img
-
A spritesheet containing four images in a column, representing, from top to bottom, the default state, the hover state (when the mouse is over the button), the pressed state (when the mouse button is down and the cursor is over the button) and the disabled state. If
nil
, thewidth
andheight
parameters must be provided. - text_color
-
Color of the button text, in hexadecimal RRGGBB format.
- disabled_text_color
-
Color of the button text, when it’s disabled, in hexadecimal RRGGBB format.
- over_text_color
-
Color of the button text, when the cursor is over it (hexadecimal RRGGBB).
- down_text_color
-
Color of the button text, when it is pressed (hexadecimal RRGGBB).
- center_x
-
Whether the button text should be horizontally centered in its area (the area is defined by the image size, if an image is given, or by the
width
andheight
parameters, otherwise). - center_y
-
Whether the button text should be vertically centered in its area (the area is defined by the image size, if an image is given, or by the
width
andheight
parameters, otherwise). - margin_x
-
The x offset, from the button x-coordinate, to draw the text. This parameter is used only if
center
is false. - margin_y
-
The y offset, from the button y-coordinate, to draw the text. This parameter is used only if
center
is false. - width
-
Width of the button clickable area. This parameter is used only if
img
isnil
. - height
-
Height of the button clickable area. This parameter is used only if
img
isnil
. - params
-
An object containing any parameters you want passed to the
action
block. When the button is clicked, the following is called:@action.call @params
Note that this doesn’t force you to declare a block that takes parameters.
- retro
-
Whether the image should be loaded with the ‘retro’ option set (see
Gosu::Image
for details). If the value is omitted, theRes.retro_images
value will be used. - scale_x
-
Horizontal scale to draw the component with.
- scale_y
-
Vertical scale to draw the component with.
- anchor
-
See parameter with the same name in
Panel#initialize
for details. - action
-
The block of code executed when the button is clicked (or by calling the
click
method).
Obs.: This method accepts named parameters, but x
and y
are mandatory (also, img
is mandatory when width
and height
are not provided, and vice-versa).
# File lib/minigl/forms.rb, line 274 def initialize(x, y = nil, font = nil, text = nil, img = nil, text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0, center_x = true, center_y = true, margin_x = 0, margin_y = 0, width = nil, height = nil, params = nil, retro = nil, scale_x = 1, scale_y = 1, anchor = nil, &action) if x.is_a? Hash y = x[:y] font = x[:font] text = x[:text] img = x[:img] text_color = x.fetch(:text_color, 0) disabled_text_color = x.fetch(:disabled_text_color, 0) over_text_color = x.fetch(:over_text_color, 0) down_text_color = x.fetch(:down_text_color, 0) center_x = x.fetch(:center_x, true) center_y = x.fetch(:center_y, true) margin_x = x.fetch(:margin_x, 0) margin_y = x.fetch(:margin_y, 0) width = x.fetch(:width, nil) height = x.fetch(:height, nil) params = x.fetch(:params, nil) retro = x.fetch(:retro, nil) scale_x = x.fetch(:scale_x, 1) scale_y = x.fetch(:scale_y, 1) anchor = x.fetch(:anchor, nil) x = x[:x] end retro = Res.retro_images if retro.nil? @scale_x = scale_x @scale_y = scale_y @img = if img; Res.imgs img, 1, 4, true, '.png', retro else; nil; end @w = if img; @img[0].width * @scale_x else; width * @scale_x; end @h = if img; @img[0].height * @scale_y else; height * @scale_y; end @anchor_offset_x = x; @anchor_offset_y = y @anchor, x, y = FormUtils.check_anchor(anchor, x, y, @w, @h) super x, y, font, text, text_color, disabled_text_color @over_text_color = over_text_color @down_text_color = down_text_color @center_x = center_x @center_y = center_y @margin_x = margin_x @margin_y = margin_y set_position(x, y) @action = action @params = params @state = :up @img_index = @enabled ? 0 : 3 end
Public Instance Methods
Executes the button click action.
# File lib/minigl/forms.rb, line 386 def click perform_action end
Draws the button in the screen.
Parameters:
- alpha
-
The opacity with which the button will be drawn. Allowed values vary between 0 (fully transparent) and 255 (fully opaque).
- z_index
-
The z-order to draw the object. Objects with larger z-orders will be drawn on top of the ones with smaller z-orders.
- color
-
Color to apply a filter to the image.
# File lib/minigl/forms.rb, line 411 def draw(alpha = 0xff, z_index = 0, color = 0xffffff) @z_index = z_index return unless @visible color = (alpha << 24) | color text_color = if @enabled if @state == :down @down_text_color else @state == :over ? @over_text_color : @text_color end else @disabled_text_color end text_color = (alpha << 24) | text_color @img[@img_index].draw @x, @y, z_index, @scale_x, @scale_y, color if @img if @text if @center_x or @center_y rel_x = @center_x ? 0.5 : 0 rel_y = @center_y ? 0.5 : 0 @font.draw_text_rel @text, @text_x, @text_y, z_index, rel_x, rel_y, @scale_x, @scale_y, text_color else @font.draw_text @text, @text_x, @text_y, z_index, @scale_x, @scale_y, text_color end end end
Sets the position of the button in the screen.
Parameters:
- x
-
The new x-coordinate for the button.
- y
-
The new y-coordinate for the button.
# File lib/minigl/forms.rb, line 395 def set_position(x, y) @text_x = @center_x ? x + @w / 2 : x @text_y = @center_y ? y + @h / 2 : y @text_x += @margin_x @text_y += @margin_y @x = x; @y = y end
Updates the button, checking the mouse movement and buttons to define the button state.
# File lib/minigl/forms.rb, line 335 def update return unless @enabled and @visible mouse_over = Mouse.over? @x, @y, @w, @h mouse_press = Mouse.button_pressed? :left mouse_rel = Mouse.button_released? :left if @state == :up if mouse_over @img_index = 1 @state = :over else @img_index = 0 end elsif @state == :over if not mouse_over @img_index = 0 @state = :up elsif mouse_press Mouse.add_click(@z_index || 0, lambda do @img_index = 2 @state = :down end) else @img_index = 1 end elsif @state == :down if not mouse_over @img_index = 0 @state = :down_out elsif mouse_rel @img_index = 1 @state = :over enqueue_action else @img_index = 2 end else # :down_out if mouse_over @img_index = 2 @state = :down elsif mouse_rel @img_index = 0 @state = :up else @img_index = 0 end end end
Private Instance Methods
# File lib/minigl/forms.rb, line 447 def enqueue_action Mouse.add_click(@z_index || 0, method(:perform_action)) end
# File lib/minigl/forms.rb, line 451 def perform_action @action.call(@params) if @action end