SDLRuby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/Rakefile +12 -0
- data/lib/SDLRuby/audio.rb +65 -0
- data/lib/SDLRuby/cursor.rb +46 -0
- data/lib/SDLRuby/display.rb +79 -0
- data/lib/SDLRuby/event/accessor.rb +127 -0
- data/lib/SDLRuby/event/type.rb +75 -0
- data/lib/SDLRuby/event.rb +80 -0
- data/lib/SDLRuby/font.rb +227 -0
- data/lib/SDLRuby/hint.rb +36 -0
- data/lib/SDLRuby/image/image.rb +23 -0
- data/lib/SDLRuby/image/include/SDL_image.h.rb +61 -0
- data/lib/SDLRuby/image.rb +69 -0
- data/lib/SDLRuby/keyboard.rb +58 -0
- data/lib/SDLRuby/mixer/channel.rb +43 -0
- data/lib/SDLRuby/mixer/chunk.rb +49 -0
- data/lib/SDLRuby/mixer/controller.rb +44 -0
- data/lib/SDLRuby/mixer/include/SDL_mixer.h.rb +95 -0
- data/lib/SDLRuby/mixer/sdl_mixer.rb +60 -0
- data/lib/SDLRuby/mixer.rb +87 -0
- data/lib/SDLRuby/mouse.rb +52 -0
- data/lib/SDLRuby/music.rb +158 -0
- data/lib/SDLRuby/palette.rb +49 -0
- data/lib/SDLRuby/pixel_formatter.rb +67 -0
- data/lib/SDLRuby/rect.rb +11 -0
- data/lib/SDLRuby/renderer/accessor.rb +70 -0
- data/lib/SDLRuby/renderer/drawer.rb +107 -0
- data/lib/SDLRuby/renderer/renderer_info.rb +27 -0
- data/lib/SDLRuby/renderer.rb +101 -0
- data/lib/SDLRuby/rw_ops/rw_object.rb +128 -0
- data/lib/SDLRuby/rw_ops.rb +216 -0
- data/lib/SDLRuby/sdl/include/SDL.h.rb +33 -0
- data/lib/SDLRuby/sdl/include/SDL_audio.h.rb +49 -0
- data/lib/SDLRuby/sdl/include/SDL_blendmode.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_clipboard.h.rb +10 -0
- data/lib/SDLRuby/sdl/include/SDL_config.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_cpuinfo.h.rb +27 -0
- data/lib/SDLRuby/sdl/include/SDL_endian.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_error.h.rb +9 -0
- data/lib/SDLRuby/sdl/include/SDL_events.h.rb +32 -0
- data/lib/SDLRuby/sdl/include/SDL_filesystem.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_gamecontroller.h.rb +66 -0
- data/lib/SDLRuby/sdl/include/SDL_gesture.h.rb +12 -0
- data/lib/SDLRuby/sdl/include/SDL_guid.h.rb +7 -0
- data/lib/SDLRuby/sdl/include/SDL_hints.h.rb +14 -0
- data/lib/SDLRuby/sdl/include/SDL_joystick.h.rb +69 -0
- data/lib/SDLRuby/sdl/include/SDL_keyboard.h.rb +26 -0
- data/lib/SDLRuby/sdl/include/SDL_keycode.h.rb +7 -0
- data/lib/SDLRuby/sdl/include/SDL_locale.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_main.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_messagebox.h.rb +10 -0
- data/lib/SDLRuby/sdl/include/SDL_misc.h.rb +5 -0
- data/lib/SDLRuby/sdl/include/SDL_mouse.h.rb +26 -0
- data/lib/SDLRuby/sdl/include/SDL_pixels.h.rb +25 -0
- data/lib/SDLRuby/sdl/include/SDL_platform.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_power.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_rect.h.rb +17 -0
- data/lib/SDLRuby/sdl/include/SDL_render.h.rb +94 -0
- data/lib/SDLRuby/sdl/include/SDL_revision.h.rb +2 -0
- data/lib/SDLRuby/sdl/include/SDL_rwops.h.rb +34 -0
- data/lib/SDLRuby/sdl/include/SDL_scancode.h.rb +5 -0
- data/lib/SDLRuby/sdl/include/SDL_sensor.h.rb +25 -0
- data/lib/SDLRuby/sdl/include/SDL_shape.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_stdinc.h.rb +24 -0
- data/lib/SDLRuby/sdl/include/SDL_surface.h.rb +37 -0
- data/lib/SDLRuby/sdl/include/SDL_system.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_syswm.h.rb +16 -0
- data/lib/SDLRuby/sdl/include/SDL_timer.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_touch.h.rb +15 -0
- data/lib/SDLRuby/sdl/include/SDL_types.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_version.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_video.h.rb +117 -0
- data/lib/SDLRuby/sdl/sdl.rb +55 -0
- data/lib/SDLRuby/sdl/sdl_audio.rb +75 -0
- data/lib/SDLRuby/sdl/sdl_blendmode.rb +10 -0
- data/lib/SDLRuby/sdl/sdl_error.rb +5 -0
- data/lib/SDLRuby/sdl/sdl_events.rb +470 -0
- data/lib/SDLRuby/sdl/sdl_hints.rb +9 -0
- data/lib/SDLRuby/sdl/sdl_keyboard.rb +12 -0
- data/lib/SDLRuby/sdl/sdl_locale.rb +8 -0
- data/lib/SDLRuby/sdl/sdl_message_box.rb +7 -0
- data/lib/SDLRuby/sdl/sdl_mouse.rb +32 -0
- data/lib/SDLRuby/sdl/sdl_palette.rb +12 -0
- data/lib/SDLRuby/sdl/sdl_pixels.rb +138 -0
- data/lib/SDLRuby/sdl/sdl_rect.rb +11 -0
- data/lib/SDLRuby/sdl/sdl_render.rb +35 -0
- data/lib/SDLRuby/sdl/sdl_rw_ops.rb +29 -0
- data/lib/SDLRuby/sdl/sdl_scancode.rb +255 -0
- data/lib/SDLRuby/sdl/sdl_surface.rb +27 -0
- data/lib/SDLRuby/sdl/sdl_version.rb +5 -0
- data/lib/SDLRuby/sdl/sdl_video.rb +104 -0
- data/lib/SDLRuby/sdl.rb +192 -0
- data/lib/SDLRuby/sdl_error.rb +8 -0
- data/lib/SDLRuby/surface/pixel_format.rb +51 -0
- data/lib/SDLRuby/surface/surface_renderer.rb +26 -0
- data/lib/SDLRuby/surface.rb +179 -0
- data/lib/SDLRuby/text_input.rb +38 -0
- data/lib/SDLRuby/texture.rb +93 -0
- data/lib/SDLRuby/ttf/include/SDL_ttf.h.rb +54 -0
- data/lib/SDLRuby/ttf/ttf.rb +41 -0
- data/lib/SDLRuby/ttf.rb +54 -0
- data/lib/SDLRuby/version.rb +5 -0
- data/lib/SDLRuby/window/accessor.rb +125 -0
- data/lib/SDLRuby/window/controller.rb +53 -0
- data/lib/SDLRuby/window/display_info.rb +48 -0
- data/lib/SDLRuby/window/flag.rb +42 -0
- data/lib/SDLRuby/window/hit_tester.rb +61 -0
- data/lib/SDLRuby/window/input.rb +68 -0
- data/lib/SDLRuby/window/shaper.rb +68 -0
- data/lib/SDLRuby/window/surfacer.rb +37 -0
- data/lib/SDLRuby/window/window_renderer.rb +31 -0
- data/lib/SDLRuby/window.rb +90 -0
- data/lib/SDLRuby.rb +16 -0
- data/sig/SDLRuby/event.rbs +104 -0
- data/sig/SDLRuby/pixel_formmater.rbs +24 -0
- data/sig/SDLRuby/rect.rbs +5 -0
- data/sig/SDLRuby/sdl.rbs +606 -0
- data/sig/SDLRuby.rbs +4 -0
- metadata +168 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7516a8b356b287a6f985881964b1a44f76922354a13d70000b9990dd2a67badd
|
4
|
+
data.tar.gz: 358b7f4a6b40bd7a31e7249beaac18f77d3d7a08b21c9802f30203fce36628ed
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b5f6c08130fa89f6aa74009a02a5d4a7ada123839f0a2eef2894347ac358e0e75b188bbfd0a657004be3d54207166484b8b842b43edb5ee5dbf6340c4f13f095
|
7
|
+
data.tar.gz: 26017bbb155bb41c032396b13e9981ee62c72954b66501b2ab818356a9cedcbb295a74f810f742ecaf83b1ba52dd6c69b658e39859b35443a59f575fe0d72423
|
data/CHANGELOG.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2023 shinokaro
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# SDLRuby
|
2
|
+
|
3
|
+
SDLRuby is a GEM that allows calling the SDL library from Ruby, enabling window creation, image display, audio playback, and more. It easily manages C pointers as Ruby objects, all written in 100% Ruby. Achieve multimedia programming simplicity.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install the gem and add to the application's Gemfile by executing:
|
8
|
+
|
9
|
+
$ bundle add SDLRuby
|
10
|
+
|
11
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
12
|
+
|
13
|
+
$ gem install SDLRuby
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
**⚠️UNDER CONSTRUCTION⚠️**
|
18
|
+
|
19
|
+
## Development
|
20
|
+
|
21
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
22
|
+
|
23
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/shinokaro/SDLRuby.
|
28
|
+
|
29
|
+
## License
|
30
|
+
|
31
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
module Audio
|
3
|
+
include SDL
|
4
|
+
|
5
|
+
class << self
|
6
|
+
include SDL
|
7
|
+
|
8
|
+
def default_device(capture: nil)
|
9
|
+
name = SDL.tmp_value("void*")
|
10
|
+
spec = SDL_AudioSpec.malloc(Fiddle::RUBY_FREE)
|
11
|
+
is_capture = capture ? 1 : 0
|
12
|
+
err = SDL. SDL_GetDefaultAudioInfo(name, spec, is_capture)
|
13
|
+
raise SDLError if err != 0
|
14
|
+
|
15
|
+
ptr = name.value
|
16
|
+
s = if ptr.null?
|
17
|
+
nil
|
18
|
+
else
|
19
|
+
ptr.free = SDL_FREE
|
20
|
+
ptr.to_s.force_encoding("UTF-8")
|
21
|
+
end
|
22
|
+
|
23
|
+
[s, spec.to_h]
|
24
|
+
end
|
25
|
+
|
26
|
+
def devices(capture: nil)
|
27
|
+
is_capture = capture ? 1 : 0
|
28
|
+
num = SDL.SDL_GetNumAudioDevices(is_capture)
|
29
|
+
num.times.map do |idx|
|
30
|
+
SDL.SDL_GetAudioDeviceName(idx, is_capture).to_s.force_encoding("UTF-8")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def device_spec(name, capture: nil)
|
35
|
+
idx = devices(capture: capture).index(name.encode("UTF-8"))
|
36
|
+
|
37
|
+
return unless idx
|
38
|
+
|
39
|
+
is_capture = capture ? 1 : 0
|
40
|
+
spec = SDL_AudioSpec.malloc(Fiddle::RUBY_FREE)
|
41
|
+
|
42
|
+
if SDL.SDL_GetAudioDeviceSpec(idx, is_capture, spec) == 0
|
43
|
+
spec.to_h
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def driver
|
48
|
+
ptr = SDL.SDL_GetCurrentAudioDriver
|
49
|
+
ptr.null? ? nil : ptr.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def drivers
|
53
|
+
num = SDL.SDL_GetNumAudioDrivers
|
54
|
+
num.times.map { |idx| SDL.SDL_GetAudioDriver(idx).to_s }
|
55
|
+
end
|
56
|
+
|
57
|
+
def init(driver)
|
58
|
+
err = SDL.SDL_AudioInit(driver)
|
59
|
+
raise SDLError if err < 0
|
60
|
+
end
|
61
|
+
|
62
|
+
def quit = SDL.SDL_AudioQuit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Cursor
|
3
|
+
include SDL
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def [](obj, hot: nil)
|
7
|
+
case obj
|
8
|
+
when Surface
|
9
|
+
SDL.SDL_CreateColorCursor(obj, *hot && [0, 0])
|
10
|
+
when Integer
|
11
|
+
SDL.SDL_CreateSystemCursor(obj)
|
12
|
+
else
|
13
|
+
raise ArgumentError
|
14
|
+
end => ptr
|
15
|
+
|
16
|
+
raise SDLError if ptr.null?
|
17
|
+
|
18
|
+
new(ptr)
|
19
|
+
end
|
20
|
+
|
21
|
+
def default! = SDL.SDL_SetCursor(SDL.SDL_GetDefaultCursor)
|
22
|
+
|
23
|
+
def hide = SDL.SDL_ShowCursor(0)
|
24
|
+
|
25
|
+
def redraw = SDL.SDL_SetCursor(nil)
|
26
|
+
|
27
|
+
def show = SDL.SDL_ShowCursor(1)
|
28
|
+
|
29
|
+
def shown? = SDL.SDL_ShowCursor(-1) == 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(ptr)
|
33
|
+
ptr.free = SDL_FREE_CURSOR
|
34
|
+
@ptr = ptr
|
35
|
+
end
|
36
|
+
|
37
|
+
def current? = SDL.SDL_GetCursor == @ptr
|
38
|
+
|
39
|
+
def show
|
40
|
+
SDL.SDL_SetCursor(self)
|
41
|
+
Cursor.show
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_ptr = @ptr
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative 'pixel_formatter'
|
2
|
+
|
3
|
+
module SDLRuby
|
4
|
+
class DisplayMode
|
5
|
+
include PixelFormatter, SDL
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@st = SDL_DisplayMode.malloc(Fiddle::RUBY_FREE)
|
10
|
+
end
|
11
|
+
|
12
|
+
def_delegators :@st, :format, :w, :h, :refresh_rate
|
13
|
+
|
14
|
+
def to_ptr = @st.to_ptr
|
15
|
+
end
|
16
|
+
|
17
|
+
class Display
|
18
|
+
class << self
|
19
|
+
include SDL
|
20
|
+
|
21
|
+
# Videoの初期化がされていなければ0を戻す。
|
22
|
+
#
|
23
|
+
def count = (i = SDL.SDL_GetNumVideoDisplays) < 0 ? 0 : i
|
24
|
+
|
25
|
+
def orientation(idx) = SDL.SDL_GetDisplayOrientation(idx)
|
26
|
+
|
27
|
+
def orientation_name(idx)
|
28
|
+
case orientation(idx)
|
29
|
+
when SDL_ORIENTATION_UNKNOWN then ""
|
30
|
+
when SDL_ORIENTATION_LANDSCAPE then "landscape"
|
31
|
+
when SDL_ORIENTATION_LANDSCAPE_FLIPPED then "landscape_flipped"
|
32
|
+
when SDL_ORIENTATION_PORTRAIT then "portrait"
|
33
|
+
when SDL_ORIENTATION_PORTRAIT_FLIPPED then "portrait_flipped"
|
34
|
+
else
|
35
|
+
""
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_reader :bounds, :current_display_mode, :desktop_display_mode,
|
41
|
+
:display_modes, :name, :orientation, :usable_bounds
|
42
|
+
|
43
|
+
def initialize(num)
|
44
|
+
# この実装では例外を出さない。
|
45
|
+
# 基本的にSDLの内部構造体を読み出しているだけであり、
|
46
|
+
# 関数からのエラー報告はインデックス境界に関するものである。
|
47
|
+
#
|
48
|
+
# ディスプレイの状態はユーザのハードウェアやOS操作によって常に変化する。
|
49
|
+
# 一纏めにデータを取得する必要がある。
|
50
|
+
#
|
51
|
+
@bounds = Rect[].tap { |r| SDL.SDL_GetDisplayBounds(num, r) }.to_a
|
52
|
+
|
53
|
+
@current_display_mode = DisplayMode.new.tap do |st|
|
54
|
+
SDL.SDL_GetCurrentDisplayMode(num, st)
|
55
|
+
end
|
56
|
+
|
57
|
+
@desktop_display_mode = DisplayMode.new.tap do |st|
|
58
|
+
SDL.SDL_GetDesktopDisplayMode(num, st)
|
59
|
+
end
|
60
|
+
|
61
|
+
@display_modes = SDL.SDL_GetNumDisplayModes(num).times.map do |idx|
|
62
|
+
DisplayMode.new.tap { |st| SDL.SDL_GetDisplayMode(num, idx, st) }
|
63
|
+
end
|
64
|
+
|
65
|
+
ptr = SDL.SDL_GetDisplayName(num)
|
66
|
+
@name = (ptr.null? ? nil : ptr).to_s.force_encoding("UTF-8")
|
67
|
+
|
68
|
+
@orientation = Display.orientation(num)
|
69
|
+
|
70
|
+
@usable_bounds = Rect[].tap do |r|
|
71
|
+
SDL.SDL_GetDisplayUsableBounds(num, r)
|
72
|
+
end.to_a
|
73
|
+
|
74
|
+
@num = num
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_i = @num
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Event
|
3
|
+
module Accessor
|
4
|
+
include SDL
|
5
|
+
|
6
|
+
union_members = SDL_Event.members.inject([]) do |result, (name, members)|
|
7
|
+
if members
|
8
|
+
# ネストした構造体の場合は親のみを選択する。
|
9
|
+
result << [name, members.flatten(1).select { |a| !(Array === a) }]
|
10
|
+
end
|
11
|
+
|
12
|
+
result
|
13
|
+
end
|
14
|
+
|
15
|
+
@modules = Hash.new do |_, key|
|
16
|
+
raise KeyError, "undefined SDL_Event member(#{key})"
|
17
|
+
end
|
18
|
+
|
19
|
+
union_members.each do |name, members|
|
20
|
+
@modules[name.to_sym] = Module.new do
|
21
|
+
extend Forwardable
|
22
|
+
|
23
|
+
def_delegators :entity, *members
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def [](sym) = @modules[sym]
|
29
|
+
end
|
30
|
+
|
31
|
+
self[:adevice].module_eval do
|
32
|
+
def capture? = entity.iscapture != 0
|
33
|
+
end
|
34
|
+
|
35
|
+
self[:cbutton].module_eval do
|
36
|
+
def pressed? = state == SDL_PRESSED
|
37
|
+
end
|
38
|
+
|
39
|
+
self[:drop].module_eval do
|
40
|
+
undef file
|
41
|
+
|
42
|
+
def file = char_ptr_to_str(entity.file)
|
43
|
+
|
44
|
+
alias_method :text, :file
|
45
|
+
|
46
|
+
def self.extended(obj)
|
47
|
+
@_ptr ||= entity.file.tap { |ptr| ptr.free = SDL_FREE unless ptr.null? }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
self[:edit].module_eval do
|
52
|
+
undef text
|
53
|
+
|
54
|
+
def text = char_ary_to_str(entity.text)
|
55
|
+
end
|
56
|
+
|
57
|
+
self[:editExt].module_eval do
|
58
|
+
undef text
|
59
|
+
|
60
|
+
def text = char_ptr_to_str(entity.text)
|
61
|
+
|
62
|
+
def self.extended(obj)
|
63
|
+
@_ptr ||= entity.text.tap { |ptr| ptr.free = SDL_FREE }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
self[:jbutton].module_eval do
|
68
|
+
def pressed? = state == SDL_PRESSED
|
69
|
+
end
|
70
|
+
|
71
|
+
self[:key].module_eval do
|
72
|
+
undef keysym
|
73
|
+
|
74
|
+
def keysym = entity.keysym.to_h
|
75
|
+
end
|
76
|
+
|
77
|
+
self[:syswm].module_eval do
|
78
|
+
undef msg
|
79
|
+
|
80
|
+
def msg = entity.msg
|
81
|
+
end
|
82
|
+
|
83
|
+
self[:text].module_eval do
|
84
|
+
undef text
|
85
|
+
|
86
|
+
def text = char_ary_to_str(entity.text)
|
87
|
+
end
|
88
|
+
|
89
|
+
self[:user].module_eval do
|
90
|
+
undef data1, data2
|
91
|
+
|
92
|
+
def data1 = entity.data1
|
93
|
+
|
94
|
+
def data2 = entity.data2
|
95
|
+
end
|
96
|
+
|
97
|
+
# STIの実装としてメンバー全てのゲッターに例外を出さず応答するようにする。
|
98
|
+
# これは"y"メソッドにRubyが応答してしまうため。事前にオーバーライドしておく。
|
99
|
+
#
|
100
|
+
all_members = union_members.map { |a| a.last }.flatten.uniq
|
101
|
+
|
102
|
+
attr_reader(*all_members)
|
103
|
+
|
104
|
+
# Ruby like accessor
|
105
|
+
#
|
106
|
+
alias_method :d_dist, :dDist
|
107
|
+
alias_method :d_theta, :dTheta
|
108
|
+
alias_method :finger_id, :fingerId
|
109
|
+
alias_method :gesture_id, :gestureId
|
110
|
+
alias_method :mouse_x, :mouseX
|
111
|
+
alias_method :mouse_y, :mouseY
|
112
|
+
alias_method :num_fingers, :numFingers
|
113
|
+
alias_method :precise_x, :preciseX
|
114
|
+
alias_method :precise_y, :preciseY
|
115
|
+
alias_method :touch_id, :touchId
|
116
|
+
alias_method :window_id, :windowID
|
117
|
+
|
118
|
+
private def char_ary_to_str(a)
|
119
|
+
a[0, a.find_index(0)].pack("C*").force_encoding("UTF-8")
|
120
|
+
end
|
121
|
+
|
122
|
+
private def char_ptr_to_str(ptr)
|
123
|
+
ptr.null? ? "" : ptr.to_s.force_encoding("UTF-8")
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Event
|
3
|
+
module Type
|
4
|
+
include SDL
|
5
|
+
|
6
|
+
QUIT_EVENT = SDL_QUIT..SDL_QUIT
|
7
|
+
DISPLAY_EVENT = SDL_DISPLAYEVENT..SDL_DISPLAYEVENT
|
8
|
+
WINDOW_EVENT = SDL_WINDOWEVENT..SDL_WINDOWEVENT
|
9
|
+
SYSWM_EVENT = SDL_SYSWMEVENT..SDL_SYSWMEVENT
|
10
|
+
KEY_EVENT = SDL_KEYDOWN..SDL_KEYUP
|
11
|
+
EDIT_EVENT = SDL_TEXTEDITING..SDL_TEXTEDITING
|
12
|
+
TEXT_EVENT = SDL_TEXTINPUT..SDL_TEXTINPUT
|
13
|
+
EDIT_EXT_EVENT = SDL_TEXTEDITING_EXT..SDL_TEXTEDITING_EXT
|
14
|
+
MOTION_EVENT = SDL_MOUSEMOTION..SDL_MOUSEMOTION
|
15
|
+
BUTTON_EVENT = SDL_MOUSEBUTTONDOWN..SDL_MOUSEBUTTONUP
|
16
|
+
WHEEL_EVENT = SDL_MOUSEWHEEL..SDL_MOUSEWHEEL
|
17
|
+
JAXIS_EVENT = SDL_JOYAXISMOTION..SDL_JOYAXISMOTION
|
18
|
+
JBALL_EVENT = SDL_JOYBALLMOTION..SDL_JOYBALLMOTION
|
19
|
+
JHAT_EVENT = SDL_JOYHATMOTION..SDL_JOYHATMOTION
|
20
|
+
JBUTTON_EVENT = SDL_JOYBUTTONDOWN..SDL_JOYBUTTONUP
|
21
|
+
JDEVICE_EVENT = SDL_JOYDEVICEADDED..SDL_JOYDEVICEREMOVED
|
22
|
+
JBATTERY_EVENT = SDL_JOYBATTERYUPDATED..SDL_JOYBATTERYUPDATED
|
23
|
+
CAXIS_EVENT = SDL_CONTROLLERAXISMOTION..SDL_CONTROLLERAXISMOTION
|
24
|
+
CBUTTON_EVENT = SDL_CONTROLLERBUTTONDOWN..SDL_CONTROLLERBUTTONUP
|
25
|
+
CDEVICE_EVENT = SDL_CONTROLLERDEVICEADDED..SDL_CONTROLLERDEVICEREMAPPED
|
26
|
+
CTOUCHPAD_EVENT = SDL_CONTROLLERTOUCHPADDOWN..SDL_CONTROLLERTOUCHPADUP
|
27
|
+
CSENSOR_EVENT = SDL_CONTROLLERSENSORUPDATE..SDL_CONTROLLERSENSORUPDATE
|
28
|
+
TFINGER_EVENT = SDL_FINGERDOWN..SDL_FINGERMOTION
|
29
|
+
DGESTURE_EVENT = SDL_DOLLARGESTURE..SDL_DOLLARRECORD
|
30
|
+
MGESTURE_EVENT = SDL_MULTIGESTURE..SDL_MULTIGESTURE
|
31
|
+
DROP_EVENT = SDL_DROPFILE..SDL_DROPCOMPLETE
|
32
|
+
ADEVICE_EVENT = SDL_AUDIODEVICEADDED..SDL_AUDIODEVICEREMOVED
|
33
|
+
SENSOR_EVENT = SDL_SENSORUPDATE..SDL_SENSORUPDATE
|
34
|
+
USER_EVENT = SDL_USEREVENT...SDL_LASTEVENT
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def to_sym(type)
|
38
|
+
case type
|
39
|
+
when DISPLAY_EVENT then :display
|
40
|
+
when WINDOW_EVENT then :window
|
41
|
+
when KEY_EVENT then :key
|
42
|
+
when EDIT_EVENT then :edit
|
43
|
+
when EDIT_EXT_EVENT then :editExt
|
44
|
+
when TEXT_EVENT then :text
|
45
|
+
when MOTION_EVENT then :motion
|
46
|
+
when BUTTON_EVENT then :button
|
47
|
+
when WHEEL_EVENT then :wheel
|
48
|
+
when JAXIS_EVENT then :jaxis
|
49
|
+
when JBALL_EVENT then :jball
|
50
|
+
when JHAT_EVENT then :jhat
|
51
|
+
when JBUTTON_EVENT then :jbutton
|
52
|
+
when JDEVICE_EVENT then :jdevice
|
53
|
+
when JBATTERY_EVENT then :jbattery
|
54
|
+
when CAXIS_EVENT then :caxis
|
55
|
+
when CBUTTON_EVENT then :cbutton
|
56
|
+
when CDEVICE_EVENT then :cdevice
|
57
|
+
when CTOUCHPAD_EVENT then :ctouchpad
|
58
|
+
when CSENSOR_EVENT then :csensor
|
59
|
+
when ADEVICE_EVENT then :adevice
|
60
|
+
when SENSOR_EVENT then :sensor
|
61
|
+
when QUIT_EVENT then :quit
|
62
|
+
when USER_EVENT then :user
|
63
|
+
when SYSWM_EVENT then :syswm
|
64
|
+
when TFINGER_EVENT then :tfinger
|
65
|
+
when MGESTURE_EVENT then :mgesture
|
66
|
+
when DGESTURE_EVENT then :dgesture
|
67
|
+
when DROP_EVENT then :drop
|
68
|
+
else
|
69
|
+
:common
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative 'event/accessor'
|
2
|
+
require_relative 'event/type'
|
3
|
+
|
4
|
+
module SDLRuby
|
5
|
+
class Event
|
6
|
+
include Accessor, Fiddle, SDL
|
7
|
+
|
8
|
+
class << self
|
9
|
+
include SDL
|
10
|
+
|
11
|
+
# SDL_WaitEvent, SDL_WaitEventTimeoutはRubyのスレッドを停止させるため実装しない。
|
12
|
+
# ※C関数呼び出し時にGVLを外せれば可能か?
|
13
|
+
# SDL_RegisterEventsはSDLに対応するゲッターがないため実装しない。
|
14
|
+
# SDL_PushEventは必要ならば実装する。ただしEventコンストラクターを含むため規模が大きい。
|
15
|
+
#
|
16
|
+
# SDL_AddEventWatch, SDL_SetEventFilterおよびSDL_FilterEventsは実装しない。
|
17
|
+
# イベントにポインターを含む場合、RubyのGCの管理下に置く方法が複雑なため。
|
18
|
+
# ※現実装ではイベントを取り込んだ時点でポインターをRubyの管理下に置いている。
|
19
|
+
# メンバーのポインター管理をファイナライザーに移行できれば可能だろう。
|
20
|
+
# ※そしてファイナライザーを設定するかどうか選択する。
|
21
|
+
# いずれもSDL_EventPumpを呼び出さなければ動作しない。
|
22
|
+
# 非同期にイベントを取得できるわけではない。
|
23
|
+
# SDL_PeepEventsは実装しない。
|
24
|
+
# SDL_ADDEVENT:
|
25
|
+
# イベントのメンバーにポインターを含む場合、それのSDL側へのコピーが必要になる。
|
26
|
+
# SDL_PushEventが実装されれば、それが同等の機能を持つ。
|
27
|
+
# SDL_PEEKEVENT:
|
28
|
+
# SDL_FilterEventsが実装できれば、それが同等の機能を持つ。
|
29
|
+
# SDL_GETEVENT:
|
30
|
+
# キューの削除が目的だと思う。それを行うならSDL_PollEventを利用して欲しい。
|
31
|
+
# イベントキューはコレクションではない。
|
32
|
+
#
|
33
|
+
# SDL_PeepEventsは実行中にキューをロックすることに注意。
|
34
|
+
# また、SDL_SYSWMEVENTのmsgメンバーにコピーが必要か分からない。(要調査)
|
35
|
+
# ※このポインターだけSDLが管理しているようだ。
|
36
|
+
|
37
|
+
def clear = (pump or flash)
|
38
|
+
|
39
|
+
def count = SDL.SDL_PeepEvents(nil, 0, SDL_PEEKEVENT, 0, -1)
|
40
|
+
|
41
|
+
def disable(type) = SDL.SDL_EventState(type, 0)
|
42
|
+
|
43
|
+
def enable(type) = SDL.SDL_EventState(type, 1)
|
44
|
+
|
45
|
+
def flash = SDL.SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT)
|
46
|
+
|
47
|
+
def get = poll(e = new)
|
48
|
+
|
49
|
+
private :new
|
50
|
+
|
51
|
+
private def poll(e) = (SDL.SDL_PollEvent(e).nonzero? and e.update)
|
52
|
+
|
53
|
+
def pump = SDL.SDL_PumpEvents
|
54
|
+
|
55
|
+
alias update pump
|
56
|
+
|
57
|
+
def quit? = (pump or SDL.SDL_HasEvent(SDL_QUIT) != 0)
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize
|
61
|
+
@st = SDL_Event.malloc(RUBY_FREE)
|
62
|
+
end
|
63
|
+
|
64
|
+
private attr_reader :entity
|
65
|
+
|
66
|
+
def to_ptr = @st.to_ptr
|
67
|
+
|
68
|
+
def to_sym = Type.to_sym(@st.type)
|
69
|
+
|
70
|
+
def update
|
71
|
+
unless @entity
|
72
|
+
sym = to_sym
|
73
|
+
@entity = @st.__send__(sym)
|
74
|
+
extend(Accessor[sym])
|
75
|
+
end
|
76
|
+
|
77
|
+
self
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|