Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/README.txt
blob: e26f30930616ad312dcedb0dc9226eaa42701f2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
== Sugargame ==

Sugargame is a Python package which allows [http://www.pygame.org/ Pygame]
programs to run well under Sugar.
It is fork of the olcpgames framework, which is no longer maintained.

http://git.sugarlabs.org/projects/sugargame

What it does:

* Wraps a Sugar activity around an existing Pygame program with few changes
* Allows Sugar toolbars and other widgets to be added to the activity UI
* Provides hooks for saving to and restoring from the Journal

==== Differences between Sugargame and olpcgames ====

The olpcgames framework provides a wrapper around Pygame which attempts to
allow a Pygame program to run mostly unmodified under Sugar.  To this end,
the Pygame program is run in a separate thread with its own Pygame message
loop while the main thread runs the GTK message loop.  Also, olpcgames wraps
Sugar APIs such as the journal and mesh into a Pygame-like API.

Sugargame takes a simpler approach; it provides a way to embed Pygame into a
GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs
are used for the game.

Sugargame advantages:

* Simpler code
* More elegant interface between Pygame and GTK
* Runs as a single thread: no thread related segfaults
* Possible to use Sugar widgets with Pygame

Sugargame limitations:

* No support for Pango or SVG sprites (yet)

== Using Sugargame ==

See also [[Development Team/Sugargame/Examples]].

==== Wrapping a Pygame program ====

To use Sugargame to Sugarize a Pygame program, set up an activity directory and
copy the Sugargame package to it.

The activity directory should look something like this:

   activity/            - Activity directory: activity.info, SVG icon, etc.
   sugargame/           - Sugargame package
   MyActivity.py        - Activity class
   mygame.py            - Pygame code
   setup.py             - Install script

To make the Activity class, start with test/TestActivity.py from the Sugargame
distribution.

The activity should create a single PygameCanvas widget and call run_pygame on it.  
Pass the main loop function of the Pygame program.

 self._canvas = sugargame.canvas.PygameCanvas(self)
 self.set_canvas(self._canvas)

 # Start the game running.
 self._canvas.run_pygame(self.game.run)

In your Pygame main loop, pump the GTK message loop:

   while gtk.events_pending():
       gtk.main_iteration()

==== Adding Pygame to a PyGTK activity ====

To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call 
run_pygame on it.

 widget = sugargame.canvas.PygameCanvas(self)
 vbox.pack_start(widget)

 widget.run_pygame(self.game.run)

Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the
entire activity.

The argument to run_pygame is a function structured like a Pygame program.  In the 
main loop, remember to dispatch GTK messages using gtk.main_iteration().

 def main_loop():
        clock = pygame.time.Clock()
        screen = pygame.display.get_surface()

        while self.running:
            # Pump GTK messages.
            while gtk.events_pending():
                gtk.main_iteration()

            # Pump PyGame messages.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                elif event.type == pygame.VIDEORESIZE:
                    pygame.display.set_mode(event.size, pygame.RESIZABLE)

            # Check the mouse position
            x, y = pygame.mouse.get_pos()

            # Clear Display
            screen.fill((255,255,255)) #255 for white

            # Draw stuff here
            .................

            # Flip Display
            pygame.display.flip()

            # Try to stay at 30 FPS
            self.clock.tick(30)

== Support ==

For help with Sugargame, please email the Sugar Labs development list:

: sugar-devel@lists.sugarlabs.org

Sugargame is developed by Wade Brainerd <wadetb@gmail.com>.

It is loosely based on the source code to the olpcgames framework, developed by
the One Laptop Per Child project.

=== Changelog ===

====v1.1====
* Fix bugs in event handling.  (Pablo Moleri)
* Remove reference to gtk.Socket.get_window() method, which is missing in older versions of PyGTK.

====v1.0====
* Initial version of Sugargame