Pygame, 移动一个矩形并移除先前位置的旧矩形
Pygame, move a rectangle and remove the old rectangle in precedent position
我写这段代码是因为我想使用箭头键移动一个矩形。
它有效,但循环周期不会移动矩形,而是每次都会创建一个新矩形。结果就像一条轨迹。你可以在图片中看到它: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的一些原理,但老实说我不知道是哪一个。
它完全按照您的指示进行操作:每次都绘制一个新矩形。计算机以这种方式令人沮丧。您使用 绘制 而不是移动对象。
要解决此问题,您有两个基本选择:
- 在每次迭代中,首先用与背景匹配的矩形(黑色)抹掉前一个矩形。 然后绘制新矩形。
- 使用精灵等可移动物体,并使用 移动 方法更新您的游戏,而不是重新绘制。如果您在 Whosebug 或互联网上搜索 "pygame move object",您可能会找到很多代码,您可以为此目的进行调整。
每次 运行 循环时,您都会在旧屏幕的图像上进行绘制。因此,在您的情况下,您是在之前的矩形之上绘制矩形。您需要清除屏幕上一次循环迭代中的内容。最简单的方法是用单一颜色或图像填充屏幕:
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()
我写这段代码是因为我想使用箭头键移动一个矩形。 它有效,但循环周期不会移动矩形,而是每次都会创建一个新矩形。结果就像一条轨迹。你可以在图片中看到它: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的一些原理,但老实说我不知道是哪一个。
它完全按照您的指示进行操作:每次都绘制一个新矩形。计算机以这种方式令人沮丧。您使用 绘制 而不是移动对象。
要解决此问题,您有两个基本选择:
- 在每次迭代中,首先用与背景匹配的矩形(黑色)抹掉前一个矩形。 然后绘制新矩形。
- 使用精灵等可移动物体,并使用 移动 方法更新您的游戏,而不是重新绘制。如果您在 Whosebug 或互联网上搜索 "pygame move object",您可能会找到很多代码,您可以为此目的进行调整。
每次 运行 循环时,您都会在旧屏幕的图像上进行绘制。因此,在您的情况下,您是在之前的矩形之上绘制矩形。您需要清除屏幕上一次循环迭代中的内容。最简单的方法是用单一颜色或图像填充屏幕:
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()