diff options
author | Samus_ <mail2samus@gmail.com> | 2009-10-15 04:29:21 (GMT) |
---|---|---|
committer | Samus_ <mail2samus@gmail.com> | 2009-10-15 04:29:21 (GMT) |
commit | 3245f7c763d33e5a05300a54f6af1c961654927e (patch) | |
tree | 5f66ca3e9ad7d3d4c97b788dac29e8bf7684ab80 | |
parent | ceeb557800ff3b9caa3e3728786ff5ffd15f639f (diff) |
starting second rewrite to refactor window classes and integrate sugar
-rw-r--r-- | application.py | 75 | ||||
-rw-r--r-- | data/background.png | bin | 41026 -> 0 bytes | |||
-rw-r--r-- | data/completed.png | bin | 1941 -> 0 bytes | |||
-rw-r--r-- | data/failed.png | bin | 3838 -> 0 bytes | |||
-rw-r--r-- | data/gameover.png | bin | 36776 -> 0 bytes | |||
-rw-r--r-- | data/start.png | bin | 16189 -> 0 bytes | |||
-rw-r--r-- | data/state_inicio.glade | 73 | ||||
-rw-r--r-- | data/win.png | bin | 45490 -> 0 bytes | |||
-rw-r--r-- | estados.py | 89 | ||||
-rwxr-xr-x | fracciones.py | 10 | ||||
-rw-r--r-- | fracciones_activity.py | 16 | ||||
-rwxr-xr-x | fracciones_standalone.py | 11 | ||||
-rw-r--r-- | juego1.py | 231 | ||||
-rw-r--r-- | main.py | 10 | ||||
-rw-r--r-- | templates/frame.glade (renamed from data/frame.glade) | 76 | ||||
-rw-r--r-- | torta.py | 64 | ||||
-rw-r--r-- | utils.py | 18 |
17 files changed, 118 insertions, 555 deletions
diff --git a/application.py b/application.py index 22391d8..fa28f26 100644 --- a/application.py +++ b/application.py @@ -1,62 +1,35 @@ -# -*- encoding: utf-8 -""" -Modulo que define la aplicación principal que carga el Frame de la ventana, -inicializa la informacion de la aplicación y permite cambiar entre los -estados que manejan el Content. +# -*- coding: utf-8 -*- +import gtk, pygtk +from os import path -""" -import logging -import gtk -from estados import Inicio +pygtk.require("2.0") +def reparent(manager, template, container): + builder = gtk.Builder() + builder.add_from_file(path.join("templates", template)) + builder.connect_signals(manager) -log = logging.getLogger(__name__) + window = builder.get_object("window") + for child in window.get_children(): + child.reparent(container) +class ApplicationManager(object): + """ Maquina de estados principal -class Application(object): + -Inicializa contenido de la ventana (marco) tanto para Sugar como Standalone + -Provee el metodo 'change_state' utilizado para cargar un nuevo bloque dentro del marco + -Provee atributo 'state_info' (diccionario compartido que almacena los datos de cada contenido cargado) """ - Singleton correspondiente a la aplicación principal. - Contiene un diccionario que mantiene la información que sera utilizada por - los distintos estados del juego. + def __init__(self, frame_container): + super(ApplicationManager, self).__init__() - """ - def __init__(self): - """ - Cargamos el xml que define la interfaz (el marco), asignamos los - eventos, creamos y asignamos el primer estado del juego. - - """ - builder = gtk.Builder() - builder.add_from_file("data/frame.glade") - window = builder.get_object("window") - self.gtkcontent = builder.get_object("dummycontent") - builder.connect_signals(self) - - self.info = dict() - self.change_state(Inicio(self)) - - window.show() - - - def change_state(self, state): - """ - Cambiamos el estado de la aplicación, modificamos Content. + reparent(self, "frame.glade", frame_container) - """ - self.state = state + #self.state_info = dict() + #self.change_state(Inicio(self)) - parent = self.gtkcontent.parent - parent.remove(self.gtkcontent) - self.gtkcontent = state.content - state.get_content().reparent(parent) + frame_container.connect("destroy", self.gtk_main_quit) + frame_container.show() - - def on_FRAME_destroy(self, userdata): + def gtk_main_quit(self, userdata=None): gtk.main_quit() - - - def run(self): - gtk.main() - - -app = Application() diff --git a/data/background.png b/data/background.png Binary files differdeleted file mode 100644 index e4a8351..0000000 --- a/data/background.png +++ /dev/null diff --git a/data/completed.png b/data/completed.png Binary files differdeleted file mode 100644 index c6d04c3..0000000 --- a/data/completed.png +++ /dev/null diff --git a/data/failed.png b/data/failed.png Binary files differdeleted file mode 100644 index b5c1896..0000000 --- a/data/failed.png +++ /dev/null diff --git a/data/gameover.png b/data/gameover.png Binary files differdeleted file mode 100644 index 085c038..0000000 --- a/data/gameover.png +++ /dev/null diff --git a/data/start.png b/data/start.png Binary files differdeleted file mode 100644 index cc9d314..0000000 --- a/data/start.png +++ /dev/null diff --git a/data/state_inicio.glade b/data/state_inicio.glade deleted file mode 100644 index 8a5b80a..0000000 --- a/data/state_inicio.glade +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkWindow" id="window"> - <child> - <object class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="homogeneous">True</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Fractions of Cakes</property> - <attributes> - <attribute name="underline" value="True"/> - <attribute name="scale" value="2.500000"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment2"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkButton" id="button1"> - <property name="label" translatable="yes">Jugar!</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="xalign">0.55000001192092896</property> - </object> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment3"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="yalign">1</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="bottom_padding">10</property> - <property name="right_padding">10</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label" translatable="yes">Instrucciones »</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - </child> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - </object> - </child> - </object> -</interface> diff --git a/data/win.png b/data/win.png Binary files differdeleted file mode 100644 index 18f6b8c..0000000 --- a/data/win.png +++ /dev/null diff --git a/estados.py b/estados.py deleted file mode 100644 index 269f2fb..0000000 --- a/estados.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- encoding: utf-8 -""" -Mantenemos los distintos estados de la aplicación. - -class State(object): - def __init__(self): - debe retornar el contenido que se pondra en CONTENT. - -""" -import logging -import gtk -import cairo - - -log = logging.getLogger(__name__) -IMAGE = { - "start": cairo.ImageSurface.create_from_png("data/start.png"), - "background": cairo.ImageSurface.create_from_png("data/background.png"), - "completed": cairo.ImageSurface.create_from_png("data/completed.png"), - "failed": cairo.ImageSurface.create_from_png("data/failed.png"), - "win": cairo.ImageSurface.create_from_png("data/win.png"), - "gameover": cairo.ImageSurface.create_from_png("data/gameover.png"), -} - - -class Inicio(object): - def __init__(self, state): - builder = gtk.Builder() - builder.add_from_file("data/state_inicio.glade") - builder.connect_signals(self) - self.content = builder.get_object("window").child - self.state = state - - - def get_content(self): - """ - Devuelve el widget que colocaremos en content_container. - - """ - log.debug("gtk: %s", self.content) - return self.content - - - def dibujar(self): - cr = self.content.window.cairo_create() - cr.set_source_surface(IMAGE["start"], 0, 0) - cr.paint() - - - def on_drawingarea_button_press_event(self, widget, event): - log.debug("-> cambiar estado a Jugar") - self.state.change_state(Fin(self.state)) - - - def on_drawingarea_expose_event(self, widget, event): - self.dibujar() - - -class Fin(object): - def __init__(self, state): - self.state = state - builder = gtk.Builder() - builder.add_from_file("data/state_inicio.glade") - builder.connect_signals(self) - self.content = builder.get_object("window").child - - - def get_content(self): - """ - Devuelve el widget que colocaremos en content_container. - - """ - log.debug("gtk: %s", self.content) - return self.content - - - def dibujar(self): - cr = self.content.window.cairo_create() - cr.set_source_surface(IMAGE["win"], 0, 0) - cr.paint() - - - def on_drawingarea_button_press_event(self, widget, event): - log.debug("-> cambiar estado a Jugar") - self.state.change_state(Inicio(self.state)) - - - def on_drawingarea_expose_event(self, widget, event): - self.dibujar() diff --git a/fracciones.py b/fracciones.py deleted file mode 100755 index 28b95af..0000000 --- a/fracciones.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -import logging -from application import app - - -logging.basicConfig(level=logging.DEBUG) - - -if __name__ == "__main__": - app.run() diff --git a/fracciones_activity.py b/fracciones_activity.py new file mode 100644 index 0000000..2aadabc --- /dev/null +++ b/fracciones_activity.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from sugar.activity.activity import Activity, ActivityToolbox +from application import ApplicationManager + +class FraccionesActivity(Activity): + """ Clase principal cuando la aplicacion corre como actividad dentro de Sugar """ + def __init__(self, handle): + super(FraccionesActivity, self).__init__(handle) + + # barra de herramientas de Sugar + toolbox = ActivityToolbox(self) + self.set_toolbox(toolbox) + toolbox.show() + + # conectar maquina de estados principal + self.application_manager = ApplicationManager(self) diff --git a/fracciones_standalone.py b/fracciones_standalone.py new file mode 100755 index 0000000..d91373e --- /dev/null +++ b/fracciones_standalone.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +import gtk +from application import ApplicationManager + +class FraccionesStandalone(gtk.Window): + """ Clase principal cuando se corre por fuera de Sugar """ + def __init__(self): + super(FraccionesStandalone, self).__init__(gtk.WINDOW_TOPLEVEL) + + # conectar maquina de estados principal + self.application_manager = ApplicationManager(self) diff --git a/juego1.py b/juego1.py deleted file mode 100644 index 38d26a7..0000000 --- a/juego1.py +++ /dev/null @@ -1,231 +0,0 @@ -import logging -import cairo -from torta import Torta - - -logging.basicConfig(level=logging.DEBUG) -log = logging.getLogger(__name__) - -MAXLEVEL = 5 -IMAGE = { - "start": cairo.ImageSurface.create_from_png("start.png"), - "background": cairo.ImageSurface.create_from_png("background.png"), - "completed": cairo.ImageSurface.create_from_png("completed.png"), - "failed": cairo.ImageSurface.create_from_png("failed.png"), - "win": cairo.ImageSurface.create_from_png("win.png"), - "gameover": cairo.ImageSurface.create_from_png("gameover.png"), -} - - -class JuegoModo1(object): - def __init__(self): - log.debug("init - JuegoModo1") - self.change_state(Inicio(self)) - self.vidas = 5 - self.nivel = 1 - - - def change_state(self, state): - self.state = state - - - def draw(self, widget, event): - cr = widget.window.cairo_create() - self.state.draw(cr) - - - def update(self, widget, event): - if self.state.update(widget, event): - self.draw(widget, event) - - - def check(self, widget, event): - if isinstance(self.state, Jugar): - self.state.check(widget, event) - - -class Inicio(object): - """ - Mostramos pantalla de inicio y esperamos a que el usuario pulse el raton - para comenzar el juego. - - """ - def __init__(self, juego): - self.juego = juego - - - def update(self, widget, event): - self.juego.change_state(Jugar(self.juego)) - self.juego.draw(widget, event) - - - def draw(self, cairo_surface): - log.debug("draw - INICIO") - cairo_surface.set_source_surface(IMAGE["start"], 0, 0) - cairo_surface.paint() - - -class Jugar(object): - """ - Obtenemos los click's del usuario y esperamos por el resultado del juego. - - """ - def __init__(self, juego): - self.juego = juego - self.torta = Torta([3, 5], [100, 100], 80) - - - def update(self, widget, event): - """ - Verifica donde se pulso en el area del usuario y pasa a la torta. - - """ - log.debug("update - Jugar") - pos = event.get_coords() - if self.torta.select(pos): - log.debug("> torta") - return True - return False - - - def check(self, widget, event): - """ - Cambia de estado tomando en cuenta los trozos seleccionados. - - """ - log.debug("check - Jugar") - if self.torta.check(): - self.juego.change_state(Gana(self.juego)) - self.juego.draw(widget, event) - else: - self.juego.change_state(Pierde(self.juego)) - self.juego.draw(widget, event) - - - def draw(self, cairo_surface): - """ - Dibujamos la torta. - - """ - log.debug("draw - JUGAR") - cairo_surface.set_source_surface(IMAGE["background"], 0, 0) - cairo_surface.paint() - self.torta.draw(cairo_surface) - - -class Gana(object): - """ - Mostramos pantalla de felicitacion y avanzamos al siguiente nivel. - - """ - def __init__(self, juego): - self.juego = juego - - - def update(self, widget, event): - """ - """ - self.juego.nivel += 1 - if self.juego.nivel == MAXLEVEL: - self.juego.change_state(Win(self.juego)) - self.juego.draw(widget, event) - else: - self.juego.change_state(Jugar(self.juego)) - self.juego.draw(widget, event) - - - def draw(self, cairo_surface): - """ - Dibujamos felicitacion. - - """ - log.debug("draw - Gana") - cairo_surface.set_source_surface(IMAGE["completed"], 0, 0) - cairo_surface.paint() - - -class Pierde(object): - """ - Mostramos pantalla de error. Volvemos al siguiente nivel. - - """ - def __init__(self, juego): - self.juego = juego - - - def update(self, widget, event): - """ - Quita una vida. Si quedan reinicia el juego sino se va al game over. - - """ - self.juego.vidas -= 1 - if self.juego.vidas == 0: - self.juego.change_state(GameOver(self.juego)) - self.juego.draw(widget, event) - else: - self.juego.change_state(Jugar(self.juego)) - self.juego.draw(widget, event) - - - def draw(self, cairo_surface): - """ - Dibuja pantalla de error. - - """ - log.debug("draw - Pierde") - cairo_surface.set_source_surface(IMAGE["failed"], 0, 0) - cairo_surface.paint() - - -class GameOver(object): - """ - El jugador pierde por vidas. - - """ - def __init__(self, juego): - self.juego = juego - - - def update(self, widget, event): - """ - No hace nada. - - """ - pass - - - def draw(self, cairo_surface): - """ - Dibuja game over. - - """ - log.debug("draw - GameOver") - cairo_surface.set_source_surface(IMAGE["gameover"], 0, 0) - cairo_surface.paint() - - -class Win(object): - """ - El jugador llega al final del juego. - - """ - def __init__(self, juego): - self.juego = juego - - - def update(self, widget, event): - """ - No hace nada. - - """ - pass - - - def draw(self, cairo_surface): - """ - Dibuja felicitacion. - - """ - log.debug("draw - Win") - cairo_surface.set_source_surface(IMAGE["win"], 0, 0) - cairo_surface.paint() @@ -0,0 +1,10 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import gtk +from fracciones_standalone import FraccionesStandalone + +if __name__ == "__main__": + # crea ventana standalone + standalone = FraccionesStandalone() + # loop de eventos + gtk.main() diff --git a/data/frame.glade b/templates/frame.glade index e686ec6..56f93fe 100644 --- a/data/frame.glade +++ b/templates/frame.glade @@ -2,14 +2,14 @@ <interface> <requires lib="gtk+" version="2.16"/> <!-- interface-naming-policy project-wide --> + <!-- interface-local-resource-path .. --> <object class="GtkWindow" id="window"> - <signal name="destroy" handler="on_FRAME_destroy"/> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="orientation">vertical</property> <child> - <object class="GtkMenuBar" id="menubar1"> + <object class="GtkMenuBar" id="menubar"> <property name="visible">True</property> <child> <object class="GtkMenuItem" id="menuitem1"> @@ -69,6 +69,57 @@ </object> </child> <child> + <object class="GtkMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Edit</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="menu2"> + <property name="visible">True</property> + <child> + <object class="GtkImageMenuItem" id="imagemenuitem6"> + <property name="label">gtk-cut</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="imagemenuitem7"> + <property name="label">gtk-copy</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="imagemenuitem8"> + <property name="label">gtk-paste</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="imagemenuitem9"> + <property name="label">gtk-delete</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="menuitem3"> + <property name="visible">True</property> + <property name="label" translatable="yes">_View</property> + <property name="use_underline">True</property> + </object> + </child> + <child> <object class="GtkMenuItem" id="menuitem4"> <property name="visible">True</property> <property name="label" translatable="yes">_Help</property> @@ -95,27 +146,13 @@ </packing> </child> <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="width_request">320</property> - <property name="height_request">240</property> + <object class="GtkScrolledWindow" id="frame_content"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <child> - <object class="GtkViewport" id="content_container"> - <property name="visible">True</property> - <property name="resize_mode">queue</property> - <child> - <object class="GtkLabel" id="dummycontent"> - <property name="width_request">320</property> - <property name="height_request">240</property> - <property name="visible">True</property> - <property name="yalign">0.4699999988079071</property> - <property name="label" translatable="yes">Dummy object for remove</property> - </object> - </child> - </object> + <placeholder/> </child> </object> <packing> @@ -123,9 +160,10 @@ </packing> </child> <child> - <object class="GtkStatusbar" id="statusbar1"> + <object class="GtkStatusbar" id="statusbar"> <property name="visible">True</property> <property name="spacing">2</property> + <property name="has_resize_grip">False</property> </object> <packing> <property name="expand">False</property> diff --git a/torta.py b/torta.py deleted file mode 100644 index 35dfce5..0000000 --- a/torta.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- encoding: utf-8 -import math -from utils import draw_arc - - -class Torta(object): - def __init__(self, fraction, pos, radius): - """ - Creamos una torta de centro pos, radio radius y que corresponda a la - fraccion fraction. El parametro fraction es una lista cuyo primer - elemento es el numerador y el segundo el denominador de la fraccion. - - """ - self.M = fraction[0] - self.N = fraction[1] - self.center = pos - self.radius = radius - self.selected = [0] * self.N - - - def select(self, pos): - """ - Si pos esta dentro del area de la torta cambia el estado del trozo y - devuelve True, en caso contrario devuelve False. - - """ - x = pos[0] - self.center[0] - y = pos[1] - self.center[1] - if math.pow(x, 2) + math.pow(y, 2) > math.pow(self.radius, 2): - return False - angle = math.atan2(y, x) - if angle < 0: - angle += 2 * math.pi - sector = angle * self.N / (2 * math.pi) - index = int(math.floor(sector)) - self.selected[index] = 1 - self.selected[index] - return True - - - def check(self): - """ - Devuelve True si esta seleccionada la cantidad de sectores - correspondientes a la fraccion, False en caso contrario. - - """ - return sum(self.selected) == self.M - - - def draw(self, cairo_drawing_area): - """ - Dibuja la torta. - - """ - for i in xrange(self.N): - angle_start = 2 * math.pi * i / self.N - angle_end = 2 * math.pi * (i + 1) / self.N - if self.selected[i]: - fg = (1.0, 1.0, 0.0) - bg = (0.0, 1.0, 1.0) - else: - fg = (1.0, 0.0, 0.0) - bg = (0.0, 1.0, 0.0) - draw_arc(cairo_drawing_area, fg, bg, self.center[0], self.center[1], - self.radius, angle_start, angle_end) diff --git a/utils.py b/utils.py deleted file mode 100644 index 3ec288a..0000000 --- a/utils.py +++ /dev/null @@ -1,18 +0,0 @@ -import math - - -def draw_arc(cr, color_fg, color_bg, center_x, center_y, radius, angle_start, angle_end): - """ - Dibuja un arco sobre una superficie de cairo. - - """ - cr.set_source_rgb(*color_fg) - cr.move_to(center_x, center_y) - nx = center_x + radius * math.cos(angle_start) - ny = center_y + radius * math.sin(angle_start) - cr.line_to(nx, ny) - cr.arc(center_x, center_y, radius, angle_start, angle_end) - cr.close_path() - cr.stroke_preserve() - cr.set_source_rgb(*color_bg) - cr.fill() |