Как заливать прямоугольник цветом каждый раз, когда пользователь нажимает на него? Pygame - PullRequest
3 голосов
/ 05 августа 2020

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

BLACK = (0, 0, 0)
WHITE = (200, 200, 200)

def drawGrid(h, w, blocksize):
    for x in range(w):
        for y in range(h):
            rect = pygame.Rect(x*blocksize, y*blocksize,
                               blocksize, blocksize)
            pygame.draw.rect(SCREEN, WHITE, rect, 1)


def handle_events():
    col = WHITE

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == MOUSEBUTTONDOWN:
                col = WHITE
                # determine mouse position
                mpos_x, mpos_y = event.pos
                # determine cell number
                coord = mpos_x // blocksize, mpos_y // blocksize

                rect = pygame.Rect(coord[0]*blocksize, coord[1]*blocksize, 
                                    blocksize, blocksize)
                pygame.draw.rect(SCREEN, col, rect, 1)
            pygame.display.update()

def main():

    global SCREEN, CLOCK, blocksize

    w = int( sys.argv[1] )
    h = int( sys.argv[2] )
    blocksize = int( sys.argv[3] )

    pygame.init()
    SCREEN = pygame.display.set_mode((h, w))
    CLOCK = pygame.time.Clock()
    SCREEN.fill(BLACK)
    
    drawGrid(h,w,blocksize)
    handle_events()
    
        


if __name__ == "__main__": 
    main()    

Программа печатает сетку. Однако, когда я где-то щелкаю, ничего не происходит. Я знаю, что это не лучший код, поэтому буду признателен за любое предложение.

1 Ответ

2 голосов
/ 05 августа 2020

Я немного изменил код, и он работал правильно, pygame.draw.rect(SCREEN, col, rect, 1) вы рисуете то же самое и не видите изменений. Вы должны использовать pygame.draw.rect(SCREEN, col, rect):

import pygame
import sys

BLACK = (0, 0, 0)
WHITE = (200, 200, 200)
# WINDOW_HEIGHT = 400
# WINDOW_WIDTH = 400


def drawGrid(h, w, blocksize):
    #blockSize = 20 #Set the size of the grid block
    for x in range(w):
        for y in range(h):
            rect = pygame.Rect(x*blocksize, y*blocksize,
                               blocksize, blocksize)
            pygame.draw.rect(SCREEN, WHITE, rect, 1)


def handle_events():
    #coords_list = []
    col = WHITE

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                col = WHITE
                # determine mouse position
                mpos_x, mpos_y = event.pos
                # determine cell number
                coord = mpos_x // 32, mpos_y // 32

                rect = pygame.Rect(coord[0]*32, coord[1]*32, 
                                    32, 32)
                pygame.draw.rect(SCREEN, col, rect)
                #coords_list.append(coord)

            pygame.display.update()         

    #return coords_list

def main():

    global SCREEN, CLOCK, blocksize



    pygame.init()
    SCREEN = pygame.display.set_mode((480, 640))
    CLOCK = pygame.time.Clock()
    SCREEN.fill(BLACK)
    
    drawGrid(480,640,32)
    handle_events()
    
        


if __name__ == "__main__": 
    main()    

В качестве предложения, я думаю, вы должны использовать спрайт для каждой ячейки. Например так:

class Cell(pygame.sprite.Sprite):
    def __init__(self, sprite_group, x, y, cell_dimension, color=BLACK):
        self.groups = sprite_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.image = pygame.Surface((cell_dimension, cell_dimension))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.x = x * cell_dimension
        self.rect.y = y * cell_dimension
        
        self.clicked = False
    
    def update(self):
        if self.clicked:
            self.image.fill(WHITE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...