我是python和pygame的新手,我正试图将图像移到绘制的矩形上,颜色不断变化。每当我运行此代码时,图像会移动,但会创建图像轨迹。
我知道我需要在游戏循环中对图像的背景进行blit,但如果背景不是图像,我该如何对背景进行blit?
或者我是否需要以不同的方式绘制矩形?
完整代码:
import pygame
pygame.init()
screen = pygame.display.set_mode((600,200))
pygame.draw.rect(screen, (175,171,171), [0, 0, 600, 200])
pygame.draw.rect(screen, (255,192,0), [200, 0, 200, 200])
clock = pygame.time.Clock()
# load your own image here (preferably not wider than 30px)
truck = pygame.image.load('your_image.png').convert_alpha()
class Truck:
def __init__(self, image, x, y, speed):
self.speed = speed
self.image = image
self.pos = image.get_rect().move(x, y)
def move(self):
self.pos = self.pos.move(self.speed, 0)
def game_loop():
newTruck = Truck(truck, 0, 50, 1)
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
newTruck.move()
screen.blit(newTruck.image, newTruck.pos)
clock.tick(60)
pygame.display.update()
game_loop()
答案 0 :(得分:2)
每次更新时,您都必须以某种方式重绘背景中的所有对象(矩形)。
最简单的方法是在更新前景对象之前再次调用所有绘图代码。另一种方法是,如果背景在创建后没有改变,则将这些背景对象blit到一个单独的Surface对象中,并在每次更新时将该对象blit到屏幕上。
更复杂的方法是在绘制前景之前保存前景对象下的背景,然后在下次重绘时,首先重绘背景,然后再次保存背景并在新位置上绘制前景对象。做以前的方法之一更容易。
您的代码可以这样写:
hero.addEventListener(Event.ENTER_FRAME, testCollision2);
答案 1 :(得分:0)
你可以将绘制你的rects的两行移动到while while循环中:
def game_loop():
newTruck = Truck(truck, 0, 50, 1)
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
newTruck.move()
# Draw the background items first, then the foreground images.
# If the rects don't cover the whole screen, you can use
# `screen.fill(some_color)` to clear it.
pygame.draw.rect(screen, (175,171,171), [0, 0, 600, 200])
pygame.draw.rect(screen, (255,192,0), [200, 0, 200, 200])
screen.blit(newTruck.image, newTruck.pos)
clock.tick(60)
pygame.display.update()
如果背景应该是静态的,你也可以将一次渲染到背景表面上,然后将这个冲浪按照jsbueno建议的那样在主循环中的screen
上进行blit。