diff options
author | Hector Martinez <hectorsantacruz@hotmail.com> | 2013-01-23 21:32:13 (GMT) |
---|---|---|
committer | Hector Martinez <hectorsantacruz@hotmail.com> | 2013-01-23 21:32:13 (GMT) |
commit | 2b95a2a53819101560350b1eca6bd36298694509 (patch) | |
tree | d922ba8ae8dc5b726573fa085aa08e352d394572 | |
parent | 1355f007987916d4233d6198531f6c7190c1df4c (diff) |
Aplicacion terminada
-rw-r--r-- | activity.py | 178 | ||||
-rwxr-xr-x | board.py | 177 |
2 files changed, 173 insertions, 182 deletions
diff --git a/activity.py b/activity.py index 1bcfaaf..9a53095 100644 --- a/activity.py +++ b/activity.py @@ -19,6 +19,7 @@ import gtk import logging +import gobject from sugar.activity import activity from sugar.graphics.toolbarbox import ToolbarBox @@ -28,7 +29,10 @@ from sugar.activity.widgets import TitleEntry from sugar.activity.widgets import StopButton from sugar.activity.widgets import ShareButton -import board +DELAY = 5 +DELTA = 1 +WIDTH = 512 +HEIGHT = 512 class LanzarActivity(activity.Activity): """LanzarActivity class as specified in activity.info""" @@ -66,11 +70,175 @@ class LanzarActivity(activity.Activity): toolbar_box.toolbar.insert(stop_button, -1) stop_button.show() + self.drawing_area = gtk.DrawingArea() + self.drawing_area.set_size_request(WIDTH, HEIGHT) + + self.pixbuf = gtk.gdk.pixbuf_new_from_file('images/dartboard.png') + self.dart_pixbuf = gtk.gdk.pixbuf_new_from_file('images/dart.png') + + self.drawing_area.connect('configure_event', self.__configure_cb) + self.drawing_area.connect('expose-event', self.__expose_cb) + self.connect('key-press-event', self.__key_press_cb, self.drawing_area) + + box = gtk.Alignment() + box.add(self.drawing_area) + box.set_padding(0, 0, 144, 0) + + self.DELTA_X = DELTA + self.DELTA_Y = DELTA + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea vertical + self._x = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea vertical + self._selected_x = -1 + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea horizontal + self._y = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea horizontal + self._selected_y = -1 + + gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawing_area) + + self.set_canvas(box) self.set_toolbar_box(toolbar_box) + toolbar_box.show() + box.show() + self.drawing_area.show() + + def __configure_cb(self, drawing_area, data=None): + x, y, width, height = drawing_area.get_allocation() + + canvas = drawing_area.window + self.pixmap = gtk.gdk.Pixmap(canvas, width, height) + return True + + def __expose_cb(self, drawing_area, data=None): + x, y, width, height = data.area + + + context = drawing_area.get_style().fg_gc[gtk.STATE_NORMAL] + + canvas = drawing_area.window + canvas.draw_drawable(context, self.pixmap, x, y, x, y, width, height) + return False - dart = board.Darts() - self.set_canvas(dart.drawing_area) - self.connect('key-press-event', dart.__key_press_cb, dart.drawing_area) - dart.drawing_area.show() + def draw_background(self, drawing_area): + #Utilizado para dibujar objetos en el pixmap + cr = self.pixmap.cairo_create() + + # Dibujar inicialmente un fondo negro + cr.set_source_rgb(0, 0, 0) + rectangle = gtk.gdk.Rectangle(0, 0, WIDTH, HEIGHT) + rectangle = cr.rectangle(rectangle) + drawing_area.queue_draw() + cr.fill() + + # Dibujar la diana sobre el fondo negro + self.pixmap.draw_pixbuf(None, self.pixbuf, 0, 0, 0, 0, -1, -1, + gtk.gdk.RGB_DITHER_NONE, 0, 0) + + def draw_line(self, drawing_area, orientation, line_index): + #Utilizado para dibujar objetos en el pixmap + cr = self.pixmap.cairo_create() + + # Dibujar una linea vertical cuya altura ocupe toda la pantalla y sea de + # color blanco para contrastarlo con la diana + cr.set_source_rgb(255, 255, 255) + + if orientation == "VERTICAL": + rectangle = gtk.gdk.Rectangle(line_index, 0, 1, HEIGHT) + else: + rectangle = gtk.gdk.Rectangle(0, line_index, WIDTH, 1) + + rectangle = cr.rectangle(rectangle) + drawing_area.queue_draw() + cr.fill() + + def __move_vertical_line(self, drawing_area): + #Dibujar el fondo sobre el cual movemos las lineas, si aun no hemos + #presionado un boton para dejar la linea vertical en una coordenada dada + if self._selected_x < 0: + self.draw_background(drawing_area) + + # Mover el indice x para que aparente movimiento + self._x += self.DELTA_X; + if self._x > WIDTH: + self.DELTA_X *= -1 + elif self._x < 0: + self.DELTA_X *= -1 + + # Dibujar una linea vertical en la x correspondiente + self.draw_line(drawing_area, "VERTICAL", self._x) + + # Si aun no se selecciono un indice para x, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_x < 0: + return True + else: + return False + + def __move_horizontal_line(self, drawing_area): + #Dibujar el fondo sobre el cual movemos las lineas + self.draw_background(drawing_area) + + # Como la linea vertical ya se detuvo para poder mover la linea + # horizontal, dibujar la linea vertical en la x seleccionada + self.draw_line(drawing_area, "VERTICAL", self._selected_x) + + # Mover el indice y para que aparente movimiento + self._y += self.DELTA_Y; + if self._y > HEIGHT: + self.DELTA_Y *= -1 + elif self._y < 0: + self.DELTA_Y *= -1 + + # Dibujar una linea horizontal en la y correspondiente + self.draw_line(drawing_area, "HORIZONTAL", self._y) + + # Si aun no se selecciono un indice para y, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_y < 0: + return True + else: + return False + + def __key_press_cb(self, window, event, drawing_area): + # Al presionar cualquier tecla, determinar la accion a tomar, de + # acuerdo al estado de las lineas. + if self._selected_x == -1: + self._selected_x = self._x + gobject.timeout_add(DELAY, self.__move_horizontal_line, drawing_area) + elif self._selected_y == -1: + self._selected_y = self._y + gobject.timeout_add(DELAY, self.__draw_dart, drawing_area) + else: + # TO-DO: Calcular el puntaje de acuerdo a _selected_x y _selected_y + # TO-DO: Mostrar el puntaje + self.restart_game(drawing_area) + + def __draw_dart(self, drawing_area): + """ + Dibuja el dardo una vez que se obtuvieron X e Y + """ + x = self._selected_x - 24 # para centrar la imagen + y = self._selected_y - 24 + + self.draw_background(drawing_area) + self.draw_line(drawing_area, "HORIZONTAL", self._selected_y) + self.draw_line(drawing_area, "VERTICAL", self._selected_x) + self.pixmap.draw_pixbuf(None, self.dart_pixbuf, 0, 0, x, y, -1, -1, + gtk.gdk.RGB_DITHER_NONE, 0, 0) + def restart_game(self, drawing_area): + self._x = self._y = 0 + self._selected_x = self._selected_y = -1 + gobject.timeout_add(DELAY, self.__move_vertical_line, drawing_area) diff --git a/board.py b/board.py deleted file mode 100755 index 33cdf32..0000000 --- a/board.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/python -import gtk -import gobject - - -DELAY = 5 -DELTA = 1 -WIDTH = 512 -HEIGHT = 512 - - -class Darts(): - - def __init__(self): - self.drawing_area = gtk.DrawingArea() - self.drawing_area.set_size_request(WIDTH, HEIGHT) - - self.pixbuf = gtk.gdk.pixbuf_new_from_file('images/dartboard.png') - self.dart_pixbuf = gtk.gdk.pixbuf_new_from_file('images/dart.png') - - self.drawing_area.connect('configure_event', self.__configure_cb) - self.drawing_area.connect('expose-event', self.__expose_cb) - #self.window.connect('key-press-event', self.__key_press_cb, self.drawing_area) - - #self.window.add(self.drawing_area) - - self.DELTA_X = DELTA - self.DELTA_Y = DELTA - - # Variable global que ira indicando el "indice" de pixel donde dibujar - # la linea vertical - self._x = 0 - - # Variable global que contendra el "indice" de pixel donde el usuario - # presiono alguna tecla para detenerlo. El valor inicial -1 indica que - # todavia no se ha presionado una tecla para la linea vertical - self._selected_x = -1 - - # Variable global que ira indicando el "indice" de pixel donde dibujar - # la linea horizontal - self._y = 0 - - # Variable global que contendra el "indice" de pixel donde el usuario - # presiono alguna tecla para detenerlo. El valor inicial -1 indica que - # todavia no se ha presionado una tecla para la linea horizontal - self._selected_y = -1 - - gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawing_area) - - def __configure_cb(self, drawing_area, data=None): - x, y, width, height = drawing_area.get_allocation() - - canvas = drawing_area.window - self.pixmap = gtk.gdk.Pixmap(canvas, width, height) - - return True - - def __expose_cb(self, drawing_area, data=None): - x, y, width, height = data.area - context = drawing_area.get_style().fg_gc[gtk.STATE_NORMAL] - - canvas = drawing_area.window - canvas.draw_drawable(context, self.pixmap, x, y, x, y, width, height) - - return False - - def draw_background(self, drawing_area): - #Utilizado para dibujar objetos en el pixmap - cr = self.pixmap.cairo_create() - - # Dibujar inicialmente un fondo negro - cr.set_source_rgb(0, 0, 0) - rectangle = gtk.gdk.Rectangle(0, 0, WIDTH, HEIGHT) - rectangle = cr.rectangle(rectangle) - drawing_area.queue_draw() - cr.fill() - - # Dibujar la diana sobre el fondo negro - self.pixmap.draw_pixbuf(None, self.pixbuf, 0, 0, 0, 0, -1, -1, - gtk.gdk.RGB_DITHER_NONE, 0, 0) - - def draw_line(self, drawing_area, orientation, line_index): - #Utilizado para dibujar objetos en el pixmap - cr = self.pixmap.cairo_create() - - # Dibujar una linea vertical cuya altura ocupe toda la pantalla y sea de - # color blanco para contrastarlo con la diana - cr.set_source_rgb(255, 255, 255) - - if orientation == "VERTICAL": - rectangle = gtk.gdk.Rectangle(line_index, 0, 1, HEIGHT) - else: - rectangle = gtk.gdk.Rectangle(0, line_index, WIDTH, 1) - - rectangle = cr.rectangle(rectangle) - drawing_area.queue_draw() - cr.fill() - - def __move_vertical_line(self, drawing_area): - #Dibujar el fondo sobre el cual movemos las lineas, si aun no hemos - #presionado un boton para dejar la linea vertical en una coordenada dada - if self._selected_x < 0: - self.draw_background(drawing_area) - - # Mover el indice x para que aparente movimiento - self._x += self.DELTA_X; - if self._x > WIDTH: - self.DELTA_X *= -1 - elif self._x < 0: - self.DELTA_X *= -1 - - # Dibujar una linea vertical en la x correspondiente - self.draw_line(drawing_area, "VERTICAL", self._x) - - # Si aun no se selecciono un indice para x, seguir permitiendo invocar - # al timer. Caso contrario, retornar False para evitar mas invocaciones - if self._selected_x < 0: - return True - else: - return False - - def __move_horizontal_line(self, drawing_area): - #Dibujar el fondo sobre el cual movemos las lineas - self.draw_background(drawing_area) - - # Como la linea vertical ya se detuvo para poder mover la linea - # horizontal, dibujar la linea vertical en la x seleccionada - self.draw_line(drawing_area, "VERTICAL", self._selected_x) - - # Mover el indice y para que aparente movimiento - self._y += self.DELTA_Y; - if self._y > HEIGHT: - self.DELTA_Y *= -1 - elif self._y < 0: - self.DELTA_Y *= -1 - - # Dibujar una linea horizontal en la y correspondiente - self.draw_line(drawing_area, "HORIZONTAL", self._y) - - # Si aun no se selecciono un indice para y, seguir permitiendo invocar - # al timer. Caso contrario, retornar False para evitar mas invocaciones - if self._selected_y < 0: - return True - else: - return False - - def __key_press_cb(self, window, event, drawing_area): - # Al presionar cualquier tecla, determinar la accion a tomar, de - # acuerdo al estado de las lineas. - if self._selected_x == -1: - self._selected_x = self._x - gobject.timeout_add(DELAY, self.__move_horizontal_line, drawing_area) - elif self._selected_y == -1: - self._selected_y = self._y - gobject.timeout_add(DELAY, self.__draw_dart, drawing_area) - else: - # TO-DO: Calcular el puntaje de acuerdo a _selected_x y _selected_y - # TO-DO: Mostrar el puntaje - self.restart_game(drawing_area) - - def __draw_dart(self, drawing_area): - """ - Dibuja el dardo una vez que se obtuvieron X e Y - """ - x = self._selected_x - 24 # para centrar la imagen - y = self._selected_y - 24 - - self.draw_background(drawing_area) - self.draw_line(drawing_area, "HORIZONTAL", self._selected_y) - self.draw_line(drawing_area, "VERTICAL", self._selected_x) - self.pixmap.draw_pixbuf(None, self.dart_pixbuf, 0, 0, x, y, -1, -1, - gtk.gdk.RGB_DITHER_NONE, 0, 0) - - def restart_game(self, drawing_area): - self._x = self._y = 0 - self._selected_x = self._selected_y = -1 - gobject.timeout_add(DELAY, self.__move_vertical_line, drawing_area) |