#!/usr/bin/python import gtk import gobject DELAY = 10 WIDTH = 600 HEIGHT = 600 class MyApp(): def __init__(self): window = gtk.Window() hbox = gtk.HBox() vbox = gtk.VBox() #asignacion de variables a widgest de gtk self.vadjustment = gtk.Adjustment() self.hadjustment = gtk.Adjustment() #asignacion de valores por defecto del adjustment self.vadjustment.set_upper(100) self.vadjustment.set_value(0) self.hadjustment.set_upper(100) self.hadjustment.set_value(0) #asignacion de propiedades de widgets self.vslide = gtk.VScale(self.vadjustment) self.hslide = gtk.HScale(self.hadjustment) #propiedad para que no se muestre valor del slide self.vslide.set_draw_value(False) self.hslide.set_draw_value(False) #variables globales que se utilizan en los slides self.increment_x = self.increment_y = 1 self.indicator_x = self.indicator_y = -1 #asignacion de variables de widgets self.drawing_area = gtk.DrawingArea() self.drawing_area.set_size_request(WIDTH, HEIGHT) #imagen de fondo self.pixbuf = gtk.gdk.pixbuf_new_from_file('images/arco.jpg') self.pixbufkeeper = gtk.gdk.pixbuf_new_from_file('images/goalkeeper_downcenter.png') #self.image = gtk.Image() #self.image.set_from_animation(self.pixbufball) #vbox.add(self.image) window.connect("destroy", lambda w: gtk.main_quit()) self.drawing_area.connect('configure_event', self.__configure_cb) self.drawing_area.connect('expose-event', self.__expose_cb) #evento que invoca funcion al presionar cualquier tecla window.connect('key-press-event', self.__key_press_event_cb) #anhadiendo widgets dentro del contenedor principal window.add(hbox) hbox.add(vbox) vbox.add(self.drawing_area) vbox.add(self.hslide) hbox.add(self.vslide) #mostrando los widgets window.show_all() #invocacion de la funcion que realiza loop del slider horizontal gobject.timeout_add(DELAY, self.__hslider_move_cb) #funcion que se activa al presionar cualquier tecla y pregunta sobre el estado de los indicadores def __key_press_event_cb(self, window, event): if self.indicator_x == -1 and self.indicator_y == -1: self.capturar_valor_hslider() gobject.timeout_add(DELAY, self.__vslider_move_cb) elif self.indicator_y == -1: self.capturar_valor_vslider() #invoca a la funcion que dibuja la pelota de acuerdo a los valores de los sliders self.draw_ball(self.cv_x,self.cv_y) else: self.restart_game() gobject.timeout_add(DELAY, self.__hslider_move_cb) def restart_game(self): #metodo que refresca el drawing_area self.pixmap.draw_pixbuf(None, self.pixbuf, 0, 0, 0, 0, -1, -1, gtk.gdk.RGB_DITHER_NONE, 0, 0) self.pixmap.draw_pixbuf(None, self.pixbufkeeper, 0, 0, 0, 200, -1, -1, gtk.gdk.RGB_DITHER_NONE, 0, 0) self.drawing_area.queue_draw() self.increment_x = self.increment_y = 1 self.indicator_x = self.indicator_y = -1 self.hadjustment.value = self.vadjustment.value = 0 #def #funcion que hace el loop de los valores del slider horizontal def __hslider_move_cb(self): if self.indicator_x < 0: self.hadjustment.value += self.increment_x if self.hadjustment.value >= 100: self.increment_x *= -1 elif self.hadjustment.value <= 0: self.increment_x *= -1 return True else: return False #funcion que hace el loop de los valores del slider vertical def __vslider_move_cb(self): if self.indicator_y < 0: self.vadjustment.value += self.increment_y if self.vadjustment.value >= 100: self.increment_y *= -1 elif self.vadjustment.value <= 0: self.increment_y *= -1 return True else: return False #funcion que captura el valor del slider horizontal despues de pulsar una tecla def capturar_valor_hslider(self): #variable en donde se captura el valor al presionar un tecla self.hslide_value = self.hslide.get_value() #convierte el valor de changed_value a int self.cv_x = (((int(self.hslide_value)) * WIDTH) / 100) #detener el slider self.indicator_x = 0 #funcion que captura el valor del slider vertical despues de pulsar una tecla def capturar_valor_vslider(self): #variable en donde se captura el valor al presionar un tecla self.vslide_value = self.vslide.get_value() #convierte el valor de changed_value a int self.cv_y = (((int(self.vslide_value)) * HEIGHT) / 100) #self.dimensiones_arco() self.indicator_y = 0 #funcion que dibuja la pelota def draw_ball(self, x, y): #variables de las dimensiones de la pelota self.c_x = x self.c_y = y self.c_a = self.c_l = 70 #dibujando la pelota con draw_arc pixbufball = gtk.gdk.pixbuf_new_from_file('images/soccerball.gif') self.pixmap.draw_pixbuf(self.context, pixbufball, 0, 0, self.c_x, self.c_y, -1, -1, gtk.gdk.RGB_DITHER_NONE, 0, 0) self.drawing_area.queue_draw() #self.canvas.draw_arc(self.context, True, self.c_x, self.c_y, self.c_a, self.c_l, 0, 360*64) #pi = 3.14159265 #r = 35 #area_pelota = pi * (r ** 2) #msg = "area pelota" #print msg + "" + str(area_pelota) #funcion que calcula el gol self.calculo_gol(self.c_x, self.c_y, self.c_a) def calculo_gol(self, c_x, c_y, c): #Coordenadas del rectangulo del travesanho t_x = 46 t_y = 133 t_a = 507 t_l = 336 #Coordenadas del rectangulo interior del arco i_x = 58 i_y = 144 i_a = 484 i_l = 324 if c_x+c > i_x and c_y+c > i_y and c_x+c < i_x+i_a and c_y+c < i_y+i_l: print "gol" 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) self.pixmap.draw_pixbuf(None, self.pixbuf, 0, 0, 0, 0, -1, -1, gtk.gdk.RGB_DITHER_NONE, 0, 0) self.pixmap.draw_pixbuf(None, self.pixbufkeeper, 0, 0, 0, 200, -1, -1, gtk.gdk.RGB_DITHER_NONE, 0, 0) return True def __expose_cb(self, drawing_area, data=None): x, y, width, height = data.area style = drawing_area.get_style() self.context = style.fg_gc[gtk.STATE_NORMAL] self.canvas = drawing_area.window self.canvas.draw_drawable(self.context, self.pixmap, x, y, x, y, width, height) return False if __name__ == "__main__": my_app = MyApp() gtk.main()