Module: MiniGL::Mouse

Defined in:
lib/minigl/global.rb

Overview

Exposes methods for controlling mouse events.

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.xObject (readonly)

The current x-coordinate of the mouse cursor in the screen.



390
391
392
# File 'lib/minigl/global.rb', line 390

def x
  @x
end

.yObject (readonly)

The current y-coordinate of the mouse cursor in the screen.



393
394
395
# File 'lib/minigl/global.rb', line 393

def y
  @y
end

Class Method Details

.add_click(z_index, action) ⇒ Object

:nodoc:



496
497
498
499
500
# File 'lib/minigl/global.rb', line 496

def add_click(z_index, action)
  return if @click && @click[:z_index] > z_index

  @click = { z_index: z_index, action: action }
end

.button_down?(btn) ⇒ Boolean

Returns whether the given button is down in the current frame.

Parameters:

btn

Button to be checked. Valid values are :left, :middle and :right

Returns:

  • (Boolean)


453
454
455
# File 'lib/minigl/global.rb', line 453

def button_down?(btn)
  @down[btn]
end

.button_pressed?(btn) ⇒ Boolean

Returns whether the given button is down in the current frame and was not down in the frame before.

Parameters:

btn

Button to be checked. Valid values are :left, :middle and :right

Returns:

  • (Boolean)


444
445
446
# File 'lib/minigl/global.rb', line 444

def button_pressed?(btn)
  @down[btn] and not @prev_down[btn]
end

.button_released?(btn) ⇒ Boolean

Returns whether the given button is not down in the current frame, but was down in the frame before.

Parameters:

btn

Button to be checked. Valid values are :left, :middle and :right

Returns:

  • (Boolean)


463
464
465
# File 'lib/minigl/global.rb', line 463

def button_released?(btn)
  @prev_down[btn] and not @down[btn]
end

.double_click?(btn) ⇒ Boolean

Returns whether the given button has just been double clicked.

Parameters:

btn

Button to be checked. Valid values are :left, :middle and :right

Returns:

  • (Boolean)


472
473
474
# File 'lib/minigl/global.rb', line 472

def double_click?(btn)
  @dbl_click[btn]
end

.initializeObject

This is called by GameWindow.initialize. Don’t call it explicitly.



397
398
399
400
401
402
403
# File 'lib/minigl/global.rb', line 397

def initialize
  @down = {}
  @prev_down = {}
  @next_down = {}
  @dbl_click = {}
  @dbl_click_timer = {}
end

.over?(x, y = nil, w = nil, h = nil) ⇒ Boolean

Returns whether the mouse cursor is currently inside the given area.

Parameters:

x

The x-coordinate of the top left corner of the area.

y

The y-coordinate of the top left corner of the area.

w

The width of the area.

h

The height of the area.

Alternate syntax

over?(rectangle)

Parameters:

rectangle

A rectangle representing the area to be checked.

Returns:

  • (Boolean)


490
491
492
493
# File 'lib/minigl/global.rb', line 490

def over?(x, y = nil, w = nil, h = nil)
  return @x >= x.x && @x < x.x + x.w && @y >= x.y && @y < x.y + x.h if x.is_a? Rectangle
  @x >= x && @x < x + w && @y >= y && @y < y + h
end

.register_button_down(id) ⇒ Object

:nodoc:



503
504
505
506
# File 'lib/minigl/global.rb', line 503

def register_button_down(id)
  key = key_from_id(id)
  @next_down[key] = 1 if key
end

.register_button_up(id) ⇒ Object

:nodoc:



509
510
511
512
# File 'lib/minigl/global.rb', line 509

def register_button_up(id)
  key = key_from_id(id)
  @next_down[key] = 0 if key && @next_down[key]
end

.updateObject

Updates the mouse position and the state of all buttons.



406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
# File 'lib/minigl/global.rb', line 406

def update
  @prev_down = @down.clone
  @down = @next_down.clone
  @next_down.delete_if { |_, v| v.zero? }
  @dbl_click.clear

  if @click
    @click[:action].call
    @click = nil
  end

  @dbl_click_timer.each do |k, v|
    if v < G.double_click_delay
      @dbl_click_timer[k] += 1
    else
      @dbl_click_timer.delete(k)
    end
  end

  %i[left middle right].each do |key|
    if @down[key]
      @dbl_click[key] = true if @dbl_click_timer[key]
      @dbl_click_timer.delete(key)
    elsif @prev_down[key]
      @dbl_click_timer[key] = 0
    end
  end

  @x = G.window.mouse_x.round
  @y = G.window.mouse_y.round
end