Pygame Python 中的矩形绘图问题

Rectangle drawing issue in Pygame Python

所以我在 Pygame 有点新,只是想创建简单的项目来学习。

我首先作为玩家创建了一个基本的矩形,我想实现一个系统,用户点击屏幕中的某处,游戏会在该点生成一个矩形。这是我的代码:

import pygame
import sys
from pygame import *
from pygame.mouse import get_pos
pygame.init()

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption("Touch To Create Blocks!")

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((50,50))
        self.surf.fill((220,120,37))
        self.rect = self.surf.get_rect()

    def update(self,pressed_keys):
        if pressed_keys[pygame.K_UP]:
            self.rect.move_ip(0,-5)
        elif pressed_keys[pygame.K_DOWN]:
            self.rect.move_ip(0,5)
        elif pressed_keys[pygame.K_LEFT]:
            self.rect.move_ip(-5,0)
        elif pressed_keys[pygame.K_RIGHT]:
            self.rect.move_ip(5,0)

        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        elif self.rect.top <= 0:
            self.rect.top = 0
        elif self.rect.top >= SCREEN_HEIGHT - 50:
            self.rect.bottom = SCREEN_HEIGHT

player = Player()

run = True
while run:
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                run = False
                sys.exit()
        elif event.type == MOUSEBUTTONDOWN:
            mouse_x, mouse_y = pygame.mouse.get_pos()
            rectangle = pygame.Rect(mouse_x, mouse_y, 40, 40)
            pygame.draw.rect(screen, (255,255,255) , rectangle)
            pygame.display.update()
            
    screen.fill((0,0,0))
    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    screen.blit(player.surf,player.rect)
    pygame.display.update()

使用该代码,当我单击时,一个方块会立即生成并消失。我该如何解决?感谢您的帮助。

(抱歉我的英语不好)

问题是当用户点击你绘制的矩形 (pygame.draw.rect),更新显示 (pygame.display.update) 和 然后,在 for 循环之后,清空显示 (screen.fill((0,0,0)))。这解释了为什么矩形消失了 立即。

而不是每次用户点击时调用 pygame.draw.rect 屏幕,您可以改为记住矩形并将其保存到 列表。然后你可以画出你记住的所有矩形 主循环的迭代。

这是这个解决方案的一个实现(我在 代码):

import pygame
import sys
from pygame import *
from pygame.mouse import get_pos
pygame.init()

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption("Touch To Create Blocks!")

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((50,50))
        self.surf.fill((220,120,37))
        self.rect = self.surf.get_rect()

    def update(self,pressed_keys):
        if pressed_keys[pygame.K_UP]:
            self.rect.move_ip(0,-5)
        elif pressed_keys[pygame.K_DOWN]:
            self.rect.move_ip(0,5)
        elif pressed_keys[pygame.K_LEFT]:
            self.rect.move_ip(-5,0)
        elif pressed_keys[pygame.K_RIGHT]:
            self.rect.move_ip(5,0)

        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        elif self.rect.top <= 0:
            self.rect.top = 0
        elif self.rect.top >= SCREEN_HEIGHT - 50:
            self.rect.bottom = SCREEN_HEIGHT

player = Player()

run = True
rectangles = list()  # list of the rectangles we have to draw
while run:
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                run = False
                sys.exit()
        elif event.type == MOUSEBUTTONDOWN:
            # add a new rectangle to our list of rectangles
            mouse_x, mouse_y = pygame.mouse.get_pos()
            rectangles.append(pygame.Rect(mouse_x, mouse_y, 40, 40))
            
    screen.fill((0,0,0))
    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    screen.blit(player.surf,player.rect)

    #  draw all the rectangles we memorised
    for rectangle in rectangles:
        pygame.draw.rect(screen, (255,255,255) , rectangle)
    pygame.display.update()