2011-12-22 16 views
1

私の目標は、pygameキャンバス上にグリッドを作成し、x座標とy座標でボックスを強調表示するモジュールを作ることです。pygameクラス構造

ここでは簡単な使用例を示します。

from grid import Grid 

g = Grid(100, 100, 10) # width and height in cells, cell width in pixels 
g.highlightBox(2, 2, (0, 255, 0)) # cell x and y, rgb color tuple 
g.clearGrid() 

これまでのコードは次のとおりです。問題は、ウィンドウを開いたままにして閉じるボタンを機能させるためにイベントループを作成する必要があることですが、他の関数も画面に描画できるようにする必要があります。

import pygame 
import sys 

class Grid: 
    colors = {"blue":(0, 0, 255), "red":(255, 0, 0), "green":(0, 255, 0), "black":(0, 0, 0), "white":(255, 255, 255)} 

    def __init__(self, width, height, cellSize, borderWidth=1): 
     self.cellSize = cellSize 
     self.borderWidth = borderWidth 
     self.width = width * (cellSize + borderWidth) 
     self.height = height * (cellSize + borderWidth) 
     self.screen = pygame.display.set_mode((self.width, self.height)) 

     running = True 
     while running: 
      event = pygame.event.poll() 
      if event.type == pygame.QUIT: 
       running = False 

    def clearGrid(self): 
     pass 

    def highlightBox(self, x, y, color): 
     xx = x * (self.cellSize + self.borderWidth) 
     yy = y * (self.cellSize + self.borderWidth) 
     pygame.draw.rect(self.screen, color, (xx, yy, self.cellSize, self.cellSize), 0) 

私は最初のサンプルを実行すると、コードは(終了ボタンが押されている)、ループが実行されるまで、私はhighlightBox機能を実行することができない、ループ内で立ち往生されます。

答えて

0

を与えるだろう例えば表面を返し、またはすべてのゲームループ

回呼び出されますget_surfaceメソッドを作ることができますライブラリおよびパイプmultiprocessing。それはまあまあではないようですが、このプロジェクトではうまくいくでしょう。

import pygame 
import sys 
from multiprocessing import Process, Pipe 

class Grid: 
    colors = {"blue":(0, 0, 255), "red":(255, 0, 0), "green":(0, 255, 0), "black":(0, 0, 0), "white":(255, 255, 255)} 

    def __init__(self, width, height, cellSize, borderWidth=1): 
     self.cellSize = cellSize 
     self.borderWidth = borderWidth 
     self.width = width * (cellSize + borderWidth) 
     self.height = height * (cellSize + borderWidth) 

     #pygame.draw.rect(self.screen, todo[1], (todo[2], todo[3], todo[4], todo[5]), 0) 
     self.parent_conn, self.child_conn = Pipe() 
     self.p = Process(target=self.mainLoop, args=(self.child_conn, self.width, self.height,)) 
     self.p.start() 

    def close(): 
     self.p.join() 

    def clearGrid(self): 
     pass 

    def highlightBox(self, x, y, color): 
     xx = x * (self.cellSize + self.borderWidth) 
     yy = y * (self.cellSize + self.borderWidth) 
     self.parent_conn.send(["box", color, xx, yy, self.cellSize, self.cellSize]) 

    def mainLoop(self, conn, width, height): 
     #make window 
     screen = pygame.display.set_mode((self.width, self.height)) 

     running = True 
     while running: 
      # is there data to read 
      if conn.poll(): 
       #read all data 
       todo = conn.recv() 
       print("Recived " + str(todo)) 

      #do the drawing 
      if todo[0] == "box": 
       print("drawing box") 
       pygame.draw.rect(screen, todo[1], (todo[2], todo[3], todo[4], todo[5]), 0) #color, x, y, width, height 
       todo = ["none"] 

      #draw to screen 
      pygame.display.flip() 

      #get events 
      event = pygame.event.poll() 
      if event.type == pygame.QUIT: 
       running = False 
1

まず、初期化関数の中にゲームループを入れません。それのために他の場所を見つける。これを解決するには、単にあなたがイベントを処理するための次のコードに、ゲームループ内で実行するコード置く:私は何が必要だと思う

running = True 
while running: 
    event = pygame.event.poll() 
    if event.type == pygame.QUIT: 
     running = False 

    # Print your screen in here 
    # Also do any other stuff that you consider appropriate 
+0

trueの場合、init関数でループを実行するのが最適な場所ではない場合があります。決して少なくても、これは外部関数から画面に書き込む問題を解決しません。 – giodamelio

+1

@giodamelioあなたはあなたの問題が何であるかを明確にしていません。あなたが呼び出す必要のある他の機能を持っているなら、(ループの中で)それらを呼び出すことができます。それとも、特定のイベントが発生したときに呼び出されるようにしたいと言っているのですか?あなたの問題が何であるかに関して具体的にしてください。 –

1

するとの表示からグリッドクラスを切断することです。メインのゲームループによってスクリーンサーフェスに印刷されるサーフェスを生成させる必要があります。あなたののinit、highlight_cell、およびclear_grid方法はこれが私が作業バージョンを持ってはるかに柔軟に

+0

病気をチェックする必要があります。これは私の最初のpygameを使用しているので、私はそれらの存在を知らなかった。 – giodamelio

+0

チュートリアルをご覧ください。あなたが望むものを達成するためのさまざまな方法がありますが、ここに別のものがあります:[link](http://www.penzilla.net/tutorials/python/pygame/)。この場合、表示するオブジェクトには独自のdraw()メソッドがありますが、これはおそらく小規模なプロジェクトでは簡単ですが、維持するのが難しくなる可能性があります。 – CGGJE