martes, 13 de mayo de 2008

Pygame y openGL juntos: lo mejor de 2 mundos

La idea de combinar Pygame y openGL es conseguir lo mejor de ambos, o sea utilizar openGL como motor grafico, y Pygame para manejar los eventos y el sonido, les voy a mostrar un codigo bien sencillo donde se dibuja un triangulo pero sobre una ventana de pygame.

La clave esta en usar la siguiente linea:
pygame.display.set_mode((width,height),OPENGL|DOUBLEBUF)

de esa manera le permitimos a la ventana principal de pygame, mostrar lo que podria mostrar una ventana de OpenGL.

A continuacion el ejemplo.


#---Codigo de pygame junto con pyopengl---
#Working with pygame instead of GLUT
#Using pygame events

import pygame
from pygame import *
from OpenGL.GL import *
from OpenGL.GLU import *


def triangle():
glBegin(GL_TRIANGLES)
glColor3f(1.0,0.0,0.0)
glVertex3f(0.0,0.8,0.0)
glColor3f(0.0,1.0,0.0)
glVertex3f(-0.6,-0.2,0.0)
glColor3f(0.0,0.0,1.0)
glVertex3f(0.6,-0.2,0.0)
glEnd()


def display():
glClearColor(0.0,0.0,0.0,0.0)
glClear(GL_COLOR_BUFFER_BIT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0)
triangle()
glMatrixMode(GL_MODELVIEW)
glFlush()


def windowInit(width,height):
pygame.init()
pygame.display.set_mode((width,height),OPENGL|DOUBLEBUF)
glViewport(0,0,width,height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45,1.0*width/height,0.1,100.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()


def main():
windowInit(640,480)
while True:
display()
pygame.display.flip()
for event in pygame.event.get():
if event.type==QUIT:
return

main()


El unico problema de combinarlos es que el framerate que se obtiene, es menor que el que se obtendria ocupando directamente la ventana de Glut, o ventanas de windows/linux/otros. De todas maneras el framerate obtenido es suficiente para desarrollar un juego comercial.

No hay comentarios: