簡體   English   中英

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM