gosu 0.7.10.1

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.
Files changed (249) hide show
  1. data/COPYING.txt +29 -0
  2. data/Gosu/Async.hpp +48 -0
  3. data/Gosu/Audio.hpp +145 -0
  4. data/Gosu/AutoLink.hpp +16 -0
  5. data/Gosu/Bitmap.hpp +85 -0
  6. data/Gosu/ButtonsMac.hpp +114 -0
  7. data/Gosu/ButtonsWin.hpp +111 -0
  8. data/Gosu/ButtonsX.hpp +115 -0
  9. data/Gosu/Color.hpp +172 -0
  10. data/Gosu/Directories.hpp +36 -0
  11. data/Gosu/Font.hpp +59 -0
  12. data/Gosu/Fwd.hpp +31 -0
  13. data/Gosu/Gosu.hpp +26 -0
  14. data/Gosu/Graphics.hpp +86 -0
  15. data/Gosu/GraphicsBase.hpp +45 -0
  16. data/Gosu/IO.hpp +255 -0
  17. data/Gosu/Image.hpp +148 -0
  18. data/Gosu/ImageData.hpp +45 -0
  19. data/Gosu/Input.hpp +116 -0
  20. data/Gosu/Math.hpp +95 -0
  21. data/Gosu/Platform.hpp +61 -0
  22. data/Gosu/RotFlip.hpp +116 -0
  23. data/Gosu/Sockets.hpp +129 -0
  24. data/Gosu/Text.hpp +47 -0
  25. data/Gosu/TextInput.hpp +57 -0
  26. data/Gosu/Timing.hpp +16 -0
  27. data/Gosu/Utility.hpp +24 -0
  28. data/Gosu/WinUtility.hpp +76 -0
  29. data/Gosu/Window.hpp +84 -0
  30. data/GosuImpl/Async.cpp +37 -0
  31. data/GosuImpl/AudioFmod.cpp +417 -0
  32. data/GosuImpl/AudioSDL.cpp +255 -0
  33. data/GosuImpl/DirectoriesMac.mm +38 -0
  34. data/GosuImpl/DirectoriesUnix.cpp +48 -0
  35. data/GosuImpl/DirectoriesWin.cpp +42 -0
  36. data/GosuImpl/FileUnix.cpp +100 -0
  37. data/GosuImpl/FileWin.cpp +83 -0
  38. data/GosuImpl/Graphics/Bitmap.cpp +116 -0
  39. data/GosuImpl/Graphics/BitmapBMP.cpp +232 -0
  40. data/GosuImpl/Graphics/BitmapColorKey.cpp +39 -0
  41. data/GosuImpl/Graphics/BitmapPNG.cpp +276 -0
  42. data/GosuImpl/Graphics/BitmapUtils.cpp +67 -0
  43. data/GosuImpl/Graphics/BlockAllocator.cpp +127 -0
  44. data/GosuImpl/Graphics/BlockAllocator.hpp +34 -0
  45. data/GosuImpl/Graphics/Color.cpp +126 -0
  46. data/GosuImpl/Graphics/Common.hpp +21 -0
  47. data/GosuImpl/Graphics/DrawOp.hpp +154 -0
  48. data/GosuImpl/Graphics/Font.cpp +110 -0
  49. data/GosuImpl/Graphics/Graphics.cpp +295 -0
  50. data/GosuImpl/Graphics/Image.cpp +159 -0
  51. data/GosuImpl/Graphics/LargeImageData.cpp +115 -0
  52. data/GosuImpl/Graphics/LargeImageData.hpp +37 -0
  53. data/GosuImpl/Graphics/RotFlip.cpp +184 -0
  54. data/GosuImpl/Graphics/TexChunk.cpp +77 -0
  55. data/GosuImpl/Graphics/TexChunk.hpp +40 -0
  56. data/GosuImpl/Graphics/Text.cpp +223 -0
  57. data/GosuImpl/Graphics/TextMac.cpp +242 -0
  58. data/GosuImpl/Graphics/TextPangoFT.cpp +186 -0
  59. data/GosuImpl/Graphics/TextWin.cpp +172 -0
  60. data/GosuImpl/Graphics/Texture.cpp +104 -0
  61. data/GosuImpl/Graphics/Texture.hpp +34 -0
  62. data/GosuImpl/IO.cpp +48 -0
  63. data/GosuImpl/InputMac.mm +677 -0
  64. data/GosuImpl/InputWin.cpp +444 -0
  65. data/GosuImpl/InputX.cpp +158 -0
  66. data/GosuImpl/MacUtility.hpp +48 -0
  67. data/GosuImpl/Math.cpp +49 -0
  68. data/GosuImpl/RubyGosu.swg +474 -0
  69. data/GosuImpl/RubyGosuStub.mm +17 -0
  70. data/GosuImpl/RubyGosu_DllMain.cxx +30 -0
  71. data/GosuImpl/RubyGosu_wrap.cxx +8521 -0
  72. data/GosuImpl/RubyGosu_wrap.h +31 -0
  73. data/GosuImpl/Sockets/CommSocket.cpp +304 -0
  74. data/GosuImpl/Sockets/ListenerSocket.cpp +60 -0
  75. data/GosuImpl/Sockets/MessageSocket.cpp +136 -0
  76. data/GosuImpl/Sockets/Socket.cpp +145 -0
  77. data/GosuImpl/Sockets/Sockets.hpp +66 -0
  78. data/GosuImpl/TextInputMac.mm +207 -0
  79. data/GosuImpl/TextInputWin.cpp +197 -0
  80. data/GosuImpl/TextInputX.cpp +201 -0
  81. data/GosuImpl/TextTTFWin.cpp +247 -0
  82. data/GosuImpl/TimingUnix.cpp +17 -0
  83. data/GosuImpl/TimingWin.cpp +28 -0
  84. data/GosuImpl/Utility.cpp +140 -0
  85. data/GosuImpl/WinMain.cpp +69 -0
  86. data/GosuImpl/WinUtility.cpp +137 -0
  87. data/GosuImpl/WindowMac.mm +466 -0
  88. data/GosuImpl/WindowWin.cpp +447 -0
  89. data/GosuImpl/WindowX.cpp +392 -0
  90. data/GosuImpl/X11vroot.h +118 -0
  91. data/README.txt +13 -0
  92. data/Rakefile +178 -0
  93. data/examples/ChipmunkIntegration.rb +275 -0
  94. data/examples/CptnRuby.rb +231 -0
  95. data/examples/MoreChipmunkAndRMagick.rb +155 -0
  96. data/examples/OpenGLIntegration.rb +232 -0
  97. data/examples/RMagickIntegration.rb +449 -0
  98. data/examples/TextInput.cpp +170 -0
  99. data/examples/TextInput.rb +139 -0
  100. data/examples/Tutorial.cpp +215 -0
  101. data/examples/Tutorial.rb +137 -0
  102. data/examples/media/Beep.wav +0 -0
  103. data/examples/media/CptnRuby Gem.png +0 -0
  104. data/examples/media/CptnRuby Map.txt +25 -0
  105. data/examples/media/CptnRuby Tileset.png +0 -0
  106. data/examples/media/CptnRuby.png +0 -0
  107. data/examples/media/Cursor.png +0 -0
  108. data/examples/media/Earth.png +0 -0
  109. data/examples/media/Explosion.wav +0 -0
  110. data/examples/media/LargeStar.png +0 -0
  111. data/examples/media/Sky.jpg +0 -0
  112. data/examples/media/Smoke.png +0 -0
  113. data/examples/media/Soldier.png +0 -0
  114. data/examples/media/Space.png +0 -0
  115. data/examples/media/Star.png +0 -0
  116. data/examples/media/Starfighter.bmp +0 -0
  117. data/linux/Makefile.in +98 -0
  118. data/linux/configure +5658 -0
  119. data/linux/configure.ac +126 -0
  120. data/linux/extconf.rb +11 -0
  121. data/mac/English.lproj/InfoPlist.strings +0 -0
  122. data/mac/Gosu-Info.plist +26 -0
  123. data/mac/Gosu.xcodeproj/project.pbxproj +1194 -0
  124. data/mac/RubyGosu Template-Info.plist +26 -0
  125. data/mac/libboost_thread_1_34_1_universal.a +0 -0
  126. data/mac/libboost_thread_d_1_34_1_universal.a +0 -0
  127. data/mac/libfmod_universal.a +0 -0
  128. data/mac/libpng_universal.a +0 -0
  129. data/mac/libz_universal.a +0 -0
  130. data/reference/Async_8hpp-source.html +70 -0
  131. data/reference/Audio_8hpp-source.html +114 -0
  132. data/reference/Audio_8hpp.html +50 -0
  133. data/reference/AutoLink_8hpp-source.html +38 -0
  134. data/reference/AutoLink_8hpp.html +34 -0
  135. data/reference/Bitmap_8hpp-source.html +85 -0
  136. data/reference/Bitmap_8hpp.html +58 -0
  137. data/reference/ButtonsMac_8hpp-source.html +133 -0
  138. data/reference/ButtonsWin_8hpp-source.html +133 -0
  139. data/reference/ButtonsX_8hpp-source.html +134 -0
  140. data/reference/Color_8hpp-source.html +169 -0
  141. data/reference/Color_8hpp.html +85 -0
  142. data/reference/Directories_8hpp-source.html +42 -0
  143. data/reference/Directories_8hpp.html +46 -0
  144. data/reference/Font_8hpp-source.html +65 -0
  145. data/reference/Font_8hpp.html +41 -0
  146. data/reference/Fwd_8hpp-source.html +52 -0
  147. data/reference/Fwd_8hpp.html +37 -0
  148. data/reference/Gosu_8hpp-source.html +48 -0
  149. data/reference/Gosu_8hpp.html +34 -0
  150. data/reference/GraphicsBase_8hpp-source.html +57 -0
  151. data/reference/GraphicsBase_8hpp.html +56 -0
  152. data/reference/Graphics_8hpp-source.html +96 -0
  153. data/reference/Graphics_8hpp.html +53 -0
  154. data/reference/IO_8hpp-source.html +255 -0
  155. data/reference/IO_8hpp.html +74 -0
  156. data/reference/ImageData_8hpp-source.html +62 -0
  157. data/reference/ImageData_8hpp.html +43 -0
  158. data/reference/Image_8hpp-source.html +126 -0
  159. data/reference/Image_8hpp.html +48 -0
  160. data/reference/Input_8hpp-source.html +118 -0
  161. data/reference/Input_8hpp.html +50 -0
  162. data/reference/Math_8hpp-source.html +92 -0
  163. data/reference/Math_8hpp.html +74 -0
  164. data/reference/Platform_8hpp-source.html +83 -0
  165. data/reference/Platform_8hpp.html +73 -0
  166. data/reference/RotFlip_8hpp-source.html +138 -0
  167. data/reference/RotFlip_8hpp.html +77 -0
  168. data/reference/Sockets_8hpp-source.html +130 -0
  169. data/reference/Sockets_8hpp.html +66 -0
  170. data/reference/TextInput_8hpp-source.html +64 -0
  171. data/reference/TextInput_8hpp.html +41 -0
  172. data/reference/Text_8hpp-source.html +51 -0
  173. data/reference/Text_8hpp.html +46 -0
  174. data/reference/Timing_8hpp-source.html +36 -0
  175. data/reference/Timing_8hpp.html +42 -0
  176. data/reference/Utility_8hpp-source.html +44 -0
  177. data/reference/Utility_8hpp.html +48 -0
  178. data/reference/WinUtility_8hpp-source.html +79 -0
  179. data/reference/WinUtility_8hpp.html +64 -0
  180. data/reference/Window_8hpp-source.html +91 -0
  181. data/reference/Window_8hpp.html +41 -0
  182. data/reference/annotated.html +51 -0
  183. data/reference/classGosu_1_1Audio-members.html +34 -0
  184. data/reference/classGosu_1_1Audio.html +46 -0
  185. data/reference/classGosu_1_1Bitmap-members.html +44 -0
  186. data/reference/classGosu_1_1Bitmap.html +263 -0
  187. data/reference/classGosu_1_1Buffer-members.html +44 -0
  188. data/reference/classGosu_1_1Buffer.html +78 -0
  189. data/reference/classGosu_1_1Buffer.png +0 -0
  190. data/reference/classGosu_1_1Button-members.html +36 -0
  191. data/reference/classGosu_1_1Button.html +143 -0
  192. data/reference/classGosu_1_1Color-members.html +56 -0
  193. data/reference/classGosu_1_1Color.html +387 -0
  194. data/reference/classGosu_1_1File-members.html +41 -0
  195. data/reference/classGosu_1_1File.html +69 -0
  196. data/reference/classGosu_1_1File.png +0 -0
  197. data/reference/classGosu_1_1Font-members.html +39 -0
  198. data/reference/classGosu_1_1Font.html +309 -0
  199. data/reference/classGosu_1_1Graphics-members.html +50 -0
  200. data/reference/classGosu_1_1Graphics.html +234 -0
  201. data/reference/classGosu_1_1Image-members.html +45 -0
  202. data/reference/classGosu_1_1Image.html +518 -0
  203. data/reference/classGosu_1_1ImageData-members.html +37 -0
  204. data/reference/classGosu_1_1ImageData.html +60 -0
  205. data/reference/classGosu_1_1Input-members.html +44 -0
  206. data/reference/classGosu_1_1Input.html +223 -0
  207. data/reference/classGosu_1_1MessageSocket-members.html +40 -0
  208. data/reference/classGosu_1_1MessageSocket.html +233 -0
  209. data/reference/classGosu_1_1Resource-members.html +39 -0
  210. data/reference/classGosu_1_1Resource.html +116 -0
  211. data/reference/classGosu_1_1Resource.png +0 -0
  212. data/reference/classGosu_1_1Sample-members.html +37 -0
  213. data/reference/classGosu_1_1Sample.html +200 -0
  214. data/reference/classGosu_1_1SampleInstance-members.html +38 -0
  215. data/reference/classGosu_1_1SampleInstance.html +169 -0
  216. data/reference/classGosu_1_1Song-members.html +43 -0
  217. data/reference/classGosu_1_1Song.html +260 -0
  218. data/reference/classGosu_1_1TextInput-members.html +38 -0
  219. data/reference/classGosu_1_1TextInput.html +121 -0
  220. data/reference/classGosu_1_1Window-members.html +50 -0
  221. data/reference/classGosu_1_1Window.html +271 -0
  222. data/reference/doxyfile +233 -0
  223. data/reference/doxygen.css +433 -0
  224. data/reference/doxygen.png +0 -0
  225. data/reference/files.html +54 -0
  226. data/reference/functions.html +236 -0
  227. data/reference/functions_enum.html +45 -0
  228. data/reference/functions_func.html +227 -0
  229. data/reference/functions_vars.html +47 -0
  230. data/reference/hierarchy.html +53 -0
  231. data/reference/index.html +26 -0
  232. data/reference/namespaceGosu.html +2890 -0
  233. data/reference/namespaceGosu_1_1Colors.html +70 -0
  234. data/reference/namespaceGosu_1_1Win.html +275 -0
  235. data/reference/namespacemembers.html +216 -0
  236. data/reference/namespacemembers_enum.html +52 -0
  237. data/reference/namespacemembers_eval.html +54 -0
  238. data/reference/namespacemembers_func.html +185 -0
  239. data/reference/namespacemembers_type.html +46 -0
  240. data/reference/namespacemembers_vars.html +46 -0
  241. data/reference/namespaces.html +35 -0
  242. data/reference/tab_b.gif +0 -0
  243. data/reference/tab_l.gif +0 -0
  244. data/reference/tab_r.gif +0 -0
  245. data/reference/tabs.css +102 -0
  246. data/windows/Gosu.sln +29 -0
  247. data/windows/Gosu.vcproj +553 -0
  248. data/windows/RubyGosu.vcproj +138 -0
  249. metadata +305 -0
