Pygame,移动一个矩形并删除先前位置的旧矩形

时间:2017-03-21 18:24:05

标签: python while-loop pygame draw rect

我正在编写此代码,因为我想使用箭头键移动矩形。 它可以工作,但是循环周期不会移动矩形,而是每次都会创建一个新的矩形。结果就像一个轨迹。您可以在图片中看到它:the result of the code after some key pressure

这里是我写的代码:

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的一些原则,但说实话,我不知道哪一个。

2 个答案:

答案 0 :(得分:1)

它完全按照你的要求去做:每次都画一个新的矩形。计算机这样令人沮丧。您使用绘制而不是移动对象。

要解决此问题,您有两种基本选择:

  1. 在每次迭代中,首先用与背景匹配的矩形(黑色)擦除前一个矩形。 然后绘制新的矩形。
  2. 使用可移动物体(例如精灵),并使用移动方法更新游戏,而不是重绘。如果您搜索StackOverflow或互联网上的" pygame move object"您可能会找到很多可以为此目的而适应的代码。

答案 1 :(得分:1)

每次运行循环时,都会绘制旧屏幕的图像。因此,在您的情况下,您在前面的矩形顶部绘制矩形。您需要清除上一次循环迭代中的内容。最简单的方法是用单一颜色或图像填充屏幕:

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