структура класса Pygame - PullRequest
       5

структура класса Pygame

1 голос
/ 22 декабря 2011

Моя цель - создать модуль, который будет создавать сетку на холсте пигмея и позволять вам выделять поля по их координатам x и y.

Вот простой пример использования.

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 до тех пор, пока цикл не будет завершен (нажата кнопка выхода).

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Я думаю, что вам нужно отключить класс Grid от его отображения.Вы можете заставить его генерировать поверхности, которые будут выводиться на экран Surface основным игровым циклом.Ваши init , highlight_cell и clear_grid методы могут, например, возвращать Surfaces или создавать метод get_surface, который будет вызываться один раз в каждом игровом цикле

Это даст гораздо большую гибкость

1 голос
/ 22 декабря 2011

Для начала я бы не стал помещать игровой цикл в функцию инициализации; найти другое место для этого. Чтобы решить эту проблему, просто поместите код, который вы хотите выполнить в игровой цикл, рядом с кодом для обработки событий:

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 голосов
/ 23 декабря 2011

Я получил рабочую версию с многопроцессорной библиотекой и конвейерами. Кажется, это немного неуместно, но это будет работать для этого проекта.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...