ruby2d 0.0.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/app.icns +0 -0
- data/bin/ruby2d +116 -0
- data/ext/ruby2d/extconf.rb +84 -0
- data/ext/ruby2d/ruby2d.c +288 -0
- data/lib/ruby2d.rb +17 -5
- data/lib/ruby2d/application.rb +39 -0
- data/lib/ruby2d/color.rb +72 -0
- data/lib/ruby2d/dsl.rb +31 -0
- data/lib/ruby2d/exceptions.rb +16 -0
- data/lib/ruby2d/image.rb +29 -0
- data/lib/ruby2d/quad.rb +62 -0
- data/lib/ruby2d/rectangle.rb +57 -0
- data/lib/ruby2d/sound.rb +19 -0
- data/lib/ruby2d/square.rb +26 -0
- data/lib/ruby2d/text.rb +62 -0
- data/lib/ruby2d/triangle.rb +51 -0
- data/lib/ruby2d/version.rb +5 -0
- data/lib/ruby2d/window.rb +176 -0
- metadata +42 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b065d85656f0f67ae270a815252551c10985caf1
|
4
|
+
data.tar.gz: 6ed2d44d184eb36daabd4711e4ef7c74729d693c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29b0dff61f4a04bbb2bed6904a5c2c10aa6e1cf43e8114f0fecae6d77b19700ee430b087dec6e193cc6dd4210d5d11379a72ee9bde8b1b52d2ef4102f1a66153
|
7
|
+
data.tar.gz: c08fda4f13944a3a3e8709a405f7c6f884596dc63d1be90d096614391468491b4b9d3a0d00aeb2d5617f9d3026d87f9dba382fc89cc99309ee4df94c6f90016b
|
data/assets/app.icns
ADDED
Binary file
|
data/bin/ruby2d
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'ruby2d/version'
|
3
|
+
|
4
|
+
class String
|
5
|
+
def colorize(c); "\e[#{c}m#{self}\e[0m" end
|
6
|
+
def error; colorize('1;31') end
|
7
|
+
def bold; colorize('1') end
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def build_native(rb_file)
|
12
|
+
if `which mruby`.empty?
|
13
|
+
puts "",
|
14
|
+
" mruby not found!".error, "",
|
15
|
+
" mruby is needed to build a native Ruby 2D applications.".bold, "",
|
16
|
+
" Install using Homebrew on OS X:",
|
17
|
+
" brew install mruby", ""
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
|
21
|
+
`mkdir -p build`
|
22
|
+
`mrbc -Bruby2d_app_symbol -obuild/app.c #{rb_file}`
|
23
|
+
|
24
|
+
open('build/app.c', 'a') do |f|
|
25
|
+
f << %(
|
26
|
+
#include "mruby.h"
|
27
|
+
#include "mruby/irep.h"
|
28
|
+
|
29
|
+
int main(void) {
|
30
|
+
mrb_state *mrb = mrb_open();
|
31
|
+
if (!mrb) { /* handle error */ }
|
32
|
+
mrb_load_irep(mrb, ruby2d_app_symbol);
|
33
|
+
mrb_close(mrb);
|
34
|
+
}
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
`cc -std=c99 -lmruby build/app.c -o build/app`
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def build_package
|
43
|
+
require 'fileutils'
|
44
|
+
|
45
|
+
icon_path = "#{Gem::Specification.find_by_name('ruby2d').gem_dir}/assets/app.icns"
|
46
|
+
|
47
|
+
FileUtils.mkpath "build/App.app/Contents/MacOS"
|
48
|
+
FileUtils.mkpath "build/App.app/Contents/Resources"
|
49
|
+
FileUtils.cp icon_path, "build/App.app/Contents/Resources"
|
50
|
+
|
51
|
+
info_plist = %(
|
52
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
53
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
54
|
+
<plist version="1.0">
|
55
|
+
<dict>
|
56
|
+
<key>CFBundleExecutable</key>
|
57
|
+
<string>app</string>
|
58
|
+
<key>CFBundleIconFile</key>
|
59
|
+
<string>app.icns</string>
|
60
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
61
|
+
<string>1.0</string>
|
62
|
+
<key>CFBundlePackageType</key>
|
63
|
+
<string>APPL</string>
|
64
|
+
<key>CFBundleSignature</key>
|
65
|
+
<string>????</string>
|
66
|
+
<key>CFBundleVersion</key>
|
67
|
+
<string>1.0</string>
|
68
|
+
</dict>
|
69
|
+
</plist>
|
70
|
+
)
|
71
|
+
|
72
|
+
File.open("build/App.app/Contents/Info.plist", 'w') { |f| f.write(info_plist) }
|
73
|
+
|
74
|
+
FileUtils.cp "build/app", "build/App.app/Contents/MacOS/"
|
75
|
+
|
76
|
+
puts "App written to `build/App.app`."
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# Command line usage and tree ##################################################
|
81
|
+
|
82
|
+
usage = "
|
83
|
+
Usage: ruby2d [-v|--version]
|
84
|
+
<command> <options>
|
85
|
+
|
86
|
+
Summary of commands and options:
|
87
|
+
build Build the application...
|
88
|
+
native ...compile with mruby.
|
89
|
+
web ...for web platform.
|
90
|
+
package Create application package.
|
91
|
+
-v|--version Prints the installed version.
|
92
|
+
|
93
|
+
"
|
94
|
+
|
95
|
+
case ARGV[0]
|
96
|
+
when 'build'
|
97
|
+
puts "Running build..."
|
98
|
+
case ARGV[1]
|
99
|
+
when 'native'
|
100
|
+
puts "Running build native..."
|
101
|
+
build_native ARGV[2]
|
102
|
+
when 'web'
|
103
|
+
puts "Running build web..."
|
104
|
+
else
|
105
|
+
puts usage
|
106
|
+
end
|
107
|
+
when 'package'
|
108
|
+
puts "Running package..."
|
109
|
+
build_package
|
110
|
+
when '-v', '--version'
|
111
|
+
puts Ruby2D::VERSION
|
112
|
+
else
|
113
|
+
puts usage
|
114
|
+
end
|
115
|
+
|
116
|
+
exit
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
class String
|
4
|
+
def colorize(c); "\e[#{c}m#{self}\e[0m" end
|
5
|
+
def error; colorize('1;31') end
|
6
|
+
def bold; colorize('1') end
|
7
|
+
end
|
8
|
+
|
9
|
+
def print_errors(errors)
|
10
|
+
puts "
|
11
|
+
#{"== Ruby 2D Installation Errors =============================".bold}
|
12
|
+
|
13
|
+
#{"Ruby 2D found some problems and was not installed:".error}
|
14
|
+
|
15
|
+
#{errors.join("\n ")}
|
16
|
+
|
17
|
+
#{"============================================================".bold}"
|
18
|
+
end
|
19
|
+
|
20
|
+
errors = []
|
21
|
+
|
22
|
+
# Install Simple 2D on supported platforms
|
23
|
+
|
24
|
+
# OS X
|
25
|
+
if RUBY_PLATFORM =~ /darwin/
|
26
|
+
unless ARGV.include? "--no-brew"
|
27
|
+
# Simple 2D not installed
|
28
|
+
if `which simple2d`.empty?
|
29
|
+
# Homebrew not installed, print and quit
|
30
|
+
if `which brew`.empty?
|
31
|
+
errors << "Ruby 2D uses a library called Simple 2D." <<
|
32
|
+
"On OS X, this can be installed using Homebrew." <<
|
33
|
+
"Install Homebrew, then try installing this gem again.\n" <<
|
34
|
+
"Learn more at http://brew.sh"
|
35
|
+
print_errors(errors)
|
36
|
+
exit
|
37
|
+
# Install Simple 2D using Homebrew
|
38
|
+
else
|
39
|
+
`brew tap simple2d/tap`
|
40
|
+
`brew install simple2d`
|
41
|
+
end
|
42
|
+
|
43
|
+
# Simple 2D installed, update to latest version
|
44
|
+
else
|
45
|
+
# Homebrew not installed
|
46
|
+
if `which brew`.empty?
|
47
|
+
# TODO: Check for latest version manually and update
|
48
|
+
# Homebrew installed, get latest version of Simple 2D
|
49
|
+
else
|
50
|
+
# An alternative, but slower and updates all formulas:
|
51
|
+
# `brew update`
|
52
|
+
# `brew upgrade simple2d`
|
53
|
+
|
54
|
+
`brew untap simple2d/tap`
|
55
|
+
`brew tap simple2d/tap`
|
56
|
+
`brew upgrade simple2d`
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Linux
|
62
|
+
elsif RUBY_PLATFORM =~ /linux/
|
63
|
+
# If Simple 2D not installed
|
64
|
+
if `which simple2d`.empty?
|
65
|
+
errors << "Ruby 2D uses a library called Simple 2D." <<
|
66
|
+
"There's a script to make installation easy on Linux.\n" <<
|
67
|
+
"Follow the instructions in the README to get started:" <<
|
68
|
+
" https://github.com/simple2d/simple2d"
|
69
|
+
print_errors(errors)
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
|
73
|
+
# Windows
|
74
|
+
elsif RUBY_PLATFORM =~ /mingw/
|
75
|
+
puts "Ruby 2D doesn't support Windows yet :("
|
76
|
+
exit
|
77
|
+
end
|
78
|
+
|
79
|
+
# Configure Simple 2D and create Makefile
|
80
|
+
|
81
|
+
$LDFLAGS << ' ' << `simple2d --libs`
|
82
|
+
$LDFLAGS.gsub!(/\n/, ' ') # remove newlines in flags, they cause problems
|
83
|
+
|
84
|
+
create_makefile('ruby2d/ruby2d')
|
data/ext/ruby2d/ruby2d.c
ADDED
@@ -0,0 +1,288 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
#include <simple2d.h>
|
3
|
+
|
4
|
+
// @type_id values for rendering
|
5
|
+
#define TRIANGLE 1
|
6
|
+
#define QUAD 2
|
7
|
+
#define IMAGE 3
|
8
|
+
#define TEXT 4
|
9
|
+
|
10
|
+
// Ruby 2D window
|
11
|
+
VALUE self;
|
12
|
+
|
13
|
+
// Simple 2D window
|
14
|
+
Window *window;
|
15
|
+
|
16
|
+
// Ruby data types
|
17
|
+
static VALUE ruby2d_module;
|
18
|
+
static VALUE ruby2d_window_klass;
|
19
|
+
static VALUE c_data_klass;
|
20
|
+
|
21
|
+
// Structures for Ruby 2D classes
|
22
|
+
struct image_data {
|
23
|
+
Image img;
|
24
|
+
};
|
25
|
+
struct text_data {
|
26
|
+
Text txt;
|
27
|
+
};
|
28
|
+
struct sound_data {
|
29
|
+
Sound snd;
|
30
|
+
};
|
31
|
+
|
32
|
+
|
33
|
+
/*
|
34
|
+
* Function pointer to close the Simple 2D window
|
35
|
+
*/
|
36
|
+
static void close_window() {
|
37
|
+
S2D_Close(window);
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
/*
|
42
|
+
* Free image structure attached to Ruby 2D `Image` class
|
43
|
+
*/
|
44
|
+
static void free_image(struct image_data *data) {
|
45
|
+
S2D_FreeImage(data->img);
|
46
|
+
xfree(data);
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
/*
|
51
|
+
* Initialize image structure data
|
52
|
+
*/
|
53
|
+
static VALUE init_image(char *path) {
|
54
|
+
struct image_data *data = ALLOC(struct image_data);
|
55
|
+
data->img = S2D_CreateImage(path);
|
56
|
+
return Data_Wrap_Struct(c_data_klass, NULL, free_image, data);
|
57
|
+
}
|
58
|
+
|
59
|
+
|
60
|
+
/*
|
61
|
+
* Free text structure attached to Ruby 2D `Text` class
|
62
|
+
*/
|
63
|
+
static void free_text(struct text_data *data) {
|
64
|
+
S2D_FreeText(data->txt);
|
65
|
+
xfree(data);
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
/*
|
70
|
+
* Initialize text structure data
|
71
|
+
*/
|
72
|
+
static VALUE init_text(char *font, char *msg, int size) {
|
73
|
+
struct text_data *data = ALLOC(struct text_data);
|
74
|
+
data->txt = S2D_CreateText(font, msg, size);
|
75
|
+
return Data_Wrap_Struct(c_data_klass, NULL, free_text, data);
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
/*
|
80
|
+
* Simple 2D `on_key` input callback function
|
81
|
+
*/
|
82
|
+
void on_key(const char *key) {
|
83
|
+
rb_funcall(self, rb_intern("key_callback"), 1, rb_str_new2(key));
|
84
|
+
}
|
85
|
+
|
86
|
+
|
87
|
+
/*
|
88
|
+
* Simple 2D `on_key_down` input callback function
|
89
|
+
*/
|
90
|
+
void on_key_down(const char *key) {
|
91
|
+
rb_funcall(self, rb_intern("key_down_callback"), 1, rb_str_new2(key));
|
92
|
+
}
|
93
|
+
|
94
|
+
|
95
|
+
/*
|
96
|
+
* Simple 2D `on_controller` input callback function
|
97
|
+
*/
|
98
|
+
void on_controller(bool is_axis, int axis, int val, bool is_btn, int btn) {
|
99
|
+
rb_funcall(self, rb_intern("controller_callback"), 5,
|
100
|
+
is_axis ? Qtrue : Qfalse, INT2NUM(axis), INT2NUM(val),
|
101
|
+
is_btn ? Qtrue : Qfalse, INT2NUM(btn)
|
102
|
+
);
|
103
|
+
}
|
104
|
+
|
105
|
+
|
106
|
+
/*
|
107
|
+
* Simple 2D `update` callback function
|
108
|
+
*/
|
109
|
+
void update() {
|
110
|
+
|
111
|
+
// Set the cursor
|
112
|
+
rb_iv_set(self, "@mouse_x", INT2NUM(window->mouse.x));
|
113
|
+
rb_iv_set(self, "@mouse_y", INT2NUM(window->mouse.y));
|
114
|
+
|
115
|
+
// Store frame rate
|
116
|
+
rb_iv_set(self, "@fps", INT2NUM(window->fps));
|
117
|
+
|
118
|
+
// Call update proc, `window.update`
|
119
|
+
rb_funcall(self, rb_intern("update_callback"), 0);
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
/*
|
124
|
+
* Simple 2D `render` callback function
|
125
|
+
*/
|
126
|
+
void render() {
|
127
|
+
|
128
|
+
// Read window objects
|
129
|
+
VALUE objects = rb_iv_get(self, "@objects");
|
130
|
+
int num_objects = NUM2INT(rb_funcall(objects, rb_intern("count"), 0));
|
131
|
+
|
132
|
+
// Switch on each object type
|
133
|
+
for (int i = 0; i < num_objects; ++i) {
|
134
|
+
|
135
|
+
VALUE el = rb_ary_entry(objects, i);
|
136
|
+
int type_id = NUM2INT(rb_iv_get(el, "@type_id"));
|
137
|
+
|
138
|
+
// Switch on the object's type_id
|
139
|
+
switch(type_id) {
|
140
|
+
|
141
|
+
case TRIANGLE: {
|
142
|
+
VALUE c1 = rb_iv_get(el, "@c1");
|
143
|
+
VALUE c2 = rb_iv_get(el, "@c2");
|
144
|
+
VALUE c3 = rb_iv_get(el, "@c3");
|
145
|
+
|
146
|
+
S2D_DrawTriangle(
|
147
|
+
NUM2DBL(rb_iv_get(el, "@x1")),
|
148
|
+
NUM2DBL(rb_iv_get(el, "@y1")),
|
149
|
+
NUM2DBL(rb_iv_get(c1, "@r")),
|
150
|
+
NUM2DBL(rb_iv_get(c1, "@g")),
|
151
|
+
NUM2DBL(rb_iv_get(c1, "@b")),
|
152
|
+
NUM2DBL(rb_iv_get(c1, "@a")),
|
153
|
+
|
154
|
+
NUM2DBL(rb_iv_get(el, "@x2")),
|
155
|
+
NUM2DBL(rb_iv_get(el, "@y2")),
|
156
|
+
NUM2DBL(rb_iv_get(c2, "@r")),
|
157
|
+
NUM2DBL(rb_iv_get(c2, "@g")),
|
158
|
+
NUM2DBL(rb_iv_get(c2, "@b")),
|
159
|
+
NUM2DBL(rb_iv_get(c2, "@a")),
|
160
|
+
|
161
|
+
NUM2DBL(rb_iv_get(el, "@x3")),
|
162
|
+
NUM2DBL(rb_iv_get(el, "@y3")),
|
163
|
+
NUM2DBL(rb_iv_get(c3, "@r")),
|
164
|
+
NUM2DBL(rb_iv_get(c3, "@g")),
|
165
|
+
NUM2DBL(rb_iv_get(c3, "@b")),
|
166
|
+
NUM2DBL(rb_iv_get(c3, "@a"))
|
167
|
+
);
|
168
|
+
}
|
169
|
+
break;
|
170
|
+
|
171
|
+
case QUAD: {
|
172
|
+
VALUE c1 = rb_iv_get(el, "@c1");
|
173
|
+
VALUE c2 = rb_iv_get(el, "@c2");
|
174
|
+
VALUE c3 = rb_iv_get(el, "@c3");
|
175
|
+
VALUE c4 = rb_iv_get(el, "@c4");
|
176
|
+
|
177
|
+
S2D_DrawQuad(
|
178
|
+
NUM2DBL(rb_iv_get(el, "@x1")),
|
179
|
+
NUM2DBL(rb_iv_get(el, "@y1")),
|
180
|
+
NUM2DBL(rb_iv_get(c1, "@r")),
|
181
|
+
NUM2DBL(rb_iv_get(c1, "@g")),
|
182
|
+
NUM2DBL(rb_iv_get(c1, "@b")),
|
183
|
+
NUM2DBL(rb_iv_get(c1, "@a")),
|
184
|
+
|
185
|
+
NUM2DBL(rb_iv_get(el, "@x2")),
|
186
|
+
NUM2DBL(rb_iv_get(el, "@y2")),
|
187
|
+
NUM2DBL(rb_iv_get(c2, "@r")),
|
188
|
+
NUM2DBL(rb_iv_get(c2, "@g")),
|
189
|
+
NUM2DBL(rb_iv_get(c2, "@b")),
|
190
|
+
NUM2DBL(rb_iv_get(c2, "@a")),
|
191
|
+
|
192
|
+
NUM2DBL(rb_iv_get(el, "@x3")),
|
193
|
+
NUM2DBL(rb_iv_get(el, "@y3")),
|
194
|
+
NUM2DBL(rb_iv_get(c3, "@r")),
|
195
|
+
NUM2DBL(rb_iv_get(c3, "@g")),
|
196
|
+
NUM2DBL(rb_iv_get(c3, "@b")),
|
197
|
+
NUM2DBL(rb_iv_get(c3, "@a")),
|
198
|
+
|
199
|
+
NUM2DBL(rb_iv_get(el, "@x4")),
|
200
|
+
NUM2DBL(rb_iv_get(el, "@y4")),
|
201
|
+
NUM2DBL(rb_iv_get(c4, "@r")),
|
202
|
+
NUM2DBL(rb_iv_get(c4, "@g")),
|
203
|
+
NUM2DBL(rb_iv_get(c4, "@b")),
|
204
|
+
NUM2DBL(rb_iv_get(c4, "@a"))
|
205
|
+
);
|
206
|
+
}
|
207
|
+
break;
|
208
|
+
|
209
|
+
case IMAGE: {
|
210
|
+
if (rb_iv_get(el, "@data") == Qnil) {
|
211
|
+
VALUE data = init_image(RSTRING_PTR(rb_iv_get(el, "@path")));
|
212
|
+
rb_iv_set(el, "@data", data);
|
213
|
+
}
|
214
|
+
|
215
|
+
struct image_data *data;
|
216
|
+
Data_Get_Struct(rb_iv_get(el, "@data"), struct image_data, data);
|
217
|
+
|
218
|
+
data->img.x = NUM2DBL(rb_iv_get(el, "@x"));
|
219
|
+
data->img.y = NUM2DBL(rb_iv_get(el, "@y"));
|
220
|
+
S2D_DrawImage(data->img);
|
221
|
+
}
|
222
|
+
break;
|
223
|
+
|
224
|
+
case TEXT: {
|
225
|
+
if (rb_iv_get(el, "@data") == Qnil) {
|
226
|
+
VALUE data = init_text(
|
227
|
+
RSTRING_PTR(rb_iv_get(el, "@font")),
|
228
|
+
RSTRING_PTR(rb_iv_get(el, "@text")),
|
229
|
+
NUM2DBL(rb_iv_get(el, "@size"))
|
230
|
+
);
|
231
|
+
rb_iv_set(el, "@data", data);
|
232
|
+
}
|
233
|
+
|
234
|
+
struct text_data *data;
|
235
|
+
Data_Get_Struct(rb_iv_get(el, "@data"), struct text_data, data);
|
236
|
+
|
237
|
+
data->txt.x = NUM2DBL(rb_iv_get(el, "@x"));
|
238
|
+
data->txt.y = NUM2DBL(rb_iv_get(el, "@y"));
|
239
|
+
S2D_DrawText(data->txt);
|
240
|
+
}
|
241
|
+
break;
|
242
|
+
}
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
|
247
|
+
/*
|
248
|
+
* Ruby2D::Window#show
|
249
|
+
*/
|
250
|
+
static VALUE ruby2d_show(VALUE s) {
|
251
|
+
self = s;
|
252
|
+
|
253
|
+
char *title = RSTRING_PTR(rb_iv_get(self, "@title"));
|
254
|
+
int width = NUM2INT(rb_iv_get(self, "@width"));
|
255
|
+
int height = NUM2INT(rb_iv_get(self, "@height"));
|
256
|
+
|
257
|
+
window = S2D_CreateWindow(
|
258
|
+
title, width, height, update, render, 0
|
259
|
+
);
|
260
|
+
|
261
|
+
window->on_key = on_key;
|
262
|
+
window->on_key_down = on_key_down;
|
263
|
+
window->on_controller = on_controller;
|
264
|
+
|
265
|
+
S2D_Show(window);
|
266
|
+
|
267
|
+
atexit(close_window);
|
268
|
+
return Qnil;
|
269
|
+
}
|
270
|
+
|
271
|
+
|
272
|
+
/*
|
273
|
+
* Ruby C extension init
|
274
|
+
*/
|
275
|
+
void Init_ruby2d() {
|
276
|
+
|
277
|
+
// Ruby2D
|
278
|
+
ruby2d_module = rb_define_module("Ruby2D");
|
279
|
+
|
280
|
+
// Ruby2D::Window
|
281
|
+
ruby2d_window_klass = rb_define_class_under(ruby2d_module, "Window", rb_cObject);
|
282
|
+
|
283
|
+
// Ruby2D::Window#show
|
284
|
+
rb_define_method(ruby2d_window_klass, "show", ruby2d_show, 0);
|
285
|
+
|
286
|
+
// Ruby2D::CData
|
287
|
+
c_data_klass = rb_define_class_under(ruby2d_module, "CData", rb_cObject);
|
288
|
+
}
|
data/lib/ruby2d.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
# ruby2d.rb
|
2
|
+
|
3
|
+
require 'ruby2d/window'
|
4
|
+
require 'ruby2d/application'
|
5
|
+
require 'ruby2d/color'
|
6
|
+
require 'ruby2d/quad'
|
7
|
+
require 'ruby2d/rectangle'
|
8
|
+
require 'ruby2d/square'
|
9
|
+
require 'ruby2d/triangle'
|
10
|
+
require 'ruby2d/image'
|
11
|
+
require 'ruby2d/text'
|
12
|
+
require 'ruby2d/dsl'
|
13
|
+
require 'ruby2d/exceptions'
|
14
|
+
require 'ruby2d/ruby2d' # load native extension
|
15
|
+
|
16
|
+
include Ruby2D::DSL
|
17
|
+
include Ruby2D
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# application.rb
|
2
|
+
|
3
|
+
module Ruby2D::Application
|
4
|
+
class << self
|
5
|
+
@@window = Ruby2D::Window.new
|
6
|
+
|
7
|
+
def get(sym)
|
8
|
+
@@window.get(sym)
|
9
|
+
end
|
10
|
+
|
11
|
+
def set(opts)
|
12
|
+
@@window.set(opts)
|
13
|
+
end
|
14
|
+
|
15
|
+
def on(mouse: nil, key: nil, key_down: nil, controller: nil, &proc)
|
16
|
+
@@window.on(mouse: mouse, key: key, key_down: key_down, controller: controller, &proc)
|
17
|
+
end
|
18
|
+
|
19
|
+
def add(o)
|
20
|
+
@@window.add(o)
|
21
|
+
end
|
22
|
+
|
23
|
+
def remove(o)
|
24
|
+
@@window.remove(o)
|
25
|
+
end
|
26
|
+
|
27
|
+
def clear
|
28
|
+
@@window.clear
|
29
|
+
end
|
30
|
+
|
31
|
+
def update(&proc)
|
32
|
+
@@window.update(&proc)
|
33
|
+
end
|
34
|
+
|
35
|
+
def show
|
36
|
+
@@window.show
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/ruby2d/color.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# color.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Color
|
5
|
+
|
6
|
+
attr_reader :r, :g, :b, :a
|
7
|
+
|
8
|
+
@@colors = {
|
9
|
+
'black' => [ 0, 0, 0, 255],
|
10
|
+
'gray' => [170, 170, 170, 255],
|
11
|
+
'silver' => [221, 221, 221, 255],
|
12
|
+
'white' => [255, 255, 255, 255],
|
13
|
+
'navy' => [ 0, 31, 63, 255],
|
14
|
+
'blue' => [ 0, 116, 217, 255],
|
15
|
+
'aqua' => [127, 219, 255, 255],
|
16
|
+
'teal' => [ 57, 204, 204, 255],
|
17
|
+
'olive' => [ 61, 153, 112, 255],
|
18
|
+
'green' => [ 46, 204, 64, 255],
|
19
|
+
'lime' => [ 1, 255, 112, 255],
|
20
|
+
'yellow' => [255, 220, 0, 255],
|
21
|
+
'orange' => [255, 133, 27, 255],
|
22
|
+
'red' => [255, 65, 54, 255],
|
23
|
+
'maroon' => [133, 20, 75, 255],
|
24
|
+
'fuchsia' => [240, 18, 190, 255],
|
25
|
+
'purple' => [177, 13, 201, 255],
|
26
|
+
'brown' => [102, 51, 0, 255],
|
27
|
+
'random' => []
|
28
|
+
}
|
29
|
+
|
30
|
+
def initialize(c)
|
31
|
+
if !self.class.is_valid? c
|
32
|
+
raise Error, "`#{c}` is not a valid color"
|
33
|
+
else
|
34
|
+
case c
|
35
|
+
when String
|
36
|
+
if c == 'random'
|
37
|
+
@r, @g, @b, @a = rand(0..1.0), rand(0..1.0), rand(0..1.0), 1.0
|
38
|
+
else
|
39
|
+
@r, @g, @b, @a = to_f(@@colors[c])
|
40
|
+
end
|
41
|
+
when Array
|
42
|
+
@r, @g, @b, @a = to_f([c[0], c[1], c[2], c[3]])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Color must be String, like 'red', or Array, like [1.0, 0, 0, 1.0]
|
48
|
+
def self.is_valid?(c)
|
49
|
+
(c.class == String && @@colors.key?(c)) ||
|
50
|
+
(c.class == Array && c.length == 4 &&
|
51
|
+
c.all? { |el| el.is_a? Numeric } &&
|
52
|
+
c.all? { |el| el.class == Fixnum && (0..255).include?(el) ||
|
53
|
+
el.class == Float && (0.0..1.0).include?(el) })
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# Convert from Fixnum (0..255) to Float (0.0..1.0)
|
59
|
+
def to_f(a)
|
60
|
+
b = []
|
61
|
+
a.each do |n|
|
62
|
+
if n.class == Fixnum
|
63
|
+
b.push(n / 255.0)
|
64
|
+
else
|
65
|
+
b.push(n)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
return b
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
data/lib/ruby2d/dsl.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# dsl.rb
|
2
|
+
|
3
|
+
module Ruby2D::DSL
|
4
|
+
def hello
|
5
|
+
puts "hi"
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(sym)
|
9
|
+
Ruby2D::Application.get(sym)
|
10
|
+
end
|
11
|
+
|
12
|
+
def set(opts)
|
13
|
+
Ruby2D::Application.set(opts)
|
14
|
+
end
|
15
|
+
|
16
|
+
def on(mouse: nil, key: nil, key_down: nil, controller: nil, &proc)
|
17
|
+
Ruby2D::Application.on(mouse: mouse, key: key, key_down: key_down, controller: controller, &proc)
|
18
|
+
end
|
19
|
+
|
20
|
+
def update(&proc)
|
21
|
+
Ruby2D::Application.update(&proc)
|
22
|
+
end
|
23
|
+
|
24
|
+
def show
|
25
|
+
Ruby2D::Application.show
|
26
|
+
end
|
27
|
+
|
28
|
+
def clear
|
29
|
+
Ruby2D::Application.clear
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# exceptions.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Error < StandardError
|
5
|
+
def colorize(msg, c); "\e[#{c}m#{msg}\e[0m" end
|
6
|
+
def error(msg); colorize(msg, '4;31') end
|
7
|
+
def bold(msg); colorize(msg, '1') end
|
8
|
+
|
9
|
+
def initialize(msg)
|
10
|
+
super(msg)
|
11
|
+
puts error("\nRuby 2D Error:") << " " << msg
|
12
|
+
puts bold("Occurred in:")
|
13
|
+
puts bold(" " + caller.last), "\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/ruby2d/image.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# image.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Image
|
5
|
+
|
6
|
+
attr_accessor :x, :y
|
7
|
+
|
8
|
+
def initialize(x, y, path)
|
9
|
+
|
10
|
+
unless File.exists? path
|
11
|
+
raise Error, "Cannot find image file `#{path}`"
|
12
|
+
end
|
13
|
+
|
14
|
+
@type_id = 3
|
15
|
+
@x, @y, @path = x, y, path
|
16
|
+
|
17
|
+
if defined? Ruby2D::DSL
|
18
|
+
Ruby2D::Application.add(self)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove
|
23
|
+
if defined? Ruby2D::DSL
|
24
|
+
Ruby2D::Application.remove(self)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/ruby2d/quad.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# quad.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Quad
|
5
|
+
# Coordinates in clockwise order, starting at top left:
|
6
|
+
# x1,y1 == top left
|
7
|
+
# x2,y2 == top right
|
8
|
+
# x3,y3 == bottom right
|
9
|
+
# x4,y4 == bottom left
|
10
|
+
attr_accessor :x1, :y1, :c1,
|
11
|
+
:x2, :y2, :c2,
|
12
|
+
:x3, :y3, :c3,
|
13
|
+
:x4, :y4, :c4
|
14
|
+
|
15
|
+
attr_reader :color
|
16
|
+
|
17
|
+
def initialize(x1=0, y1=0, x2=100, y2=0, x3=100, y3=100, x4=100, y4=100, c='white')
|
18
|
+
@type_id = 2
|
19
|
+
@x1, @y1, @x2, @y2, @x3, @y3, @x4, @y4 = x1, y1, x2, y2, x3, y3, x4, y4
|
20
|
+
@color = c
|
21
|
+
update_color(c)
|
22
|
+
|
23
|
+
if defined? Ruby2D::DSL
|
24
|
+
Ruby2D::Application.add(self)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def color=(c)
|
29
|
+
@color = c
|
30
|
+
update_color(c)
|
31
|
+
end
|
32
|
+
|
33
|
+
def remove
|
34
|
+
if defined? Ruby2D::DSL
|
35
|
+
Ruby2D::Application.remove(self)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def update_color(c)
|
42
|
+
|
43
|
+
# If a valid color, use it for each vertex
|
44
|
+
if Color.is_valid? c
|
45
|
+
@c1 = Ruby2D::Color.new(c)
|
46
|
+
@c2 = Ruby2D::Color.new(c)
|
47
|
+
@c3 = Ruby2D::Color.new(c)
|
48
|
+
@c4 = Ruby2D::Color.new(c)
|
49
|
+
|
50
|
+
# If a valid array of colors, assign them to each vertex, respectively
|
51
|
+
elsif c.all? { |el| Color.is_valid? el }
|
52
|
+
@c1 = Ruby2D::Color.new(c[0])
|
53
|
+
@c2 = Ruby2D::Color.new(c[1])
|
54
|
+
@c3 = Ruby2D::Color.new(c[2])
|
55
|
+
@c4 = Ruby2D::Color.new(c[3])
|
56
|
+
else
|
57
|
+
raise Error, "Not a valid color for #{self.class}"
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# rectangle.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Rectangle < Ruby2D::Quad
|
5
|
+
|
6
|
+
attr_reader :x, :y, :width, :height
|
7
|
+
|
8
|
+
def initialize(x=0, y=0, w=200, h=100, c='white')
|
9
|
+
@type_id = 2
|
10
|
+
@x, @y, @width, @height, @color = x, y, w, h, c
|
11
|
+
update_coords(x, y, w, h)
|
12
|
+
update_color(c)
|
13
|
+
|
14
|
+
if defined? Ruby2D::DSL
|
15
|
+
Ruby2D::Application.add(self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def x=(x)
|
20
|
+
@x = @x1 = x
|
21
|
+
@x2 = x + @width
|
22
|
+
@x3 = x + @width
|
23
|
+
@x4 = x
|
24
|
+
end
|
25
|
+
|
26
|
+
def y=(y)
|
27
|
+
@y = @y1 = y
|
28
|
+
@y2 = y
|
29
|
+
@y3 = y + @height
|
30
|
+
@y4 = y + @height
|
31
|
+
end
|
32
|
+
|
33
|
+
def width=(w)
|
34
|
+
@width = w
|
35
|
+
update_coords(@x, @y, w, @height)
|
36
|
+
end
|
37
|
+
|
38
|
+
def height=(h)
|
39
|
+
@height = h
|
40
|
+
update_coords(@x, @y, @width, h)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def update_coords(x, y, w, h)
|
46
|
+
@x1 = x
|
47
|
+
@y1 = y
|
48
|
+
@x2 = x + w
|
49
|
+
@y2 = y
|
50
|
+
@x4 = x
|
51
|
+
@y4 = y + h
|
52
|
+
@x3 = x + w
|
53
|
+
@y3 = y + h
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
data/lib/ruby2d/sound.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# sound.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Sound
|
5
|
+
|
6
|
+
def initialize(window, path)
|
7
|
+
unless File.exists? path
|
8
|
+
raise Error, "Cannot find sound file!"
|
9
|
+
end
|
10
|
+
window.create_audio(self, path)
|
11
|
+
@window, @path = window, path
|
12
|
+
end
|
13
|
+
|
14
|
+
def play
|
15
|
+
@window.play_audio(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# square.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Square < Ruby2D::Rectangle
|
5
|
+
|
6
|
+
attr_reader :size
|
7
|
+
|
8
|
+
def initialize(x=0, y=0, s=100, c='white')
|
9
|
+
@type_id = 2
|
10
|
+
@x, @y, @color = x, y, c
|
11
|
+
@width = @height = @size = s
|
12
|
+
update_coords(x, y, s, s)
|
13
|
+
update_color(c)
|
14
|
+
|
15
|
+
if defined? Ruby2D::DSL
|
16
|
+
Ruby2D::Application.add(self)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def size=(s)
|
21
|
+
self.width = self.height = @size = s
|
22
|
+
end
|
23
|
+
|
24
|
+
private :width=, :height=
|
25
|
+
end
|
26
|
+
end
|
data/lib/ruby2d/text.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# text.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Text
|
5
|
+
|
6
|
+
attr_accessor :x, :y, :size, :text
|
7
|
+
|
8
|
+
def initialize(x=0, y=0, size=20, text="Hello World!", font="Arial", c="white")
|
9
|
+
if font.include? '.'
|
10
|
+
unless File.exists? font
|
11
|
+
raise Error, "Cannot find font file!"
|
12
|
+
else
|
13
|
+
@font = font
|
14
|
+
end
|
15
|
+
else
|
16
|
+
@font = resolve_path(font)
|
17
|
+
end
|
18
|
+
|
19
|
+
@type_id = 4
|
20
|
+
@x, @y, @size = x, y, size
|
21
|
+
@text, @color = text, c
|
22
|
+
update_color(c)
|
23
|
+
|
24
|
+
if defined? Ruby2D::DSL
|
25
|
+
Ruby2D::Application.add(self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def color=(c)
|
30
|
+
@color = c
|
31
|
+
update_color(c)
|
32
|
+
end
|
33
|
+
|
34
|
+
def text=(t)
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove
|
39
|
+
if defined? Ruby2D::DSL
|
40
|
+
Ruby2D::Application.remove(self)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def resolve_path(font)
|
47
|
+
# TODO: Consider CSS names, like 'serif', 'san-serif', 'monospace'
|
48
|
+
if RUBY_PLATFORM =~ /darwin/
|
49
|
+
font_path = "/Library/Fonts/#{font}.ttf"
|
50
|
+
unless File.exists? font_path
|
51
|
+
raise Error, "Cannot find system font!"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
font_path
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_color(c)
|
58
|
+
@c = Ruby2D::Color.new(c)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# triangle.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Triangle
|
5
|
+
|
6
|
+
attr_accessor :x1, :y1, :c1,
|
7
|
+
:x2, :y2, :c2,
|
8
|
+
:x3, :y3, :c3
|
9
|
+
attr_reader :color
|
10
|
+
|
11
|
+
def initialize(x1=50, y1=0, x2=100, y2=100, x3=0, y3=100, c='white')
|
12
|
+
@type_id = 1
|
13
|
+
@x1, @y1 = x1, y1
|
14
|
+
@x2, @y2 = x2, y2
|
15
|
+
@x3, @y3 = x3, y3
|
16
|
+
@color = c
|
17
|
+
update_color(c)
|
18
|
+
|
19
|
+
if defined? Ruby2D::DSL
|
20
|
+
Ruby2D::Application.add(self)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def color=(c)
|
25
|
+
update_color(c)
|
26
|
+
@color = c
|
27
|
+
end
|
28
|
+
|
29
|
+
def remove
|
30
|
+
if defined? Ruby2D::DSL
|
31
|
+
Ruby2D::Application.remove(self)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def update_color(c)
|
38
|
+
# If a 2D array
|
39
|
+
if c.class == Array && c.all? { |el| el.class == Array }
|
40
|
+
@c1 = Ruby2D::Color.new(c[0])
|
41
|
+
@c2 = Ruby2D::Color.new(c[1])
|
42
|
+
@c3 = Ruby2D::Color.new(c[2])
|
43
|
+
else
|
44
|
+
@c1 = Ruby2D::Color.new(c)
|
45
|
+
@c2 = Ruby2D::Color.new(c)
|
46
|
+
@c3 = Ruby2D::Color.new(c)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
# window.rb
|
2
|
+
|
3
|
+
module Ruby2D
|
4
|
+
class Window
|
5
|
+
attr_reader :title, :width, :height, :mouse_x, :mouse_y
|
6
|
+
|
7
|
+
def initialize(width: 640, height: 480, title: "Ruby 2D", fps: 60, vsync: true)
|
8
|
+
@width, @height, @title = width, height, title
|
9
|
+
@mouse_x = @mouse_y = 0
|
10
|
+
@fps_cap = fps
|
11
|
+
@fps = 60
|
12
|
+
@vsync = vsync
|
13
|
+
|
14
|
+
@objects = []
|
15
|
+
@keys = {}
|
16
|
+
@keys_down = {}
|
17
|
+
@controller = {}
|
18
|
+
@update_proc = Proc.new {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(sym)
|
22
|
+
case sym
|
23
|
+
when :window
|
24
|
+
return self
|
25
|
+
when :title
|
26
|
+
return @title
|
27
|
+
when :width
|
28
|
+
return @width
|
29
|
+
when :height
|
30
|
+
return @height
|
31
|
+
when :fps
|
32
|
+
return @fps
|
33
|
+
when :mouse_x
|
34
|
+
return @mouse_x
|
35
|
+
when :mouse_y
|
36
|
+
return @mouse_y
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def set(opts)
|
41
|
+
if opts.include? :title
|
42
|
+
@title = opts[:title]
|
43
|
+
end
|
44
|
+
|
45
|
+
if opts.include? :width
|
46
|
+
@width = opts[:width]
|
47
|
+
end
|
48
|
+
|
49
|
+
if opts.include? :height
|
50
|
+
@height = opts[:height]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def add(o)
|
55
|
+
case o
|
56
|
+
when nil
|
57
|
+
raise Error, "Cannot add '#{o.class}' to window!"
|
58
|
+
when Array
|
59
|
+
o.each { |x| add_object(x) }
|
60
|
+
else
|
61
|
+
add_object(o)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def remove(o)
|
66
|
+
if o == nil
|
67
|
+
raise Error, "Cannot remove '#{o.class}' from window!"
|
68
|
+
end
|
69
|
+
|
70
|
+
if i = @objects.index(o)
|
71
|
+
@objects.slice!(i)
|
72
|
+
true
|
73
|
+
else
|
74
|
+
false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def clear
|
79
|
+
@objects.clear
|
80
|
+
end
|
81
|
+
|
82
|
+
def update(&proc)
|
83
|
+
@update_proc = proc
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
def on(mouse: nil, key: nil, key_down: nil, controller: nil, &proc)
|
88
|
+
unless mouse.nil?
|
89
|
+
# reg_mouse(btn, &proc)
|
90
|
+
end
|
91
|
+
|
92
|
+
unless key.nil?
|
93
|
+
reg_key(key, &proc)
|
94
|
+
end
|
95
|
+
|
96
|
+
unless key_down.nil?
|
97
|
+
reg_key_down(key_down, &proc)
|
98
|
+
end
|
99
|
+
|
100
|
+
unless controller.nil?
|
101
|
+
reg_controller(controller, &proc)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def key_callback(key)
|
106
|
+
key.downcase!
|
107
|
+
if @keys.has_key? key
|
108
|
+
@keys[key].call
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def key_down_callback(key)
|
113
|
+
key.downcase!
|
114
|
+
if @keys_down.has_key? key
|
115
|
+
@keys_down[key].call
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def controller_callback(is_axis, axis, val, is_btn, btn)
|
120
|
+
|
121
|
+
# puts "is_axis: #{is_axis}, axis: #{axis}, val: #{val}, is_btn: #{is_btn}, btn: #{btn}"
|
122
|
+
|
123
|
+
if is_axis
|
124
|
+
if axis == 0 && val == -32768
|
125
|
+
event = 'left'
|
126
|
+
elsif axis == 0 && val == 32767
|
127
|
+
event = 'right'
|
128
|
+
elsif axis == 1 && val == -32768
|
129
|
+
event = 'up'
|
130
|
+
elsif axis == 1 && val == 32767
|
131
|
+
event = 'down'
|
132
|
+
end
|
133
|
+
elsif is_btn
|
134
|
+
event = btn
|
135
|
+
end
|
136
|
+
|
137
|
+
if @controller.has_key? event
|
138
|
+
@controller[event].call
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def update_callback
|
143
|
+
@update_proc.call
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
def add_object(o)
|
149
|
+
if !@objects.include?(o)
|
150
|
+
@objects.push(o)
|
151
|
+
true
|
152
|
+
else
|
153
|
+
false
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# Register key string with proc
|
158
|
+
def reg_key(key, &proc)
|
159
|
+
@keys[key] = proc
|
160
|
+
true
|
161
|
+
end
|
162
|
+
|
163
|
+
# Register key string with proc
|
164
|
+
def reg_key_down(key, &proc)
|
165
|
+
@keys_down[key] = proc
|
166
|
+
true
|
167
|
+
end
|
168
|
+
|
169
|
+
# Register controller string with proc
|
170
|
+
def reg_controller(event, &proc)
|
171
|
+
@controller[event] = proc
|
172
|
+
true
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|
metadata
CHANGED
@@ -1,23 +1,56 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby2d
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Black
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2016-01-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.4'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.4'
|
27
|
+
description: Make cross-platform 2D applications in Ruby
|
14
28
|
email: "@blacktm"
|
15
|
-
executables:
|
16
|
-
|
29
|
+
executables:
|
30
|
+
- ruby2d
|
31
|
+
extensions:
|
32
|
+
- ext/ruby2d/extconf.rb
|
17
33
|
extra_rdoc_files: []
|
18
34
|
files:
|
35
|
+
- assets/app.icns
|
36
|
+
- bin/ruby2d
|
37
|
+
- ext/ruby2d/extconf.rb
|
38
|
+
- ext/ruby2d/ruby2d.c
|
19
39
|
- lib/ruby2d.rb
|
20
|
-
|
40
|
+
- lib/ruby2d/application.rb
|
41
|
+
- lib/ruby2d/color.rb
|
42
|
+
- lib/ruby2d/dsl.rb
|
43
|
+
- lib/ruby2d/exceptions.rb
|
44
|
+
- lib/ruby2d/image.rb
|
45
|
+
- lib/ruby2d/quad.rb
|
46
|
+
- lib/ruby2d/rectangle.rb
|
47
|
+
- lib/ruby2d/sound.rb
|
48
|
+
- lib/ruby2d/square.rb
|
49
|
+
- lib/ruby2d/text.rb
|
50
|
+
- lib/ruby2d/triangle.rb
|
51
|
+
- lib/ruby2d/version.rb
|
52
|
+
- lib/ruby2d/window.rb
|
53
|
+
homepage: http://www.ruby2d.com
|
21
54
|
licenses:
|
22
55
|
- MIT
|
23
56
|
metadata: {}
|
@@ -29,7 +62,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
29
62
|
requirements:
|
30
63
|
- - ">="
|
31
64
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
65
|
+
version: 2.0.0
|
33
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
67
|
requirements:
|
35
68
|
- - ">="
|
@@ -37,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
37
70
|
version: '0'
|
38
71
|
requirements: []
|
39
72
|
rubyforge_project:
|
40
|
-
rubygems_version: 2.
|
73
|
+
rubygems_version: 2.5.1
|
41
74
|
signing_key:
|
42
75
|
specification_version: 4
|
43
76
|
summary: Ruby 2D
|