在长方形的Pygame移动的图象用不同的颜色

时间:2017-11-20 19:58:40

标签: python pygame

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

2 个答案:

答案 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。