Class: RbSDL2::Keyboard::State

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/rb_sdl2/keyboard/state.rb

Overview

SDL 内部にあるキーボードのキースイッチング配列へアクセスします。 キースイッチング状態は SDL_PumpEvents() が呼び出さられたときに更新されます。

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeState

SDL ロード前に呼び出すとエラーになる。その際にインスタンスは作成されない。

Raises:



10
11
12
13
14
15
16
17
18
# File 'lib/rb_sdl2/keyboard/state.rb', line 10

def initialize
  num_keys = ::FFI::MemoryPointer.new(:int)
  # SDL_GetKeyboardState() が戻すポインターは SDL がロードされた時点で作成されるため不変と考えてよい。
  # この関数は SDL_Init() より前に呼ぶことができる。
  # 引数に NULL ポインターを与えた場合にエラーを戻す。
  @ptr = ::SDL.GetKeyboardState(num_keys)
  raise RbSDL2Error if @ptr.null?
  @size = num_keys.read_int
end

Instance Attribute Details

#sizeObject (readonly) Also known as: length

Returns the value of attribute size.



30
31
32
# File 'lib/rb_sdl2/keyboard/state.rb', line 30

def size
  @size
end

Instance Method Details

#[](nth) ⇒ Object Also known as: scancode?

nth に該当するスキャンコードのキーが押されているか調べます。 nth のキーが押されている場合に nth を戻します。 nth のキーが押されていない、nth が範囲外の場合は nil を戻します。



23
# File 'lib/rb_sdl2/keyboard/state.rb', line 23

def [](nth) = 0 <= nth && nth < size && @ptr[nth].read_uint8 == ::SDL::PRESSED ? nth : nil

#any?Boolean

Returns:

  • (Boolean)


26
# File 'lib/rb_sdl2/keyboard/state.rb', line 26

def any? = to_str.bytes.any? { |n| n == ::SDL::PRESSED }

#eachObject



28
# File 'lib/rb_sdl2/keyboard/state.rb', line 28

def each = block_given? ? size.times { |i| yield(self[i]) } : to_enum

#to_aObject

現在キーボードの押されている全てのキーに対応するスキャンコードを配列で戻します。



36
# File 'lib/rb_sdl2/keyboard/state.rb', line 36

def to_a = to_str.bytes.with_index.inject([]) { |a, (n, i)| n == ::SDL::PRESSED ? a << i : a }

#to_strObject



33
# File 'lib/rb_sdl2/keyboard/state.rb', line 33

def to_str = @ptr.read_bytes(size)