zyps 0.6.3 → 0.7.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.
- data/README.txt +11 -27
- data/bin/zyps +355 -296
- data/bin/zyps_demo +267 -249
- data/lib/zyps/actions.rb +104 -139
- data/lib/zyps/conditions.rb +39 -15
- data/lib/zyps/environmental_factors.rb +60 -48
- data/lib/zyps/views/canvas/gtk2.rb +152 -0
- data/lib/zyps/views/canvas/wx.rb +191 -0
- data/lib/zyps/views/trails.rb +56 -59
- data/lib/zyps.rb +101 -84
- data/test/test_zyps.rb +48 -75
- data/test/zyps/test_actions.rb +24 -73
- data/test/zyps/test_conditions.rb +30 -11
- data/test/zyps/test_environmental_factors.rb +28 -22
- data/test/zyps/test_remote.rb +3 -3
- metadata +16 -8
- data/bin/zyps_server +0 -235
@@ -0,0 +1,152 @@
|
|
1
|
+
# Copyright 2007 Jay McGavren, jay@mcgavren.com.
|
2
|
+
#
|
3
|
+
# This file is part of Zyps.
|
4
|
+
#
|
5
|
+
# Zyps is free software; you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation; either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
|
19
|
+
require 'gtk2'
|
20
|
+
|
21
|
+
|
22
|
+
module Zyps
|
23
|
+
|
24
|
+
|
25
|
+
#Called by View objects for use in Ruby-GNOME2 applications.
|
26
|
+
#Assign an instance to a View, then add the drawing_area attribute to a GUI container object.
|
27
|
+
#The drawing area will be updated whenever the View is.
|
28
|
+
class GTK2Canvas
|
29
|
+
|
30
|
+
|
31
|
+
#A Gtk::DrawingArea that will be painted on.
|
32
|
+
attr_reader :drawing_area
|
33
|
+
#Dimensions of the drawing area.
|
34
|
+
#Control should normally be left to the owner View object.
|
35
|
+
attr_reader :width, :height
|
36
|
+
|
37
|
+
def initialize
|
38
|
+
|
39
|
+
#Will be resized later.
|
40
|
+
@width = 1
|
41
|
+
@height = 1
|
42
|
+
|
43
|
+
#Create a drawing area.
|
44
|
+
@drawing_area = Gtk::DrawingArea.new
|
45
|
+
#Set to correct size.
|
46
|
+
resize
|
47
|
+
|
48
|
+
#Whenever the drawing area needs updating...
|
49
|
+
@drawing_area.signal_connect("expose_event") do
|
50
|
+
#Copy buffer bitmap to canvas.
|
51
|
+
@drawing_area.window.draw_drawable(
|
52
|
+
@drawing_area.style.fg_gc(@drawing_area.state), #Gdk::GC (graphics context) to use when drawing.
|
53
|
+
buffer, #Gdk::Drawable source to copy onto canvas.
|
54
|
+
0, 0, #Pull from upper left of source.
|
55
|
+
0, 0, #Copy to upper left of canvas.
|
56
|
+
-1, -1 #-1 width and height signals to copy entire source over.
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
def width= (pixels) #:nodoc:
|
63
|
+
@width = pixels
|
64
|
+
resize
|
65
|
+
end
|
66
|
+
|
67
|
+
def height= (pixels) #:nodoc:
|
68
|
+
@height = pixels
|
69
|
+
resize
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
#Takes a hash with these keys and defaults:
|
74
|
+
# :color => nil
|
75
|
+
# :border_width => 1
|
76
|
+
# :filled => true
|
77
|
+
# :x => nil
|
78
|
+
# :y => nil
|
79
|
+
# :width => nil
|
80
|
+
# :height => nil
|
81
|
+
def draw_rectangle(options = {})
|
82
|
+
options = {
|
83
|
+
:filled => true
|
84
|
+
}.merge(options)
|
85
|
+
graphics_context = Gdk::GC.new(buffer)
|
86
|
+
graphics_context.rgb_fg_color = convert_color(options[:color])
|
87
|
+
buffer.draw_rectangle(
|
88
|
+
graphics_context,
|
89
|
+
options[:filled],
|
90
|
+
options[:x], options[:y],
|
91
|
+
options[:width], options[:height]
|
92
|
+
)
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
#Takes a hash with these keys and defaults:
|
97
|
+
# :color => nil
|
98
|
+
# :width => nil
|
99
|
+
# :x1 => nil
|
100
|
+
# :y1 => nil
|
101
|
+
# :x2 => nil
|
102
|
+
# :y2 => nil
|
103
|
+
def draw_line(options = {})
|
104
|
+
graphics_context = Gdk::GC.new(buffer)
|
105
|
+
graphics_context.rgb_fg_color = convert_color(options[:color])
|
106
|
+
graphics_context.set_line_attributes(
|
107
|
+
options[:width].ceil,
|
108
|
+
Gdk::GC::LINE_SOLID,
|
109
|
+
Gdk::GC::CAP_ROUND,
|
110
|
+
Gdk::GC::JOIN_MITER #Only used for polygons.
|
111
|
+
)
|
112
|
+
buffer.draw_line(
|
113
|
+
graphics_context,
|
114
|
+
options[:x1], options[:y1],
|
115
|
+
options[:x2], options[:y2]
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
#Draw all objects to the drawing area.
|
121
|
+
def render
|
122
|
+
@drawing_area.queue_draw_area(0, 0, @width, @height)
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
#Converts a Zyps Color to a Gdk::Color.
|
129
|
+
def convert_color(color)
|
130
|
+
Gdk::Color.new(
|
131
|
+
color.red * 65535,
|
132
|
+
color.green * 65535,
|
133
|
+
color.blue * 65535
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
def resize
|
139
|
+
@drawing_area.set_size_request(@width, @height)
|
140
|
+
@buffer = nil #Causes buffer to reset its size next time it's accessed.
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
def buffer
|
145
|
+
@buffer ||= Gdk::Pixmap.new(@drawing_area.window, @width, @height, -1)
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
end #module Zyps
|
@@ -0,0 +1,191 @@
|
|
1
|
+
# Copyright 2007 Jay McGavren, jay@mcgavren.com.
|
2
|
+
#
|
3
|
+
# This file is part of Zyps.
|
4
|
+
#
|
5
|
+
# Zyps is free software; you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation; either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
|
19
|
+
require 'wx'
|
20
|
+
|
21
|
+
|
22
|
+
module Zyps
|
23
|
+
|
24
|
+
|
25
|
+
#Called by View objects for use in wxRuby applications.
|
26
|
+
#Assign an instance to a View, then add the drawing_area attribute to a GUI container object.
|
27
|
+
#The drawing area will be updated whenever the View is.
|
28
|
+
class WxCanvas
|
29
|
+
|
30
|
+
|
31
|
+
#A wxWidgets window that will be painted on.
|
32
|
+
attr_reader :drawing_area
|
33
|
+
#Dimensions of the drawing area.
|
34
|
+
#Control should normally be left to the owner View object.
|
35
|
+
attr_reader :width, :height
|
36
|
+
|
37
|
+
#Takes the wxRuby GUI object that will be its parent.
|
38
|
+
def initialize (parent)
|
39
|
+
|
40
|
+
#Will be resized later.
|
41
|
+
@width = 1
|
42
|
+
@height = 1
|
43
|
+
|
44
|
+
#Create a drawing area.
|
45
|
+
@drawing_area = Wx::Window.new(parent)
|
46
|
+
#Set to correct size.
|
47
|
+
resize
|
48
|
+
|
49
|
+
#Whenever the drawing area needs updating...
|
50
|
+
@drawing_area.evt_paint do |event|
|
51
|
+
render
|
52
|
+
end
|
53
|
+
|
54
|
+
#Arrays of shapes that will be painted when render() is called.
|
55
|
+
@rectangle_queue = []
|
56
|
+
@line_queue = []
|
57
|
+
|
58
|
+
#Hash of Wx::Pens used to draw in various colors and widths.
|
59
|
+
@pens = Hash.new {|h, k| h[k] = Hash.new}
|
60
|
+
#Hash of Wx::Brushes for various colors.
|
61
|
+
@brushes = Hash.new
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def width= (pixels) #:nodoc:
|
66
|
+
@width = pixels
|
67
|
+
resize
|
68
|
+
end
|
69
|
+
|
70
|
+
def height= (pixels) #:nodoc:
|
71
|
+
@height = pixels
|
72
|
+
resize
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
#Takes a hash with these keys and defaults:
|
77
|
+
# :color => nil
|
78
|
+
# :border_width => 1
|
79
|
+
# :filled => true
|
80
|
+
# :x => nil
|
81
|
+
# :y => nil
|
82
|
+
# :width => nil
|
83
|
+
# :height => nil
|
84
|
+
def draw_rectangle(options = {})
|
85
|
+
options = {
|
86
|
+
:filled => true,
|
87
|
+
:border_width => 1
|
88
|
+
}.merge(options)
|
89
|
+
@rectangle_queue << options
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
#Takes a hash with these keys and defaults:
|
95
|
+
# :color => nil
|
96
|
+
# :width => nil
|
97
|
+
# :x1 => nil
|
98
|
+
# :y1 => nil
|
99
|
+
# :x2 => nil
|
100
|
+
# :y2 => nil
|
101
|
+
def draw_line(options = {})
|
102
|
+
@line_queue << options
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
#Draw all objects to the drawing area.
|
107
|
+
def render
|
108
|
+
buffer.draw do |surface|
|
109
|
+
#Draw all queued rectangles.
|
110
|
+
render_rectangles(surface)
|
111
|
+
#Draw all queued lines.
|
112
|
+
render_lines(surface)
|
113
|
+
end
|
114
|
+
#Copy offscreen bitmap to screen.
|
115
|
+
@drawing_area.paint do |dc|
|
116
|
+
#Copy the buffer to the viewable window.
|
117
|
+
dc.draw_bitmap(buffer, 0, 0, false)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
|
125
|
+
#Converts a Zyps Color to the toolkit's color class.
|
126
|
+
def convert_color(color)
|
127
|
+
Wx::Colour.new(
|
128
|
+
(color.red * 255).floor,
|
129
|
+
(color.green * 255).floor,
|
130
|
+
(color.blue * 255).floor
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
#Resize buffer and drawing area.
|
136
|
+
def resize
|
137
|
+
@drawing_area.set_size(Wx::Size.new(@width, @height))
|
138
|
+
@buffer = nil #Causes buffer to reset its size next time it's accessed.
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
#The Wx::Bitmap to draw to.
|
143
|
+
def buffer
|
144
|
+
@buffer ||= Wx::Bitmap.new(@width, @height)
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
#Draw all queued rectangles to the given GC.
|
149
|
+
def render_rectangles(surface)
|
150
|
+
while options = @rectangle_queue.shift do
|
151
|
+
surface.pen = get_pen(options[:color], options[:border_width]) #Used for border.
|
152
|
+
if options[:filled]
|
153
|
+
surface.brush = get_brush(options[:color])
|
154
|
+
else
|
155
|
+
surface.brush = Wx::TRANSPARENT_BRUSH
|
156
|
+
end
|
157
|
+
surface.draw_rectangle(
|
158
|
+
options[:x], options[:y],
|
159
|
+
options[:width], options[:height]
|
160
|
+
)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
#Draw all queued lines to the given GC.
|
166
|
+
def render_lines(surface)
|
167
|
+
surface.pen.cap = Wx::CAP_ROUND
|
168
|
+
while options = @line_queue.shift do
|
169
|
+
surface.pen = get_pen(options[:color], options[:width])
|
170
|
+
surface.draw_line(
|
171
|
+
options[:x1].floor, options[:y1].floor,
|
172
|
+
options[:x2].floor, options[:y2].floor
|
173
|
+
)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
def get_pen(color, width)
|
179
|
+
@pens[[color.red, color.green, color.blue]][width] ||= Wx::Pen.new(convert_color(color), width.ceil)
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
def get_brush(color)
|
184
|
+
@brushes[[color.red, color.green, color.blue]] ||= Wx::Brush.new(convert_color(color), Wx::SOLID)
|
185
|
+
end
|
186
|
+
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
end #module Zyps
|
data/lib/zyps/views/trails.rb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
|
19
|
-
require '
|
19
|
+
require 'zyps'
|
20
20
|
|
21
21
|
|
22
22
|
module Zyps
|
@@ -25,39 +25,44 @@ module Zyps
|
|
25
25
|
#A view of game objects.
|
26
26
|
class TrailsView
|
27
27
|
|
28
|
-
#A
|
28
|
+
#A GUI toolkit-specific drawing area that will be used to render the view.
|
29
|
+
#See WxCanvas and GTK2Canvas.
|
29
30
|
attr_reader :canvas
|
30
31
|
#Dimensions of the view.
|
31
32
|
attr_reader :width, :height
|
32
33
|
#Number of line segments to draw for each object.
|
33
34
|
attr_accessor :trail_length
|
35
|
+
#Whether view should be erased before re-drawing.
|
36
|
+
attr_accessor :erase_flag
|
34
37
|
|
35
|
-
|
38
|
+
#Takes a hash with these keys and defaults:
|
39
|
+
# :canvas => nil
|
40
|
+
# :width => 600
|
41
|
+
# :height => 400
|
42
|
+
# :trail_length => 5
|
43
|
+
# :erase_flag => true
|
44
|
+
def initialize (options = {})
|
36
45
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
@
|
46
|
-
|
47
|
-
|
48
|
-
@canvas.style.fg_gc(@canvas.state), #Gdk::GC (graphics context) to use when drawing.
|
49
|
-
buffer, #Gdk::Drawable source to copy onto canvas.
|
50
|
-
0, 0, #Pull from upper left of source.
|
51
|
-
0, 0, #Copy to upper left of canvas.
|
52
|
-
-1, -1 #-1 width and height signals to copy entire source over.
|
53
|
-
)
|
54
|
-
end
|
46
|
+
options = {
|
47
|
+
:width => 600,
|
48
|
+
:height => 400,
|
49
|
+
:trail_length => 5,
|
50
|
+
:erase_flag => true
|
51
|
+
}.merge(options)
|
52
|
+
@width = options[:width]
|
53
|
+
@height = options[:height]
|
54
|
+
@trail_length = options[:trail_length]
|
55
|
+
@erase_flag = options[:erase_flag]
|
56
|
+
@canvas = options[:canvas]
|
55
57
|
|
58
|
+
#Set canvas's size to match view's.
|
59
|
+
resize if @canvas
|
60
|
+
|
56
61
|
#Track a list of locations for each object.
|
57
62
|
@locations = Hash.new {|h, k| h[k] = Array.new}
|
58
63
|
|
59
64
|
end
|
60
|
-
|
65
|
+
|
61
66
|
def width= (pixels) #:nodoc:
|
62
67
|
@width = pixels
|
63
68
|
resize
|
@@ -66,7 +71,12 @@ class TrailsView
|
|
66
71
|
@height = pixels
|
67
72
|
resize
|
68
73
|
end
|
69
|
-
|
74
|
+
def canvas= (canvas) #:nodoc:
|
75
|
+
@canvas = canvas
|
76
|
+
resize
|
77
|
+
end
|
78
|
+
|
79
|
+
|
70
80
|
#Takes an Environment, and draws it to the canvas.
|
71
81
|
#Tracks the position of each GameObject over time so it can draw a trail behind it.
|
72
82
|
#The head will match the object's Color exactly, fading to black at the tail.
|
@@ -74,14 +84,14 @@ class TrailsView
|
|
74
84
|
def update(environment)
|
75
85
|
|
76
86
|
#Clear the background on the buffer.
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
87
|
+
if @erase_flag
|
88
|
+
@canvas.draw_rectangle(
|
89
|
+
:color => Color.new(0, 0, 0),
|
90
|
+
:filled => true,
|
91
|
+
:x => 0, :y => 0,
|
92
|
+
:width => @width, :height => @height
|
93
|
+
)
|
94
|
+
end
|
85
95
|
|
86
96
|
#For each GameObject in the environment:
|
87
97
|
environment.objects.each do |object|
|
@@ -91,7 +101,7 @@ class TrailsView
|
|
91
101
|
#Add the object's current location to the list.
|
92
102
|
@locations[object.identifier] << [object.location.x, object.location.y]
|
93
103
|
#If the list is larger than the number of tail segments, delete the first position.
|
94
|
-
@locations[object.identifier].shift
|
104
|
+
@locations[object.identifier].shift while @locations[object.identifier].length > @trail_length
|
95
105
|
|
96
106
|
#For each location in this object's list:
|
97
107
|
@locations[object.identifier].each_with_index do |location, index|
|
@@ -102,50 +112,37 @@ class TrailsView
|
|
102
112
|
#Divide the current segment number by trail segment count to get the multiplier to use for brightness and width.
|
103
113
|
multiplier = index.to_f / @locations[object.identifier].length.to_f
|
104
114
|
|
105
|
-
#Set the drawing color to use the object's colors, adjusted by the multiplier.
|
106
|
-
graphics_context.rgb_fg_color = Gdk::Color.new( #Don't use Gdk::GC.foreground= here, as that requires a color to be in the color map already.
|
107
|
-
object.color.red * multiplier * 65535,
|
108
|
-
object.color.green * multiplier * 65535,
|
109
|
-
object.color.blue * multiplier * 65535
|
110
|
-
)
|
111
|
-
|
112
|
-
#Multiply the actual drawing width by the current multiplier to get the current drawing width.
|
113
|
-
graphics_context.set_line_attributes(
|
114
|
-
(object_radius * 2 * multiplier).ceil,
|
115
|
-
Gdk::GC::LINE_SOLID,
|
116
|
-
Gdk::GC::CAP_ROUND, #Line ends drawn as semicircles.
|
117
|
-
Gdk::GC::JOIN_MITER #Only used for polygons.
|
118
|
-
)
|
119
|
-
|
120
115
|
#Get previous location so we can draw a line from it.
|
121
116
|
previous_location = @locations[object.identifier][index - 1]
|
122
117
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
118
|
+
@canvas.draw_line(
|
119
|
+
:color => Color.new(
|
120
|
+
object.color.red * multiplier,
|
121
|
+
object.color.green * multiplier,
|
122
|
+
object.color.blue * multiplier
|
123
|
+
),
|
124
|
+
:width => object_radius * 2 * multiplier,
|
125
|
+
:x1 => previous_location[0], :y1 => previous_location[1],
|
126
|
+
:x2 => location[0], :y2 => location[1]
|
128
127
|
)
|
129
128
|
|
130
129
|
end
|
131
130
|
|
132
131
|
end
|
133
132
|
|
134
|
-
@canvas.
|
133
|
+
@canvas.render
|
135
134
|
|
136
135
|
end
|
137
136
|
|
138
137
|
|
139
138
|
private
|
140
139
|
|
140
|
+
|
141
141
|
def resize
|
142
|
-
@canvas.
|
143
|
-
@
|
144
|
-
end
|
145
|
-
|
146
|
-
def buffer
|
147
|
-
@buffer ||= Gdk::Pixmap.new(@canvas.window, @width, @height, -1)
|
142
|
+
@canvas.width = @width
|
143
|
+
@canvas.height = @height
|
148
144
|
end
|
145
|
+
|
149
146
|
|
150
147
|
end
|
151
148
|
|