pygame + pygtk

Consulte acerca de programas, técnicas, algoritmos etc.

pygame + pygtk

Notapor debianman » Jue Oct 15, 2009 8:22 pm

hola a todos...

hace algun tiempo desarrolle un clon de arkanoid con pygame, la duda que tengo es como ese juego integrarlo en una ventana gtk...

e leido algunas cosas, como por ejemplo, incrustar una ventana pygame en gtk o ejecutar directamente la aplicacion pygame dentro de una ventana gtk

alguien a realizado algo parecido?

saludos
debianman
 
Mensajes: 5
Registrado: Lun Feb 16, 2009 7:57 am

Notapor hugoruscitti » Vie Oct 16, 2009 1:16 am

Yo nunca intenté, pero aparentemente sí se puede:

http://faq.pygtk.org/index.py?file=faq2 ... p&req=show

saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor debianman » Lun Oct 19, 2009 7:16 pm

ya habia leido eso, pero la compatibilidad es extremadamente mala, por ejemplo, desde un menu en pygame lanzo una ventana pygtk, esta ventana funciona si se lanza sola pero desde pygame se traba y deja a la ventana pygame bloqueada

alguna idea?
debianman
 
Mensajes: 5
Registrado: Lun Feb 16, 2009 7:57 am

Notapor hugoruscitti » Mar Oct 20, 2009 1:11 am

¿podrías contarnos un poco de la aplicación?, recuerda que
en python puedes crear hilos si tu programa hace mas de
una cosa a la vez.

Aunque pygame no soporta varias ventanas al mismo tiempo, ¿tal
vez ese sea el problema?.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor hugoruscitti » Mar Oct 20, 2009 1:41 am

Aquí escribí un programa que hace algo similar a lo que
nos comentas, pero que no bloquea. Básicamente
imprime un mensaje en pantalla y cada vez que pulsamos
una tecla genera una nueva ventana de pygtk.

Y la ventana original también está hecha con pygtk y pygame:

Código: Seleccionar todo
import os

import gobject
import gtk
import pygame

WINX = 400
WINY = 200

window = gtk.Window()
window.connect('delete-event', gtk.main_quit)
window.set_resizable(False)

area = gtk.DrawingArea()
area.set_app_paintable(True)
area.set_size_request(WINX, WINY)
window.add(area)
area.realize()

# Force SDL to write on our drawing area
os.putenv('SDL_WINDOWID', str(area.window.xid))

# We need to flush the XLib event loop otherwise we can't
# access the XWindow which set_mode() requires
gtk.gdk.flush()

pygame.init()
pygame.display.set_mode((WINX, WINY), 0, 0)
screen = pygame.display.get_surface()

color = (0, 0, 0)
message = pygame.font.Font(None, 30)
img = message.render("Pulse el mouse para crear otra ventana", 1, color)

def loop():
    "Se llama constantemente en todo momento."
    screen.fill((255, 255, 255))
    screen.blit(img, (0, 0))

    pygame.display.update()
    return True

def on_event(widget, event):
    "Se activa cada vez que se produce un evento."

    if event.type == gtk.gdk.KEY_PRESS:
        other = gtk.Window()
        label = gtk.Label("Hola")
        other.add(label)
        other.set_size_request(200, 70)
        other.show_all()


window.connect("event", on_event)

gobject.idle_add(loop)
window.show_all()

gtk.main()


Eso sí, si quieres crear una ventana desde algo que no es
una respuesta a un evento tendrías que utilizar idle_add o
algo similar.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor debianman » Mié Oct 21, 2009 8:17 pm

gracias hugo por tus respuestas, te cuento

logre hacer funcionar pygame dentro de pygtk (todabia no habia visto tus mensajes), el cuento con el que me tope, es el manejo de los eventos, en especifico del mouse, pero ya lo solucione y el juego quedo casi tal cual como lo tengo en pygame, puedes descargarlo desde el link [1], ademas puede que le sirva a otros como realizar lo mismo o algo parecido.

ahora, con el tema que estoy topando es con el uso de la CPU, ya que al funcionar con loops infinitos, el consumo de CPU es casi del 100%, por casualidad sabes como controlar eso?


saludos y gracias por la ayuda

[1]http://carlos.debianchile.cl/files/arkathon/test/arkathon0.5.tar.gz
debianman
 
Mensajes: 5
Registrado: Lun Feb 16, 2009 7:57 am

Notapor hugoruscitti » Jue Oct 22, 2009 2:12 pm

debianman escribió:ahora, con el tema que estoy topando es con el uso de la CPU, ya que al funcionar con loops infinitos, el consumo de CPU es casi del 100%, por casualidad sabes como controlar eso?


Si, en la mayoría de juegos simplemente se coloca una pausa
para compartir CPU con el resto de los procesos del sistema
dentro del loop.

La función en pygame para hacer esto se llama
"pygame.time.wait(milisegundos)". Puedes ver mas detalles
sobre esto en la traducción de pygame docs:

http://www.losersjuegos.com.ar/traducciones/pygame/time

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor debianman » Jue Oct 22, 2009 5:48 pm

los bucles tienen como controlador a clock.tick()
estube probando pygame.time.wait() y pygame.time.delay() pero al usar cualquiera de los dos y sin clock.tick() e igualmente usan el 100% de CPU, cuando lo uso con clock.tick() el juego se laguea...

alguna idea?
debianman
 
Mensajes: 5
Registrado: Lun Feb 16, 2009 7:57 am

Notapor hugoruscitti » Jue Oct 22, 2009 6:41 pm

debianman escribió:los bucles tienen como controlador a clock.tick()
estube probando pygame.time.wait() y pygame.time.delay() pero al usar cualquiera de los dos y sin clock.tick() e igualmente usan el 100% de CPU, cuando lo uso con clock.tick() el juego se laguea...

alguna idea?


m..., pienso que al utilizar pygtk y pygame, tal vez se
pueda reducir la carga de procesador directamente desde pygtk.

Por ejemplo, la función "iddle_add" del ejemplo que mostré en
el anterior ejemplo utilizará mucho CPU, porque intenta ejecutar
todo el tiempo la función loop.

Ahora, para usar menos procesador se podría usar la función
"gtk.timeout_add" indicando cada cuanto tiempo se quiere ejecutar
la función "loop". Por ejemplo, para ejecutar la función loop
60 veces por segundo tendrías que escribir:

Código: Seleccionar todo
    # 1000.0 / 60 ~= 16.6^
    gtk.timeout_add(16, loop)


en lugar de "iddle_add" claro...
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: pygame + pygtk

Notapor diego_g_09 » Mar Ene 10, 2012 9:59 pm

Buenas estoy probando el codigo y estoy teniendo problemas cuando se ejecuta
os.putenv('SDL_WINDOWID', str(area.window.xid))

os.putenv('SDL_WINDOWID', str(area.window.xid ))
AttributeError: xid attribute not supported


Estoy ejecutandolo en windows que puede ser?.

Saludos
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado