graphics 1.0.0b1 → 1.0.0b4
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +30 -0
- data/Manifest.txt +39 -7
- data/README.rdoc +48 -4
- data/Rakefile +8 -2
- data/examples/boid.rb +9 -18
- data/examples/bounce.rb +15 -23
- data/examples/canvas.rb +75 -0
- data/examples/collision.rb +6 -6
- data/examples/demo.rb +5 -7
- data/examples/editor.rb +12 -9
- data/examples/fluid.rb +2 -3
- data/examples/fluid2.rb +1 -1
- data/examples/{lito2.rb → gol.rb} +0 -0
- data/examples/{zenspider4.rb → gol2.rb} +0 -0
- data/examples/logo.rb +4 -7
- data/examples/maze.rb +136 -0
- data/examples/tank.rb +10 -11
- data/examples/tank2.rb +12 -17
- data/examples/targeting.rb +1 -1
- data/examples/vants.rb +1 -1
- data/examples/walker.rb +3 -12
- data/examples/walker2.rb +197 -0
- data/examples/zombies.rb +31 -35
- data/ext/sdl/extconf.rb +31 -0
- data/ext/sdl/sdl.c +1067 -0
- data/ext/sdl/sge/INSTALL +72 -0
- data/ext/sdl/sge/LICENSE +504 -0
- data/ext/sdl/sge/Makefile +83 -0
- data/ext/sdl/sge/Makefile.conf +63 -0
- data/ext/sdl/sge/README +219 -0
- data/ext/sdl/sge/Todo +7 -0
- data/ext/sdl/sge/WhatsNew +224 -0
- data/ext/sdl/sge/sge.h +31 -0
- data/ext/sdl/sge/sge_blib.cpp +1939 -0
- data/ext/sdl/sge/sge_blib.h +68 -0
- data/ext/sdl/sge/sge_bm_text.cpp +451 -0
- data/ext/sdl/sge/sge_bm_text.h +71 -0
- data/ext/sdl/sge/sge_collision.cpp +388 -0
- data/ext/sdl/sge/sge_collision.h +54 -0
- data/ext/sdl/sge/sge_config.h +6 -0
- data/ext/sdl/sge/sge_internal.h +152 -0
- data/ext/sdl/sge/sge_misc.cpp +92 -0
- data/ext/sdl/sge/sge_misc.h +37 -0
- data/ext/sdl/sge/sge_primitives.cpp +2516 -0
- data/ext/sdl/sge/sge_primitives.h +111 -0
- data/ext/sdl/sge/sge_rotation.cpp +683 -0
- data/ext/sdl/sge/sge_rotation.h +46 -0
- data/ext/sdl/sge/sge_shape.cpp +762 -0
- data/ext/sdl/sge/sge_shape.h +365 -0
- data/ext/sdl/sge/sge_surface.cpp +1090 -0
- data/ext/sdl/sge/sge_surface.h +100 -0
- data/ext/sdl/sge/sge_textpp.cpp +785 -0
- data/ext/sdl/sge/sge_textpp.h +270 -0
- data/ext/sdl/sge/sge_tt_text.cpp +1456 -0
- data/ext/sdl/sge/sge_tt_text.h +114 -0
- data/graphics_setup.sh +26 -0
- data/lib/graphics.rb +1 -1
- data/lib/graphics/body.rb +50 -3
- data/lib/graphics/extensions.rb +13 -7
- data/lib/graphics/simulation.rb +126 -46
- data/test/test_graphics.rb +52 -12
- data/test/test_sdl.rb +1 -0
- metadata +54 -23
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
- data/examples/lito.rb +0 -108
- data/examples/zenspider1.rb +0 -93
- data/examples/zenspider2.rb +0 -123
- data/examples/zenspider3.rb +0 -104
- data/rubysdl_setup.sh +0 -34
@@ -0,0 +1,114 @@
|
|
1
|
+
/*
|
2
|
+
* SDL Graphics Extension
|
3
|
+
* Text/TrueType functions (header)
|
4
|
+
*
|
5
|
+
* Started 990815
|
6
|
+
*
|
7
|
+
* License: LGPL v2+ (see the file LICENSE)
|
8
|
+
* (c)1999-2003 Anders Lindstr�m
|
9
|
+
*
|
10
|
+
* Uses the excellent FreeType 2 library, available at:
|
11
|
+
* http://www.freetype.org/
|
12
|
+
*/
|
13
|
+
|
14
|
+
/*********************************************************************
|
15
|
+
* This library is free software; you can redistribute it and/or *
|
16
|
+
* modify it under the terms of the GNU Library General Public *
|
17
|
+
* License as published by the Free Software Foundation; either *
|
18
|
+
* version 2 of the License, or (at your option) any later version. *
|
19
|
+
*********************************************************************/
|
20
|
+
|
21
|
+
#ifndef sge_tt_text_H
|
22
|
+
#define sge_tt_text_H
|
23
|
+
|
24
|
+
#include "SDL.h"
|
25
|
+
#include "sge_internal.h"
|
26
|
+
|
27
|
+
/* Text input flags */
|
28
|
+
#define SGE_IBG SGE_FLAG1
|
29
|
+
#define SGE_IDEL SGE_FLAG2
|
30
|
+
#define SGE_INOKR SGE_FLAG3
|
31
|
+
|
32
|
+
#ifndef _SGE_NOTTF
|
33
|
+
|
34
|
+
/* the truetype font structure */
|
35
|
+
typedef struct _sge_TTFont sge_TTFont;
|
36
|
+
|
37
|
+
/* Font style */
|
38
|
+
#define SGE_TTF_NORMAL SGE_FLAG0
|
39
|
+
#define SGE_TTF_BOLD SGE_FLAG1
|
40
|
+
#define SGE_TTF_ITALIC SGE_FLAG2
|
41
|
+
#define SGE_TTF_UNDERLINE SGE_FLAG3
|
42
|
+
|
43
|
+
/* ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) */
|
44
|
+
#define UNICODE_BOM_NATIVE 0xFEFF
|
45
|
+
#define UNICODE_BOM_SWAPPED 0xFFFE
|
46
|
+
|
47
|
+
#endif /* _SGE_NOTTF */
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
#ifdef _SGE_C
|
52
|
+
extern "C" {
|
53
|
+
#endif
|
54
|
+
#ifndef _SGE_NOTTF
|
55
|
+
DECLSPEC void sge_TTF_AAOff(void);
|
56
|
+
DECLSPEC void sge_TTF_AAOn(void);
|
57
|
+
DECLSPEC void sge_TTF_AA_Alpha(void);
|
58
|
+
DECLSPEC void sge_TTF_ByteSwappedUNICODE(int swapped);
|
59
|
+
|
60
|
+
DECLSPEC int sge_TTF_Init(void);
|
61
|
+
DECLSPEC sge_TTFont *sge_TTF_OpenFont(const char *file, int ptsize);
|
62
|
+
DECLSPEC sge_TTFont *sge_TTF_OpenFontRW( SDL_RWops *src, int freesrc, int ptsize, int xdpi, int ydpi);
|
63
|
+
DECLSPEC sge_TTFont *sge_TTF_OpenFontIndex(const char *file, int ptsize, long index, int xdpi, int ydpi);
|
64
|
+
DECLSPEC sge_TTFont *sge_TTF_OpenFontIndexRW(SDL_RWops *src, int freesrc, int ptsize, long index, int xdpi, int ydpi);
|
65
|
+
DECLSPEC int sge_TTF_SetFontSize(sge_TTFont *font, int ptsize);
|
66
|
+
DECLSPEC int sge_TTF_SetFontSizeDPI(sge_TTFont *font, int ptsize, int xdpi, int ydpi);
|
67
|
+
|
68
|
+
DECLSPEC int sge_TTF_FontHeight(sge_TTFont *font);
|
69
|
+
DECLSPEC int sge_TTF_FontAscent(sge_TTFont *font);
|
70
|
+
DECLSPEC int sge_TTF_FontDescent(sge_TTFont *font);
|
71
|
+
DECLSPEC int sge_TTF_FontLineSkip(sge_TTFont *font);
|
72
|
+
DECLSPEC long sge_TTF_FontFaces(sge_TTFont *font);
|
73
|
+
DECLSPEC int sge_TTF_FontFaceIsFixedWidth(sge_TTFont *font);
|
74
|
+
DECLSPEC char *sge_TTF_FontFaceFamilyName(sge_TTFont *font);
|
75
|
+
DECLSPEC char *sge_TTF_FontFaceStyleName(sge_TTFont *font);
|
76
|
+
|
77
|
+
DECLSPEC void sge_TTF_SetFontStyle(sge_TTFont *font, Uint8 style);
|
78
|
+
DECLSPEC Uint8 sge_TTF_GetFontStyle(sge_TTFont *font);
|
79
|
+
|
80
|
+
DECLSPEC void sge_TTF_CloseFont(sge_TTFont *font);
|
81
|
+
|
82
|
+
DECLSPEC SDL_Rect sge_TTF_TextSizeUNI(sge_TTFont *font, const Uint16 *text);
|
83
|
+
DECLSPEC SDL_Rect sge_TTF_TextSize(sge_TTFont *Font, char *Text);
|
84
|
+
|
85
|
+
DECLSPEC SDL_Rect sge_tt_textout(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint32 fcolor, Uint32 bcolor, int Alpha);
|
86
|
+
DECLSPEC SDL_Rect sge_tt_textout_UTF8(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint32 fcolor, Uint32 bcolor, int Alpha);
|
87
|
+
DECLSPEC SDL_Rect sge_tt_textout_UNI(SDL_Surface *Surface, sge_TTFont *font, const Uint16 *uni, Sint16 x, Sint16 y, Uint32 fcolor, Uint32 bcolor, int Alpha);
|
88
|
+
|
89
|
+
DECLSPEC SDL_Rect sge_tt_textoutf(SDL_Surface *Surface, sge_TTFont *font, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha ,char *format,...);
|
90
|
+
|
91
|
+
DECLSPEC int sge_tt_input_UNI(SDL_Surface *screen,sge_TTFont *font,Uint16 *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint32 fcol, Uint32 bcol, int Alpha);
|
92
|
+
DECLSPEC int sge_tt_input(SDL_Surface *screen,sge_TTFont *font,char *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint32 fcol, Uint32 bcol, int Alpha);
|
93
|
+
|
94
|
+
DECLSPEC SDL_Surface *sge_TTF_Render(sge_TTFont *font,const Uint16 *text, SDL_Color fg, SDL_Color bg, int alpha_level);
|
95
|
+
DECLSPEC SDL_Surface *sge_TTF_RenderUNICODE(sge_TTFont *font,const Uint16 *text, SDL_Color fg, SDL_Color bg);
|
96
|
+
#endif /* _SGE_NOTTF */
|
97
|
+
|
98
|
+
DECLSPEC Uint16 *sge_Latin1_Uni(const char *text);
|
99
|
+
#ifdef _SGE_C
|
100
|
+
}
|
101
|
+
#endif
|
102
|
+
|
103
|
+
|
104
|
+
#ifndef sge_C_ONLY
|
105
|
+
#ifndef _SGE_NOTTF
|
106
|
+
DECLSPEC SDL_Rect sge_tt_textout(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha);
|
107
|
+
DECLSPEC SDL_Rect sge_tt_textout_UTF8(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha);
|
108
|
+
DECLSPEC SDL_Rect sge_tt_textout_UNI(SDL_Surface *Surface, sge_TTFont *font, const Uint16 *uni, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha);
|
109
|
+
DECLSPEC int sge_tt_input_UNI(SDL_Surface *screen,sge_TTFont *font,Uint16 *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR,Uint8 bG,Uint8 bB, int Alpha);
|
110
|
+
DECLSPEC int sge_tt_input(SDL_Surface *screen,sge_TTFont *font,char *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR,Uint8 bG,Uint8 bB, int Alpha);
|
111
|
+
#endif /* _SGE_NOTTF */
|
112
|
+
#endif /* sge_C_ONLY */
|
113
|
+
|
114
|
+
#endif /* sge_tt_text_H */
|
data/graphics_setup.sh
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
set -e
|
3
|
+
|
4
|
+
for pkg in sdl sdl_image sdl_ttf sdl_mixer sdl_gfx smpeg freetype libogg libvorbis libsmpeg libpng libtiff; do
|
5
|
+
brew uninstall $pkg || true
|
6
|
+
done
|
7
|
+
|
8
|
+
for gem in graphics rubysdl rsdl; do
|
9
|
+
gem uninstall -ax $gem || true
|
10
|
+
done
|
11
|
+
|
12
|
+
# brew update
|
13
|
+
|
14
|
+
brew install sdl
|
15
|
+
brew install sdl_mixer --with-smpeg
|
16
|
+
brew install sdl_ttf
|
17
|
+
brew install sdl_image
|
18
|
+
|
19
|
+
if [ -f $0 ]; then
|
20
|
+
rake clean package
|
21
|
+
gem install pkg/graphics*.gem
|
22
|
+
else
|
23
|
+
gem install graphics --pre
|
24
|
+
fi
|
25
|
+
|
26
|
+
rsdl -rgraphics -e 'Class.new(Graphics::Simulation) { def draw n; clear :white; text "hit escape to quit", 100, 100, :black; end; }.new(500, 250, 0, "Working!").run'
|
data/lib/graphics.rb
CHANGED
data/lib/graphics/body.rb
CHANGED
@@ -27,7 +27,35 @@ class Graphics::Body
|
|
27
27
|
:west => 0,
|
28
28
|
}
|
29
29
|
|
30
|
-
|
30
|
+
##
|
31
|
+
# Body's x coordinate.
|
32
|
+
|
33
|
+
attr_accessor :x
|
34
|
+
|
35
|
+
##
|
36
|
+
# Body's y coordinate.
|
37
|
+
|
38
|
+
attr_accessor :y
|
39
|
+
|
40
|
+
##
|
41
|
+
# Body's angle, in degrees.
|
42
|
+
|
43
|
+
attr_accessor :a
|
44
|
+
|
45
|
+
##
|
46
|
+
# Body's goal angle, in degrees.
|
47
|
+
|
48
|
+
attr_accessor :ga
|
49
|
+
|
50
|
+
##
|
51
|
+
# Body's magnitude.
|
52
|
+
|
53
|
+
attr_accessor :m
|
54
|
+
|
55
|
+
##
|
56
|
+
# Body's window.
|
57
|
+
|
58
|
+
attr_accessor :w
|
31
59
|
|
32
60
|
##
|
33
61
|
# Create a new body in windowing system +w+ with a random x/y and
|
@@ -92,6 +120,25 @@ class Graphics::Body
|
|
92
120
|
[dx, dy]
|
93
121
|
end
|
94
122
|
|
123
|
+
##
|
124
|
+
# Return the angle to another body in degrees.
|
125
|
+
|
126
|
+
def angle_to body
|
127
|
+
dx = body.x - self.x
|
128
|
+
dy = body.y - self.y
|
129
|
+
|
130
|
+
(R2D * Math.atan2(dy, dx)).degrees
|
131
|
+
end
|
132
|
+
|
133
|
+
##
|
134
|
+
# Return the distance to another body, squared.
|
135
|
+
|
136
|
+
def distance_to_squared p
|
137
|
+
dx = p.x - x
|
138
|
+
dy = p.y - y
|
139
|
+
dx * dx + dy * dy
|
140
|
+
end
|
141
|
+
|
95
142
|
def m_a # :nodoc:
|
96
143
|
[m, a]
|
97
144
|
end
|
@@ -139,10 +186,10 @@ class Graphics::Body
|
|
139
186
|
|
140
187
|
if y < 0 then
|
141
188
|
self.y = 0
|
142
|
-
return :
|
189
|
+
return :south
|
143
190
|
elsif y > max_h then
|
144
191
|
self.y = max_h
|
145
|
-
return :
|
192
|
+
return :north
|
146
193
|
end
|
147
194
|
|
148
195
|
nil
|
data/lib/graphics/extensions.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
##
|
2
|
+
# Integer extensions for graphics
|
3
|
+
|
1
4
|
class Integer
|
2
5
|
##
|
3
6
|
# Calculate a random chance using easy notation: 1 =~ 50 :: 1 in 50 chance
|
@@ -7,6 +10,9 @@ class Integer
|
|
7
10
|
end
|
8
11
|
end
|
9
12
|
|
13
|
+
##
|
14
|
+
# Numeric extensions for graphics
|
15
|
+
|
10
16
|
class Numeric
|
11
17
|
##
|
12
18
|
# Is M close to N within a certain delta?
|
@@ -30,16 +36,16 @@ class Numeric
|
|
30
36
|
# Consider this method private, even tho it is in use by the demos.
|
31
37
|
|
32
38
|
def relative_angle n, max
|
33
|
-
|
34
|
-
|
39
|
+
delta_cw = (self - n).degrees
|
40
|
+
delta_cc = (n - self).degrees
|
35
41
|
|
36
|
-
return if
|
42
|
+
return if delta_cc < 0.1 || delta_cw < 0.1
|
37
43
|
|
38
|
-
if
|
39
|
-
|
40
|
-
elsif
|
44
|
+
if delta_cc.abs < max then
|
45
|
+
delta_cc
|
46
|
+
elsif delta_cw.close_to? 180 then
|
41
47
|
[-max, max].sample
|
42
|
-
elsif
|
48
|
+
elsif delta_cw < delta_cc then
|
43
49
|
-max
|
44
50
|
else
|
45
51
|
max
|
data/lib/graphics/simulation.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
require "sdl"
|
3
|
+
require "sdl/sdl"
|
4
4
|
|
5
5
|
module SDL; end # :nodoc: -- stupid rdoc :(
|
6
6
|
|
@@ -38,6 +38,12 @@ class Graphics::Simulation
|
|
38
38
|
# A hash of color values to their rgb values. For text, apparently. *shrug*
|
39
39
|
attr_accessor :rgb
|
40
40
|
|
41
|
+
# Number of update iterations per drawing tick.
|
42
|
+
attr_accessor :iter_per_tick
|
43
|
+
|
44
|
+
# Procs registered to handle key events.
|
45
|
+
attr_accessor :key_handler
|
46
|
+
|
41
47
|
##
|
42
48
|
# Create a new simulation of a certain width and height. Optionally,
|
43
49
|
# you can set the bits per pixel (0 for current screen settings),
|
@@ -47,11 +53,10 @@ class Graphics::Simulation
|
|
47
53
|
|
48
54
|
def initialize w, h, bpp = 0, name = self.class.name, full = false
|
49
55
|
SDL.init SDL::INIT_VIDEO
|
50
|
-
SDL::TTF.init
|
51
56
|
|
52
57
|
full = full ? SDL::FULLSCREEN : 0
|
53
58
|
|
54
|
-
self.font =
|
59
|
+
self.font = find_font("Menlo", 32)
|
55
60
|
|
56
61
|
SDL::WM.set_caption name, name
|
57
62
|
|
@@ -59,8 +64,29 @@ class Graphics::Simulation
|
|
59
64
|
self.w, self.h = screen.w, screen.h
|
60
65
|
|
61
66
|
self.color = {}
|
62
|
-
self.rgb = Hash.new { |hash, k| hash[k] = screen.get_rgb(color[k]) }
|
67
|
+
self.rgb = Hash.new { |hash, k| hash[k] = screen.format.get_rgb(color[k]) }
|
68
|
+
self.paused = false
|
63
69
|
|
70
|
+
self.iter_per_tick = 1
|
71
|
+
|
72
|
+
self.key_handler = []
|
73
|
+
|
74
|
+
initialize_keys
|
75
|
+
initialize_colors
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# Register default key events. Handles ESC & Q (quit) and P (pause).
|
80
|
+
|
81
|
+
def initialize_keys
|
82
|
+
add_key_handler(:ESCAPE) { exit }
|
83
|
+
add_key_handler(:Q) { exit }
|
84
|
+
add_key_handler(:P) { self.paused = !paused }
|
85
|
+
add_key_handler(:SLASH) { self.iter_per_tick += 1 }
|
86
|
+
add_key_handler(:MINUS) { self.iter_per_tick -= 1; self.iter_per_tick = 1 if iter_per_tick < 1 }
|
87
|
+
end
|
88
|
+
|
89
|
+
def initialize_colors # :nodoc:
|
64
90
|
register_color :black, 0, 0, 0
|
65
91
|
register_color :white, 255, 255, 255
|
66
92
|
register_color :red, 255, 0, 0
|
@@ -72,13 +98,27 @@ class Graphics::Simulation
|
|
72
98
|
|
73
99
|
(0..99).each do |n|
|
74
100
|
m = (255 * (n / 100.0)).to_i
|
75
|
-
register_color
|
76
|
-
register_color
|
77
|
-
register_color
|
78
|
-
register_color
|
101
|
+
register_color(("gray%02d" % n).to_sym, m, m, m)
|
102
|
+
register_color(("red%02d" % n).to_sym, m, 0, 0)
|
103
|
+
register_color(("green%02d" % n).to_sym, 0, m, 0)
|
104
|
+
register_color(("blue%02d" % n).to_sym, 0, 0, m)
|
79
105
|
end
|
106
|
+
end
|
80
107
|
|
81
|
-
|
108
|
+
sys_font = "/System/Library/Fonts"
|
109
|
+
lib_font = "/Library/Fonts"
|
110
|
+
user_font = File.expand_path "~/Library/Fonts/"
|
111
|
+
FONT_GLOB = "{#{sys_font},#{lib_font},#{user_font}}" # :nodoc:
|
112
|
+
|
113
|
+
##
|
114
|
+
# Find and open a (TTF) font. Should be as system agnostic as possible.
|
115
|
+
|
116
|
+
def find_font name, size = 16
|
117
|
+
font = Dir["#{FONT_GLOB}/#{name}.{ttc,ttf}"].first
|
118
|
+
|
119
|
+
raise ArgumentError, "Can't find font named '#{name}'" unless font
|
120
|
+
|
121
|
+
SDL::TTF.open(font, size)
|
82
122
|
end
|
83
123
|
|
84
124
|
##
|
@@ -97,7 +137,8 @@ class Graphics::Simulation
|
|
97
137
|
n.times.map {
|
98
138
|
o = klass.new self
|
99
139
|
yield o if block_given?
|
100
|
-
o
|
140
|
+
o
|
141
|
+
}
|
101
142
|
end
|
102
143
|
|
103
144
|
##
|
@@ -110,15 +151,22 @@ class Graphics::Simulation
|
|
110
151
|
end
|
111
152
|
|
112
153
|
##
|
113
|
-
#
|
114
|
-
|
115
|
-
|
116
|
-
|
154
|
+
# Register a block to run for a particular key-press.
|
155
|
+
|
156
|
+
def add_key_handler k, remove = nil, &b
|
157
|
+
k = SDL::Key.const_get k
|
158
|
+
key_handler.delete_if { |a, _| k==a } if remove
|
159
|
+
key_handler.unshift [k, b]
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Handle key events by looking through key_handler and running any
|
164
|
+
# blocks that match the key(s) being pressed.
|
117
165
|
|
118
166
|
def handle_keys
|
119
|
-
|
120
|
-
|
121
|
-
|
167
|
+
key_handler.each do |k, blk|
|
168
|
+
blk[self] if SDL::Key.press? k
|
169
|
+
end
|
122
170
|
end
|
123
171
|
|
124
172
|
##
|
@@ -131,18 +179,16 @@ class Graphics::Simulation
|
|
131
179
|
self.start_time = Time.now
|
132
180
|
n = 0
|
133
181
|
event = nil
|
182
|
+
|
134
183
|
loop do
|
135
184
|
handle_event event, n while event = SDL::Event.poll
|
136
185
|
SDL::Key.scan
|
137
186
|
handle_keys
|
138
187
|
|
139
|
-
|
140
|
-
update n unless paused
|
141
|
-
|
142
|
-
draw_and_flip n
|
188
|
+
next if paused
|
143
189
|
|
144
|
-
|
145
|
-
|
190
|
+
iter_per_tick.times { update n; n += 1 }
|
191
|
+
draw_and_flip n
|
146
192
|
end
|
147
193
|
end
|
148
194
|
|
@@ -179,7 +225,7 @@ class Graphics::Simulation
|
|
179
225
|
|
180
226
|
def line x1, y1, x2, y2, c
|
181
227
|
h = self.h
|
182
|
-
screen.draw_line x1, h-y1, x2, h-y2, color[c]
|
228
|
+
screen.draw_line x1, h-y1-1, x2, h-y2-1, color[c]
|
183
229
|
end
|
184
230
|
|
185
231
|
##
|
@@ -203,7 +249,7 @@ class Graphics::Simulation
|
|
203
249
|
def polygon *points, color
|
204
250
|
points << points.first
|
205
251
|
points.each_cons(2) do |p1, p2|
|
206
|
-
|
252
|
+
line(*p1, *p2, color)
|
207
253
|
end
|
208
254
|
end
|
209
255
|
|
@@ -219,14 +265,14 @@ class Graphics::Simulation
|
|
219
265
|
# Draw a rect at x/y with w by h dimensions in color c. Ignores blending.
|
220
266
|
|
221
267
|
def fast_rect x, y, w, h, c
|
222
|
-
screen.
|
268
|
+
screen.fast_rect x, self.h-y-h, w, h, color[c]
|
223
269
|
end
|
224
270
|
|
225
271
|
##
|
226
272
|
# Draw a point at x/y w/ color c.
|
227
273
|
|
228
274
|
def point x, y, c
|
229
|
-
screen[x, h-y] = color[c]
|
275
|
+
screen[x, h-y-1] = color[c]
|
230
276
|
end
|
231
277
|
|
232
278
|
##
|
@@ -242,21 +288,36 @@ class Graphics::Simulation
|
|
242
288
|
# Draw a rect at x/y with w by h dimensions in color c.
|
243
289
|
|
244
290
|
def rect x, y, w, h, c, fill = false
|
245
|
-
|
291
|
+
y = self.h-y-h-1
|
292
|
+
if fill then
|
293
|
+
screen.fill_rect x, y, w, h, color[c]
|
294
|
+
else
|
295
|
+
screen.draw_rect x, y, w, h, color[c]
|
296
|
+
end
|
246
297
|
end
|
247
298
|
|
248
299
|
##
|
249
300
|
# Draw a circle at x/y with radius r in color c.
|
250
301
|
|
251
302
|
def circle x, y, r, c, fill = false
|
252
|
-
|
303
|
+
y = h-y-1
|
304
|
+
if fill then
|
305
|
+
screen.fill_circle x, y, r, color[c]
|
306
|
+
else
|
307
|
+
screen.draw_circle x, y, r, color[c]
|
308
|
+
end
|
253
309
|
end
|
254
310
|
|
255
311
|
##
|
256
312
|
# Draw a circle at x/y with radiuses w/h in color c.
|
257
313
|
|
258
314
|
def ellipse x, y, w, h, c, fill = false
|
259
|
-
|
315
|
+
y = self.h-y-1
|
316
|
+
if fill then
|
317
|
+
screen.fill_ellipse x, y, w, h, color[c]
|
318
|
+
else
|
319
|
+
screen.draw_ellipse x, y, w, h, color[c]
|
320
|
+
end
|
260
321
|
end
|
261
322
|
|
262
323
|
##
|
@@ -265,7 +326,7 @@ class Graphics::Simulation
|
|
265
326
|
|
266
327
|
def bezier x1, y1, cx1, cy1, cx2, cy2, x2, y2, c, l = 7
|
267
328
|
h = self.h
|
268
|
-
screen.draw_bezier x1, h-y1, cx1, h-cy1, cx2, h-cy2, x2, h-y2, l, color[c]
|
329
|
+
screen.draw_bezier x1, h-y1-1, cx1, h-cy1, cx2, h-cy2, x2, h-y2-1, l, color[c]
|
269
330
|
end
|
270
331
|
|
271
332
|
## Text
|
@@ -281,14 +342,15 @@ class Graphics::Simulation
|
|
281
342
|
# Return the rendered text s in color c in font f.
|
282
343
|
|
283
344
|
def render_text s, c, f = font
|
284
|
-
f.
|
345
|
+
f.render screen, s, color[c]
|
285
346
|
end
|
286
347
|
|
287
348
|
##
|
288
349
|
# Draw text s at x/y in color c in font f.
|
289
350
|
|
290
351
|
def text s, x, y, c, f = font
|
291
|
-
|
352
|
+
y = self.h-y-f.height-1
|
353
|
+
f.draw screen, s, x, y, color[c]
|
292
354
|
end
|
293
355
|
|
294
356
|
##
|
@@ -313,15 +375,7 @@ class Graphics::Simulation
|
|
313
375
|
|
314
376
|
### Blitting Methods:
|
315
377
|
|
316
|
-
|
317
|
-
|
318
|
-
# put_pixel(x, y, color)
|
319
|
-
# []=(x, y, color)
|
320
|
-
# get_pixel(x, y)
|
321
|
-
# [](x, y)
|
322
|
-
# put(src, x, y) # see blit
|
323
|
-
# copy_rect(x,y,w,h)
|
324
|
-
# transform_surface(bgcolor,angle,xscale,yscale,flags)
|
378
|
+
# TODO: copy_rect(x,y,w,h)
|
325
379
|
|
326
380
|
##
|
327
381
|
# Load an image at path into a new surface.
|
@@ -330,6 +384,20 @@ class Graphics::Simulation
|
|
330
384
|
SDL::Surface.load path
|
331
385
|
end
|
332
386
|
|
387
|
+
##
|
388
|
+
# Load an audio file at path
|
389
|
+
|
390
|
+
def audio path
|
391
|
+
SDL::Audio.load path
|
392
|
+
end
|
393
|
+
|
394
|
+
##
|
395
|
+
# Open the audio mixer with a number of +channels+ open.
|
396
|
+
|
397
|
+
def open_mixer channels = 1
|
398
|
+
SDL::Audio.open channels
|
399
|
+
end
|
400
|
+
|
333
401
|
##
|
334
402
|
# Return the current mouse state: x, y, buttons.
|
335
403
|
|
@@ -340,10 +408,22 @@ class Graphics::Simulation
|
|
340
408
|
end
|
341
409
|
|
342
410
|
##
|
343
|
-
# Draw a bitmap at x/y with
|
411
|
+
# Draw a bitmap centered at x/y with optional angle, x/y scale, and flags.
|
412
|
+
|
413
|
+
def blit src, x, y, a° = 0, xscale = 1, yscale = 1, flags = 0
|
414
|
+
img = src.transform src.format.colorkey, -a°, xscale, yscale, flags
|
415
|
+
|
416
|
+
SDL::Surface.blit img, 0, 0, 0, 0, screen, x-img.w/2, h-y-img.h/2
|
417
|
+
end
|
418
|
+
|
419
|
+
##
|
420
|
+
# Draw a bitmap at x/y with optional angle, x/y scale, and flags.
|
421
|
+
|
422
|
+
def put src, x, y, a° = 0, xscale = 1, yscale = 1, flags = 0
|
423
|
+
img = src.transform src.format.colorkey, -a°, xscale, yscale, flags
|
344
424
|
|
345
|
-
|
346
|
-
SDL::Surface.
|
425
|
+
# why x-1? because transform adds a pixel to all sides even if a°==0
|
426
|
+
SDL::Surface.blit img, 0, 0, 0, 0, screen, x-1, h-y-img.h
|
347
427
|
end
|
348
428
|
|
349
429
|
##
|
@@ -352,7 +432,7 @@ class Graphics::Simulation
|
|
352
432
|
# primitives will work and the resulting surface is returned.
|
353
433
|
|
354
434
|
def sprite w, h
|
355
|
-
new_screen = SDL::Surface.new
|
435
|
+
new_screen = SDL::Surface.new w, h, screen.format
|
356
436
|
old_screen = screen
|
357
437
|
old_w, old_h = self.w, self.h
|
358
438
|
self.w, self.h = w, h
|