2011-01-06 13 views
6

Empecé a aprender a hacer juegos con python/pygame y, como es fácil hacer un juego que funcione rápidamente en pygame, no hay un tutorial real sobre cómo organizar el código de manera sensata.pygame code organization

En la página de tutoriales de pygame, he encontrado 3 formas de hacerlo.

1- No uso de las clases, para pequeños proyectos

2- MVC rubí sobre raíles tipo de estructura, pero sin el marco rieles que se traduce en algo demasiado complicado y oscuro (incluso con la programación OO y carriles conocimiento ?)

3- C++ - estructura como la siguiente: (limpia e intuitiva, pero tal vez no mucho pitón similar)

import pygame 
from pygame.locals import * 

class MyGame: 
    def __init__(self): 
     self._running = True 
     self._surf_display = None 
     self.size = self.width, self.height = 150, 150 
    def on_init(self): 
     pygame.init() 
     self._display_surf = pygame.display.set_mode(self.size) 
     pygame.display.set_caption('MyGame') 
     #some more actions 
     pygame.display.flip() 
     self._running = True 
    def on_event(self, event): 
     if event.type == pygame.QUIT: 
      self._running = False 
     elif event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       self._running = False 
     elif event.type == MOUSEBUTTONDOWN: 
      if event.button == 1: 
       print event.pos 
    def on_loop(self): 
     pass 
    def on_render(self): 
     pass 
    def on_cleanup(self): 
     pygame.quit() 
    def on_execute(self): 
     if self.on_init() == False: 
      self._running = False 
     while(self._running): 
      for event in pygame.event.get(): 
       self.on_event(event) 
      self.on_loop() 
      self.on_render() 
     self.on_cleanup() 

if __name__ == "__main__" : 
    mygame = MyGame() 
    mygame.on_execute() 

estoy acostumbrado a hacer juegos de SDL en C++ y utilizo este exacta estructura, pero me pregunto si es utilizable para ambos sma ll y grandes proyectos o si hay una manera más limpia en pygame.

Por ejemplo me encontré con un juego organizado de esta manera:

imports 

def functionx 
def functiony 

class MyGameObject: 
class AnotherObject: 
class Game: #pygame init, event handler, win, lose...etc 
while True: #event loop 
display update 

También se ve muy bien organizado y fácil de seguir.

¿Qué estructura debo usar consistentemente en todos mis proyectos para tener un código limpio que se pueda usar en juegos pequeños y grandes?

+2

MVC ha existido de alguna forma, siempre y cuando haya GUI. Su 'estructura C++' es realmente la parte del controlador de MVC. Cada vez que esperas un evento con un método 'on_foo' probablemente uses alguna forma de MVC. http://martinfowler.com/eaaDev/uiArchs.html –

+0

estoy tratando de escribir un juego simple usando pygame y encontrar su enfoque muy interesante, pero podría explicar qué hacer lo que necesitamos hacer en 'on_loop()' y 'on_render()' métodos? Como lo entiendo en 'on_render' hacemos algunos dibujos, ¿verdad? Y en 'on_loop()' llevamos a cabo cierta lógica. ¿Es correcto? – DaZzz

Respuesta

2

Haz lo que puedas seguir. Si puede darle sentido al código que publicó, entonces eso es lo que debe usar. Si una estructura diferente se siente más natural, úsala en su lugar.

+0

Correcto, por lo que confirma que no existe una forma estándar de pygame/python para organizar un proyecto que no sea la creación de clases y los eventos de sondeo de forma legible. Mientras que los 2 ejemplos anteriores no se vean terribles para un programador python, está bien. –

4

También sugeriría que tal vez use comentarios (tan lúgubres como parece el primero) para dividir su trabajo. Como un ejemplo:

import pygame, random, math 

## CLASSES ---------------------------------------------- 

class Ball(): 
    def __init__(self, (x,y), size): 
     """Setting up the new instance""" 
     self.x = x 
     self.y = y 
     self.size = size 

## FUNCTIONS -------------------------------------------- 
def addVectors((angle1, length1), (angle2, length2)): 
    """Take two vectors and find the resultant""" 
    x = math.sin(angle1) * length1 + math.sin(angle2) * length2 
    y = math.cos(angle1) * length1 + math.cos(angle2) * length2 

## INIT ------------------------------------------------- 

width = 600 
height = 400 
screen = pygame.display.set_mode((width, height)) 
pygame.display.set_caption("S-kuru") 

Y así sucesivamente.

Como otra opción a considerar, ¿ha pensado en usar los submódulos? Son solo otros archivos de Python (.py) en los que coloca funciones comúnmente utilizadas.

def showText(passedVariable): 
    print passedVariable 
    return 

Este nuevo archivo se importó el, al igual que las matemáticas o aleatorio sería y la función que se utiliza como tal:

import mySubModule 

mySubModule.showText("Hello!") 

Pero eso es sólo la forma en que trabajo. Absolutamente sigue lo que puedes entender, no solo ahora sino también la próxima semana o año.

+3

Pondría su sección INIT en un 'if __name__ == "__main __": 'bloque –

+0

sí, los submódulos son útiles en proyectos promedio a grandes –