@@ -0,0 +1,118 @@
1
+ /*****************************************************************************/
2
+ /** Copyright 1991 by Andreas Stolcke **/
3
+ /** Copyright 1990 by Solbourne Computer Inc. **/
4
+ /** Longmont, Colorado **/
5
+ /** **/
6
+ /** All Rights Reserved **/
7
+ /** **/
8
+ /** Permission to use, copy, modify, and distribute this software and **/
9
+ /** its documentation for any purpose and without fee is hereby **/
10
+ /** granted, provided that the above copyright notice appear in all **/
11
+ /** copies and that both that copyright notice and this permis- **/
12
+ /** sion notice appear in supporting documentation, and that the **/
13
+ /** name of Solbourne not be used in advertising **/
14
+ /** in publicity pertaining to distribution of the software without **/
15
+ /** specific, written prior permission. **/
16
+ /** **/
17
+ /** ANDREAS STOLCKE AND SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES **/
18
+ /** WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF **/
19
+ /** MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ANDREAS STOLCKE **/
20
+ /** OR SOLBOURNE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL **/
21
+ /** DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
22
+ /** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
23
+ /** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
24
+ /** OR PERFORMANCE OF THIS SOFTWARE. **/
25
+ /*****************************************************************************/
26
+ /*
27
+ * vroot.h -- Virtual Root Window handling header file
28
+ *
29
+ * This header file redefines the X11 macros RootWindow and DefaultRootWindow,
30
+ * making them look for a virtual root window as provided by certain `virtual'
31
+ * window managers like swm and tvtwm. If none is found, the ordinary root
32
+ * window is returned, thus retaining backward compatibility with standard
33
+ * window managers.
34
+ * The function implementing the virtual root lookup remembers the result of
35
+ * its last invocation to avoid overhead in the case of repeated calls
36
+ * on the same display and screen arguments.
37
+ * The lookup code itself is taken from Tom LaStrange's ssetroot program.
38
+ *
39
+ * Most simple root window changing X programs can be converted to using
40
+ * virtual roots by just including
41
+ *
42
+ * #include <X11/vroot.h>
43
+ *
44
+ * after all the X11 header files. It has been tested on such popular
45
+ * X clients as xphoon, xfroot, xloadimage, and xaqua.
46
+ * It also works with the core clients xprop, xwininfo, xwd, and editres
47
+ * (and is necessary to get those clients working under tvtwm).
48
+ * It does NOT work with xsetroot; get the xsetroot replacement included in
49
+ * the tvtwm distribution instead.
50
+ *
51
+ * Andreas Stolcke <stolcke@ICSI.Berkeley.EDU>, 9/7/90
52
+ * - replaced all NULL's with properly cast 0's, 5/6/91
53
+ * - free children list (suggested by Mark Martin <mmm@cetia.fr>), 5/16/91
54
+ * - include X11/Xlib.h and support RootWindowOfScreen, too 9/17/91
55
+ */
56
+
57
+ #ifndef _VROOT_H_
58
+ #define _VROOT_H_
59
+
60
+ #include <X11/X.h>
61
+ #include <X11/Xatom.h>
62
+ #include <X11/Xlib.h>
63
+
64
+ static Window
65
+ VirtualRootWindowOfScreen(Screen* screen)
66
+ {
67
+ static Screen *save_screen = (Screen *)0;
68
+ static Window root = (Window)0;
69
+
70
+ if (screen != save_screen) {
71
+ Display *dpy = DisplayOfScreen(screen);
72
+ Atom __SWM_VROOT = None;
73
+ int i;
74
+ Window rootReturn, parentReturn, *children;
75
+ unsigned int numChildren;
76
+
77
+ root = RootWindowOfScreen(screen);
78
+
79
+ /* go look for a virtual root */
80
+ __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False);
81
+ if (XQueryTree(dpy, root, &rootReturn, &parentReturn,
82
+ &children, &numChildren)) {
83
+ for (i = 0; i < numChildren; i++) {
84
+ Atom actual_type;
85
+ int actual_format;
86
+ unsigned long nitems, bytesafter;
87
+ Window *newRoot = (Window *)0;
88
+
89
+ if (XGetWindowProperty(dpy, children[i],
90
+ __SWM_VROOT, 0, 1, False, XA_WINDOW,
91
+ &actual_type, &actual_format,
92
+ &nitems, &bytesafter,
93
+ (unsigned char **) &newRoot) == Success
94
+ && newRoot) {
95
+ root = *newRoot;
96
+ break;
97
+ }
98
+ }
99
+ if (children)
100
+ XFree((char *)children);
101
+ }
102
+
103
+ save_screen = screen;
104
+ }
105
+
106
+ return root;
107
+ }
108
+
109
+ #undef RootWindowOfScreen
110
+ #define RootWindowOfScreen(s) VirtualRootWindowOfScreen(s)
111
+
112
+ #undef RootWindow
113
+ #define RootWindow(dpy,screen) VirtualRootWindowOfScreen(ScreenOfDisplay(dpy,screen))
114
+
115
+ #undef DefaultRootWindow
116
+ #define DefaultRootWindow(dpy) VirtualRootWindowOfScreen(DefaultScreenOfDisplay(dpy))
117
+
118
+ #endif /* _VROOT_H_ */
@@ -0,0 +1,13 @@
1
+ Moin moin, dear Gosu user!
2
+
3
+ * The latest documentation on how to install/set up Gosu can be found on:
4
+ http://code.google.com/p/gosu/wiki/DocsOverview
5
+
6
+ * Try doing the tutorial there if you don't know how to start out!
7
+
8
+ * If you have any questions or feedback,
9
+ leave a comment on one of Gosu's wiki page,
10
+ mail me at julian@raschke.de,
11
+ or try your luck in #gosu on irc.freenode.org.
12
+
13
+ We hope you'll enjoy using Gosu!
@@ -0,0 +1,178 @@
1
+ require 'ftools'
2
+ require 'rake/gempackagetask'
3
+
4
+ GOSU_VERSION = ENV['GOSU_RELEASE_VERSION']
5
+ throw "GOSU_RELEASE_VERSION must be set" if GOSU_VERSION.nil?
6
+
7
+ COMMON_FILES = FileList[
8
+ 'COPYING.txt',
9
+ 'README.txt',
10
+ ]
11
+
12
+ COMMON_CPP_FILES = COMMON_FILES + FileList[
13
+ 'examples/*.cpp',
14
+ 'examples/media/*',
15
+ 'reference/**/*',
16
+ ]
17
+
18
+ COMMON_RUBY_FILES = COMMON_FILES + FileList[
19
+ 'examples/*.rb',
20
+ 'examples/media/*',
21
+ ]
22
+
23
+ SOURCE_FILES = COMMON_CPP_FILES + COMMON_RUBY_FILES + FileList[
24
+ 'Rakefile',
25
+ 'Gosu/**/*', 'GosuImpl/**/*',
26
+ 'linux/configure', 'linux/configure.ac', 'linux/Makefile.in',
27
+ 'mac/Gosu.xcodeproj/**/*', 'mac/*.a', 'mac/English.lproj/**/*',
28
+ 'mac/Gosu-Info.plist', 'mac/RubyGosu Template-Info.plist',
29
+ 'windows/*.*',
30
+ ]
31
+ SOURCE_FILES.uniq!
32
+
33
+ # Sets everything except 'platform' and 'files'.
34
+ def apply_gemspec_defaults s
35
+ #### Basic information.
36
+ s.name = 'gosu'
37
+ s.version = GOSU_VERSION
38
+ s.summary = '2D game development library.'
39
+ s.description = <<EOS
40
+ 2D game development library.
41
+
42
+ Gosu features easy to use and game-friendly interfaces to 2D graphics
43
+ and text (accelerated by 3D hardware), sound samples and music as well as
44
+ keyboard, mouse and gamepad/joystick input.
45
+
46
+ Also includes demos for integration with RMagick, Chipmunk and Ruby-OpenGL.
47
+ EOS
48
+ s.authors = ['Julian Raschke', 'Jan Luecker']
49
+ s.date = Time.now.strftime '%Y-%m-%d'
50
+ s.email = 'julian@raschke.de'
51
+ s.homepage = 'http://code.google.com/p/gosu/'
52
+ s.require_paths = ['lib']
53
+ s.required_ruby_version = Gem::Requirement.new('>= 1.8.2')
54
+ s.summary = '2D game development library.'
55
+ end
56
+
57
+ desc "Build C++ reference with doxygen"
58
+ task :cpp_docs do
59
+ sh "cd reference && doxygen"
60
+ end
61
+
62
+ Rake.application.in_namespace :mac do
63
+ desc "Build Gosu.framework"
64
+ task :cpp => :cpp_docs do
65
+ sh "cd mac && xcodebuild -project Gosu.xcodeproj -target Gosu -configuration Release"
66
+ end
67
+
68
+ desc "Build lib/gosu.bundle and RubyGosu Deployment Template.app"
69
+ task :ruby do
70
+ sh "cd mac && xcodebuild -project Gosu.xcodeproj -target 'RubyGosu Core' -configuration Release"
71
+ sh "cd mac && xcodebuild -project Gosu.xcodeproj -target 'RubyGosu Deployment Template' -configuration Release"
72
+ end
73
+
74
+ MAC_ARCHIVE_FILENAME = "public/gosu-mac-#{GOSU_VERSION}.tar.gz"
75
+
76
+ desc "Build the archive #{MAC_ARCHIVE_FILENAME}"
77
+ task :archive => [:cpp, :ruby] do
78
+ files = COMMON_CPP_FILES + COMMON_RUBY_FILES + ['lib/gosu.bundle'] +
79
+ FileList['Gosu.framework/**/*', 'RubyGosu Deployment Template.app/**/*']
80
+ sh "tar -czf #{MAC_ARCHIVE_FILENAME} #{files.map { |filename| "'#{filename}'" }.join(' ')}"
81
+ end
82
+
83
+ desc "Releases the archive #{MAC_ARCHIVE_FILENAME} on GoogleCode"
84
+ task :release => :archive do
85
+ sh "./googlecode_upload.py --summary=\"Gosu #{GOSU_VERSION}, compiled for Mac OS X (C++ & Ruby)\"" +
86
+ " --project=gosu --user=julianraschke --labels=\"Featured,Type-Archive,OpSys-OSX\" #{MAC_ARCHIVE_FILENAME}"
87
+ end
88
+
89
+ task :gem => :ruby
90
+
91
+ MAC_SPEC = Gem::Specification.new do |s|
92
+ apply_gemspec_defaults s
93
+ s.platform = 'universal-darwin'
94
+ s.files = COMMON_RUBY_FILES + ['lib/gosu.bundle']
95
+ end
96
+ Rake::GemPackageTask.new(MAC_SPEC) { |t| t.package_dir = 'public/mac_gem' }
97
+ end
98
+
99
+ Rake.application.in_namespace :win do
100
+ WINDOWS_CPP_ARCHIVE_FILENAME = "public/gosu-windows-cpp-#{GOSU_VERSION}.zip"
101
+
102
+ desc "Build the archive #{WINDOWS_CPP_ARCHIVE_FILENAME}"
103
+ task :cpp_archive do #=> [:cpp] do
104
+ files = COMMON_CPP_FILES + ['lib/Gosu.lib', 'lib/GosuDebug.lib', 'lib/fmod.dll']
105
+ sh "zip #{WINDOWS_CPP_ARCHIVE_FILENAME} #{files.map { |filename| "'#{filename}'" }.join(' ')}"
106
+ end
107
+
108
+ desc "Releases the archive #{WINDOWS_CPP_ARCHIVE_FILENAME} on GoogleCode"
109
+ task :cpp_release => :cpp_archive do
110
+ sh "./googlecode_upload.py --summary=\"Gosu #{GOSU_VERSION}, compiled for 32-bit Windows (C++)\"" +
111
+ " --project=gosu --user=julianraschke --labels=\"Featured,Type-Archive,OpSys-Windows\" #{WINDOWS_CPP_ARCHIVE_FILENAME}"
112
+ end
113
+
114
+ WINDOWS_RUBY_ARCHIVE_FILENAME = "public/gosu-windows-ruby-#{GOSU_VERSION}.zip"
115
+
116
+ desc "Build the archive #{WINDOWS_RUBY_ARCHIVE_FILENAME}"
117
+ task :ruby_archive do #=> [:ruby] do
118
+ files = COMMON_RUBY_FILES + ['lib/gosu.so', 'lib/fmod.dll']
119
+ sh "zip #{WINDOWS_RUBY_ARCHIVE_FILENAME} #{files.map { |filename| "'#{filename}'" }.join(' ')}"
120
+ end
121
+
122
+ desc "Releases the archive #{WINDOWS_RUBY_ARCHIVE_FILENAME} on GoogleCode"
123
+ task :ruby_release => :ruby_archive do
124
+ sh "./googlecode_upload.py --summary=\"Gosu #{GOSU_VERSION}, compiled for 32-bit Windows (Ruby)\"" +
125
+ " --project=gosu --user=julianraschke --labels=\"Featured,Type-Archive,OpSys-Windows\" #{WINDOWS_RUBY_ARCHIVE_FILENAME}"
126
+ end
127
+
128
+ desc "Release both #{WINDOWS_CPP_ARCHIVE_FILENAME} and #{WINDOWS_RUBY_ARCHIVE_FILENAME}"
129
+ task :release => [:cpp_release, :ruby_release]
130
+
131
+ WINDOWS_SPEC = Gem::Specification.new do |s|
132
+ apply_gemspec_defaults s
133
+ s.platform = 'x86-mswin32-60'
134
+ s.files = COMMON_RUBY_FILES + ['lib/gosu.so', 'lib/fmod.dll']
135
+ end
136
+ Rake::GemPackageTask.new(WINDOWS_SPEC) { |t| t.package_dir = 'public/windows_gem' }
137
+ end
138
+
139
+ Rake.application.in_namespace :linux do
140
+ LINUX_ARCHIVE_FILENAME = "public/gosu-source-#{GOSU_VERSION}.tar.gz"
141
+
142
+ desc "Build the archive #{LINUX_ARCHIVE_FILENAME}"
143
+ task :archive => [:cpp_docs] do
144
+ files = SOURCE_FILES
145
+ sh "cd .. && tar -czf gosu/#{LINUX_ARCHIVE_FILENAME} #{files.map { |filename| "'gosu/#{filename}'" }.join(' ')}"
146
+ end
147
+
148
+ desc "Releases the archive #{LINUX_ARCHIVE_FILENAME} on GoogleCode"
149
+ task :release => :archive do
150
+ sh "./googlecode_upload.py --summary=\"Gosu #{GOSU_VERSION} source package (to compile on Linux)\"" +
151
+ " --project=gosu --user=julianraschke --labels=\"Featured,Type-Archive,OpSys-All\" #{LINUX_ARCHIVE_FILENAME}"
152
+ end
153
+
154
+ LINUX_SPEC = Gem::Specification.new do |s|
155
+ apply_gemspec_defaults s
156
+ s.platform = 'ruby'
157
+ s.files = SOURCE_FILES + [ 'linux/extconf.rb' ]
158
+ s.extensions = [ 'linux/extconf.rb' ]
159
+ s.require_path = 'lib'
160
+ s.requirements = ['g++',
161
+ 'pkg-config',
162
+ 'libgl',
163
+ 'X11 includes and libraries',
164
+ 'pangoft2',
165
+ 'fmod or SDL_mixer',
166
+
167
+ "(Packages for Debian/Ubuntu:\n" +
168
+ ' g++ pkg-config ruby-dev xorg-dev' +
169
+ ' libsdl-mixer1.2-dev libgl1-mesa-dev' +
170
+ ' libpango1.0-dev' +
171
+ "\n)"]
172
+ end
173
+
174
+ Rake::GemPackageTask.new(LINUX_SPEC) { |t| t.package_dir = 'public/linux_gem' }
175
+ end
176
+
177
+ # TODO? Gem upload to RubyForge: http://nubyonrails.com/articles/tutorial-publishing-rubygems-with-hoe
178
+
@@ -0,0 +1,275 @@
1
+ ## File: ChipmunkIntegration.rb
2
+ ## Author: Dirk Johnson
3
+ ## Version: 1.0.0
4
+ ## Date: 2007-10-05
5
+ ## License: Same as for Gosu (MIT)
6
+ ## Comments: Based on the Gosu Ruby Tutorial, but incorporating the Chipmunk Physics Engine
7
+ ## See http://code.google.com/p/gosu/wiki/RubyChipmunkIntegration for the accompanying text.
8
+
9
+ require 'rubygems'
10
+ require 'gosu'
11
+ require 'chipmunk'
12
+
13
+ SCREEN_WIDTH = 640
14
+ SCREEN_HEIGHT = 480
15
+
16
+ # The number of steps to process every Gosu update
17
+ # The Player ship can get going so fast as to "move through" a
18
+ # star without triggering a collision; an increased number of
19
+ # Chipmunk step calls per update will effectively avoid this issue
20
+ SUBSTEPS = 6
21
+
22
+ # Convenience method for converting from radians to a Vec2 vector.
23
+ class Numeric
24
+ def radians_to_vec2
25
+ CP::Vec2.new(Math::cos(self), Math::sin(self))
26
+ end
27
+ end
28
+
29
+ # Layering of sprites
30
+ module ZOrder
31
+ Background, Stars, Player, UI = *0..3
32
+ end
33
+
34
+ # This game will have one Player in the form of a ship
35
+ class Player
36
+ attr_reader :shape
37
+
38
+ def initialize(window, shape)
39
+ @image = Gosu::Image.new(window, "media/Starfighter.bmp", false)
40
+ @shape = shape
41
+ @shape.body.p = CP::Vec2.new(0.0, 0.0) # position
42
+ @shape.body.v = CP::Vec2.new(0.0, 0.0) # velocity
43
+
44
+ # Keep in mind that down the screen is positive y, which means that PI/2 radians,
45
+ # which you might consider the top in the traditional Trig unit circle sense is actually
46
+ # the bottom; thus 3PI/2 is the top
47
+ @shape.body.a = (3*Math::PI/2.0) # angle in radians; faces towards top of screen
48
+ end
49
+
50
+ # Directly set the position of our Player
51
+ def warp(vect)
52
+ @shape.body.p = vect
53
+ end
54
+
55
+ # Apply negative Torque; Chipmunk will do the rest
56
+ # SUBSTEPS is used as a divisor to keep turning rate constant
57
+ # even if the number of steps per update are adjusted
58
+ def turn_left
59
+ @shape.body.t -= 400.0/SUBSTEPS
60
+ end
61
+
62
+ # Apply positive Torque; Chipmunk will do the rest
63
+ # SUBSTEPS is used as a divisor to keep turning rate constant
64
+ # even if the number of steps per update are adjusted
65
+ def turn_right
66
+ @shape.body.t += 400.0/SUBSTEPS
67
+ end
68
+
69
+ # Apply forward force; Chipmunk will do the rest
70
+ # SUBSTEPS is used as a divisor to keep acceleration rate constant
71
+ # even if the number of steps per update are adjusted
72
+ # Here we must convert the angle (facing) of the body into
73
+ # forward momentum by creating a vector in the direction of the facing
74
+ # and with a magnitude representing the force we want to apply
75
+ def accelerate
76
+ @shape.body.apply_force((@shape.body.a.radians_to_vec2 * (3000.0/SUBSTEPS)), CP::Vec2.new(0.0, 0.0))
77
+ end
78
+
79
+ # Apply even more forward force
80
+ # See accelerate for more details
81
+ def boost
82
+ @shape.body.apply_force((@shape.body.a.radians_to_vec2 * (3000.0)), CP::Vec2.new(0.0, 0.0))
83
+ end
84
+
85
+ # Apply reverse force
86
+ # See accelerate for more details
87
+ def reverse
88
+ @shape.body.apply_force(-(@shape.body.a.radians_to_vec2 * (1000.0/SUBSTEPS)), CP::Vec2.new(0.0, 0.0))
89
+ end
90
+
91
+ # Wrap to the other side of the screen when we fly off the edge
92
+ def validate_position
93
+ l_position = CP::Vec2.new(@shape.body.p.x % SCREEN_WIDTH, @shape.body.p.y % SCREEN_HEIGHT)
94
+ @shape.body.p = l_position
95
+ end
96
+
97
+ def draw
98
+ @image.draw_rot(@shape.body.p.x, @shape.body.p.y, ZOrder::Player, @shape.body.a.radians_to_gosu)
99
+ end
100
+ end
101
+
102
+ # See how simple our Star is?
103
+ # Of course... it just sits around and looks good...
104
+ class Star
105
+ attr_reader :shape
106
+
107
+ def initialize(animation, shape)
108
+ @animation = animation
109
+ @color = Gosu::Color.new(0xff000000)
110
+ @color.red = rand(255 - 40) + 40
111
+ @color.green = rand(255 - 40) + 40
112
+ @color.blue = rand(255 - 40) + 40
113
+ @shape = shape
114
+ @shape.body.p = CP::Vec2.new(rand * SCREEN_WIDTH, rand * SCREEN_HEIGHT) # position
115
+ @shape.body.v = CP::Vec2.new(0.0, 0.0) # velocity
116
+ @shape.body.a = (3*Math::PI/2.0) # angle in radians; faces towards top of screen
117
+ end
118
+
119
+ def draw
120
+ img = @animation[Gosu::milliseconds / 100 % @animation.size];
121
+ img.draw(@shape.body.p.x - img.width / 2.0, @shape.body.p.y - img.height / 2.0, ZOrder::Stars, 1, 1, @color, :additive)
122
+ end
123
+ end
124
+
125
+ # The Gosu::Window is always the "environment" of our game
126
+ # It also provides the pulse of our game
127
+ class GameWindow < Gosu::Window
128
+ def initialize
129
+ super(SCREEN_WIDTH, SCREEN_HEIGHT, false, 16)
130
+ self.caption = "Gosu & Chipmunk Integration Demo"
131
+ @background_image = Gosu::Image.new(self, "media/Space.png", true)
132
+
133
+ # Put the beep here, as it is the environment now that determines collision
134
+ @beep = Gosu::Sample.new(self, "media/Beep.wav")
135
+
136
+ # Put the score here, as it is the environment that tracks this now
137
+ @score = 0
138
+ @font = Gosu::Font.new(self, Gosu::default_font_name, 20)
139
+
140
+ # Time increment over which to apply a physics "step" ("delta t")
141
+ @dt = (1.0/60.0)
142
+
143
+ # Create our Space and set its damping
144
+ # A damping of 0.8 causes the ship bleed off its force and torque over time
145
+ # This is not realistic behavior in a vacuum of space, but it gives the game
146
+ # the feel I'd like in this situation
147
+ @space = CP::Space.new
148
+ @space.damping = 0.8
149
+
150
+ # Create the Body for the Player
151
+ body = CP::Body.new(10.0, 150.0)
152
+
153
+ # In order to create a shape, we must first define it
154
+ # Chipmunk defines 3 types of Shapes: Segments, Circles and Polys
155
+ # We'll use s simple, 4 sided Poly for our Player (ship)
156
+ # You need to define the vectors so that the "top" of the Shape is towards 0 radians (the right)
157
+ shape_array = [CP::Vec2.new(-25.0, -25.0), CP::Vec2.new(-25.0, 25.0), CP::Vec2.new(25.0, 1.0), CP::Vec2.new(25.0, -1.0)]
158
+ shape = CP::Shape::Poly.new(body, shape_array, CP::Vec2.new(0,0))
159
+
160
+ # The collision_type of a shape allows us to set up special collision behavior
161
+ # based on these types. The actual value for the collision_type is arbitrary
162
+ # and, as long as it is consistent, will work for us; of course, it helps to have it make sense
163
+ shape.collision_type = :ship
164
+
165
+ @space.add_body(body)
166
+ @space.add_shape(shape)
167
+
168
+ @player = Player.new(self, shape)
169
+ @player.warp(CP::Vec2.new(320, 240)) # move to the center of the window
170
+
171
+ @star_anim = Gosu::Image::load_tiles(self, "media/Star.png", 25, 25, false)
172
+ @stars = Array.new
173
+
174
+ # Here we define what is supposed to happen when a Player (ship) collides with a Star
175
+ # I create a @remove_shapes array because we cannot remove either Shapes or Bodies
176
+ # from Space within a collision closure, rather, we have to wait till the closure
177
+ # is through executing, then we can remove the Shapes and Bodies
178
+ # In this case, the Shapes and the Bodies they own are removed in the Gosu::Window.update phase
179
+ # by iterating over the @remove_shapes array
180
+ # Also note that both Shapes involved in the collision are passed into the closure
181
+ # in the same order that their collision_types are defined in the add_collision_func call
182
+ @remove_shapes = []
183
+ @space.add_collision_func(:ship, :star) do |ship_shape, star_shape|
184
+ @score += 10
185
+ @beep.play
186
+ @remove_shapes << star_shape
187
+ end
188
+
189
+ # Here we tell Space that we don't want one star bumping into another
190
+ # The reason we need to do this is because when the Player hits a Star,
191
+ # the Star will travel until it is removed in the update cycle below
192
+ # which means it may collide and therefore push other Stars
193
+ # To see the effect, remove this line and play the game, every once in a while
194
+ # you'll see a Star moving
195
+ @space.add_collision_func(:star, :star, &nil)
196
+ end
197
+
198
+ def update
199
+ # Step the physics environment SUBSTEPS times each update
200
+ SUBSTEPS.times do
201
+ # This iterator makes an assumption of one Shape per Star making it safe to remove
202
+ # each Shape's Body as it comes up
203
+ # If our Stars had multiple Shapes, as would be required if we were to meticulously
204
+ # define their true boundaries, we couldn't do this as we would remove the Body
205
+ # multiple times
206
+ # We would probably solve this by creating a separate @remove_bodies array to remove the Bodies
207
+ # of the Stars that were gathered by the Player
208
+ @remove_shapes.each do |shape|
209
+ @stars.delete_if { |star| star.shape == shape }
210
+ @space.remove_body(shape.body)
211
+ @space.remove_shape(shape)
212
+ end
213
+ @remove_shapes.clear # clear out the shapes for next pass
214
+
215
+ # When a force or torque is set on a Body, it is cumulative
216
+ # This means that the force you applied last SUBSTEP will compound with the
217
+ # force applied this SUBSTEP; which is probably not the behavior you want
218
+ # We reset the forces on the Player each SUBSTEP for this reason
219
+ @player.shape.body.reset_forces
220
+
221
+ # Wrap around the screen to the other side
222
+ @player.validate_position
223
+
224
+ # Check keyboard
225
+ if button_down? Gosu::Button::KbLeft
226
+ @player.turn_left
227
+ end
228
+ if button_down? Gosu::Button::KbRight
229
+ @player.turn_right
230
+ end
231
+
232
+ if button_down? Gosu::Button::KbUp
233
+ if ( (button_down? Gosu::Button::KbRightShift) || (button_down? Gosu::Button::KbLeftShift) )
234
+ @player.boost
235
+ else
236
+ @player.accelerate
237
+ end
238
+ elsif button_down? Gosu::Button::KbDown
239
+ @player.reverse
240
+ end
241
+
242
+ # Perform the step over @dt period of time
243
+ # For best performance @dt should remain consistent for the game
244
+ @space.step(@dt)
245
+ end
246
+
247
+ # Each update (not SUBSTEP) we see if we need to add more Stars
248
+ if rand(100) < 4 and @stars.size < 25 then
249
+ body = CP::Body.new(0.0001, 0.0001)
250
+ shape = CP::Shape::Circle.new(body, 25/2, CP::Vec2.new(0.0, 0.0))
251
+ shape.collision_type = :star
252
+
253
+ @space.add_body(body)
254
+ @space.add_shape(shape)
255
+
256
+ @stars.push(Star.new(@star_anim, shape))
257
+ end
258
+ end
259
+
260
+ def draw
261
+ @background_image.draw(0, 0, ZOrder::Background)
262
+ @player.draw
263
+ @stars.each { |star| star.draw }
264
+ @font.draw("Score: #{@score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xffffff00)
265
+ end
266
+
267
+ def button_down(id)
268
+ if id == Gosu::Button::KbEscape
269
+ close
270
+ end
271
+ end
272
+ end
273
+
274
+ window = GameWindow.new
275
+ window.show