Pygame, переместите прямоугольник и удалите старый прямоугольник в предыдущей позиции

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

Вот код, который я написал:

import sys
import pygame

pygame.init()
pygame.display.set_caption('SAGA')
clock=pygame.time.Clock()
FPS=30
#the initial position
POS_X=300
POS_Y=300
ship = pygame.image.load("fighter_0.png")

while True:
    #if cycle for detect the key pressure
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_UP:
                POS_Y=POS_Y-10
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_DOWN:
                POS_Y=POS_Y+10
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_RIGHT:
                POS_X=POS_X+10
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_LEFT:
                POS_X=POS_X-10
    #here i draw the rectangle 
    pygame.draw.rect(screen,(255,255,255),(POS_X,POS_Y,30,30))
    clock.tick(FPS)
    pygame.display.update()
pygame.quit()

Я думаю, что не понимаю некоторых принципов pygame, но, честно говоря, не знаю, какой именно.


person Ziru93    schedule 21.03.2017    source источник


Ответы (2)


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

Чтобы исправить это, у вас есть две основные альтернативы:

  1. На каждой итерации сначала сотрите предыдущий прямоугольник тем, который соответствует фону (черный). Затем нарисуйте новый прямоугольник.
  2. Используйте подвижный объект, например спрайт, и обновите игру с помощью метода move вместо перерисовки. Если вы выполните поиск в StackOverflow или в Интернете по запросу «pygame move object», вы, скорее всего, найдете много кода, который можно адаптировать для этой цели.
person Prune    schedule 21.03.2017

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

import sys
import pygame

# Colours
black = [0, 0, 0]

pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption('SAGA')
clock=pygame.time.Clock()
FPS=30
#the initial position
POS_X=300
POS_Y=300
ship = pygame.image.load("fighter_0.png")

while True:
    #if cycle for detect the key pressure
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_UP:
                POS_Y=POS_Y-10
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_DOWN:
                POS_Y=POS_Y+10
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_RIGHT:
                POS_X=POS_X+10
        if event.type == pygame.KEYDOWN:
            if event.key ==pygame.K_LEFT:
                POS_X=POS_X-10
    #here i draw the rectangle 
    screen.fill(black) # Fill the entire screen with black
    pygame.draw.rect(screen,(255,255,255),(POS_X,POS_Y,30,30))
    clock.tick(FPS)
    pygame.display.update()
pygame.quit()
person Morgoth    schedule 21.03.2017