2011-01-06 9 views
6

私はpython/pygameでゲームを作ったことを学び始めました。そして、pygameですぐに働くゲームを作るのは簡単ですが、コードを賢明に整理する方法に関する実際のチュートリアルはありません。pygame code organization

pygameチュートリアルのページでは、3つの方法があります。

の1-クラスのない使用は、構造のそれでもオブジェクト指向プログラミングを過度に複雑で曖昧なもの(その結果、知識をレールレールフレームワークのない小規模なプロジェクトのための

2 - MVCルビーオンレール種類)

、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のゲームを作るために使用されていると私は正確にこれを使用します?私はそれが両方のsmaのために使用できるかどうか疑問に思っています大規模なプロジェクトや、パイゲームでよりクリーンな方法がある場合は、また、非常によく組織され、従うことは簡単に見えます

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

MVCは、GUIがある限り、何らかの形で存在しています。あなたの 'C++構造体'は本当にMVCのコントローラ部分です。いつでもon_fooメソッドを使ってイベントを待っているあなたはおそらく何らかの形のMVCを使用しています。 http://martinfowler.com/eaaDev/uiArchs.html –

+0

私はpygameを使って簡単なゲームを書くことを試みています。あなたのアプローチは非常に面白いですが、 'on_loop()'で何をする必要があるのか​​、 'on_render()'メソッド?私が 'on_render'で理解しているように、私たちはいくつかの図面を作っていますよね? 'on_loop()'では、いくつかのロジックを実行します。それが正しいか? – DaZzz

答えて

2

あなたができることを実行してください。投稿したコードを理解できれば、そのコードを使用する必要があります。異なる構造がより自然な感じであれば、代わりにそれを使用してください。

+0

そうです、あなたは、標準のpygame/pythonの方法で、クラスの作成と読み込み可能なイベントのポーリング以外のプロジェクトの編成がないことを確認します。上の2つの例がpythonプログラマーに嫌なものではない限り、それは問題ありません。 –

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

しかし、それは私が仕事だけ方法です。今週だけではなく、来週または今年も、あなたが理解できるものに絶対に従います。

+3

私はあなたのINITセクションを 'if __name__ ==" __main __ ":'ブロックに入れます。 –

+0

はい、サブモジュールは平均的に大規模なプロジェクトに役立ちます –