如何在用户每次单击矩形时为其填充颜色?pygame

Len*_*enn 5 python animation pygame

我知道网上有几个类似的问题,但没有一个真正对我有帮助。我只是想绘制一个网格并为用户提供单击这些网格单元格的选项。每次用户单击时,单元格的颜色/填充应从黑色变为白色。我现在正在做的事情如下:

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()    
Run Code Online (Sandbox Code Playgroud)

该程序正在打印网格。但是,当我单击某个地方时,什么也没有发生。我知道这不是最好的代码,所以我将不胜感激任何建议。

sha*_*lom 3

我稍微改变了代码,它工作正常,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()    

Run Code Online (Sandbox Code Playgroud)

作为建议,我认为你应该为每个单元格使用精灵。例如这样:

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

Run Code Online (Sandbox Code Playgroud)