Difference between revisions of "Development Team/Sugargame"

From Sugar Labs
Jump to navigation Jump to search
Line 3: Line 3:
 
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar.  
 
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.
 
It is fork of the olcpgames framework, which is no longer maintained.
 
Sugargame embeds the Pygame window into a GTK window, and translates GTK
 
events to Pygame events.
 
  
 
What it does:
 
What it does:
Line 17: Line 14:
 
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.
 
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 simply offers 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 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:
 
Sugargame advantages:
Line 32: Line 29:
 
== Using Sugargame ==
 
== Using Sugargame ==
 
   
 
   
=== Porting a Pygame program ===
+
=== Wrapping a Pygame program ===
  
 
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.
 
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.
Line 46: Line 43:
 
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.   
 
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.
+
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._canvas = sugargame.canvas.PygameCanvas(self)
Line 61: Line 58:
 
=== Adding Pygame to an activity ===
 
=== Adding Pygame to an activity ===
  
TODO
+
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
 +
 +
            # 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 ==
 
== Support ==

Revision as of 10:16, 21 November 2009

Sugargame

Sugargame is a Python package which allows Pygame programs to run well under Sugar. It is fork of the olcpgames framework, which is no longer maintained.

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

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 an 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

           # 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

Author

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.