0

So I'm kinda new at Pygame, and just trying to create easy projects to learn.

I've created a basic rectangle first as player, and I want to implement a system where user clicks to somewhere in screen and game spawns a rectangle at that point. Here's my code:

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

With that code, when I click, a block spawns and disappears immediately. How do I fix this? Thanks for your help.

(Sorry for my bad English)

makifv
  • 27
  • 1
  • 5

1 Answers1

0

The problem is that when the user clicks you draw the rectangle (pygame.draw.rect), update the display (pygame.display.update) and then, after the for loop, you empty the display (screen.fill((0,0,0))). This explains why the rectangle disappears immediately.

Instead of calling pygame.draw.rect each time the user clicks on the screen, you can instead memorise the rectangle and save it into a list. Then you have can draw all rectangles you memorised at each iteration of your main loop.

Here is an implementation of this solution (I have added comments in the code):

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

qouify
  • 3,698
  • 2
  • 15
  • 26