pygame代码组织

时间:2011-01-06 05:35:08

标签: python pygame

我已经开始学习使用python / pygame制作游戏,并且好像很容易在pygame中快速制作一个有效的游戏,但是没有关于如何以合理的方式组织代码的真正教程。

在pygame教程页面上,我找到了3种方法。

1-小型项目不使用课程

2 MVC ruby​​-on-rails类型的结构,但没有rails框架导致过于复杂和模糊的东西(即使使用OO编程和轨道知识)

3- C ++ - 类似结构如下:(干净直观,但可能不是很像python一样?)

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()

我习惯用C ++制作SDL游戏,而且我使用这个确切的结构,但我想知道它是否适用于小型和大型项目,或者是否在pygame中有更清洁的方式。

例如,我发现了一个像这样组织的游戏:

imports

def functionx
def functiony

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

它看起来非常有条理且易于理解。

我应该在所有项目中使用哪种结构,以便在小型和大型游戏中使用干净的代码?

2 个答案:

答案 0 :(得分:4)

我还建议使用评论(尽管看起来像第一个一样沉闷)来分割你的作品。举个例子:

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")

等等。

作为另一个需要考虑的选择,您是否考虑过使用子模块?它们只是放置常用函数的其他Python文件(.py)。

def showText(passedVariable):
    print passedVariable
    return

这个新文件是导入的,就像数学或随机一样,并且使用的函数如下:

import mySubModule

mySubModule.showText("Hello!")

但这就是我的工作方式。绝对遵循你能理解的,不仅仅是现在,而是下周或者一年。

答案 1 :(得分:2)

做你能遵循的事。如果你能理解你发布的代码,那就是你应该使用的代码。如果不同的结构感觉更自然,请使用它。