如何移动一个Pygame对象并将其擦除到以前的位置?

时间:2019-05-19 19:38:51

标签: python oop pygame game-development

我正在尝试开发一个游戏,该游戏涉及一个由箭头键控制的小的红色玩家(矩形)。在黑色背景上有一个白色网格,两个不同颜色的物镜(矩形),以及几个随机的红色框(矩形)。

我需要帮助的部分是移动小型红色播放器。我可以移动它,但是它似乎可以将自己绘制在新位置,但是先前绘制的矩形的版本会保留在那里,形成一条线。我希望整个矩形都移动,而不希望留下任何痕迹/以前的版本。

根据其他帖子,我听说做到这一点的唯一方法是用背景色(在本例中为黑色)填充屏幕并在其顶部重新绘制玩家。但是,这对于我来说确实很难,因为我随机放置了红色框和目标,因此,每次我再次绘制它们时,它们都将绘制一个新的随机位置,而不是原来的位置。我希望红色框和目标保持在同一位置,但让播放器矩形移动(基本上是删除自己的旧版本)。

这是我当前拥有的代码(我已经排除了基本知识,例如定义颜色,导入和设置屏幕高度/宽度):

p1_velocity_x = 0
p1_velocity_y = 0
p2_velocity_x = 0
p2_velocity_y = 0


def grid():
    for col in range(0, screen_width - 100, 10):
        for row in range(0, screen_height, 10):
            screen.set_at((row, col), white)


def red_boxes():
    for i in range(100):
        pygame.draw.rect(screen, red, (randrange(1, 1200), randrange(1, 470), 25, 25))


def blue_score_box():
    pygame.draw.rect(screen, blue, (randrange(1, 1200), randrange(1, 470), 25, 25))


def yellow_score_box():
    pygame.draw.rect(screen, yellow, (randrange(1, 1200), randrange(1, 470), 25, 25))


class Player:
    color = (0, 0, 0)

    def __init__(self, color):
        self.x = 0
        self.y = 0
        self.color = color


p1 = Player(red)
p1.x = randrange(1, 1200, 10)
p1.y = randrange(1, 470, 10)

p2 = Player(yellow)
p2.x = randrange(1, 1200, 10)
p2.y = randrange(1, 470, 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                p1.x += 10

    screen.fill(black)
    grid()
    red_boxes()
    yellow_score_box()
    blue_score_box()

    pygame.draw.rect(screen, p1.color, (p1.x, p1.y, 10, 10))
    pygame.draw.rect(screen, p2.color, (p2.x, p2.y, 10, 10))

    pygame.display.update()

以上代码的结果是我可以根据需要移动红色矩形,但是由于我在while循环中调用了red_boxes(),yellow_score_box()和blue_score_box()方法,因此它们会继续调用无限期地,几乎每秒都在屏幕上绘制随机的红色,蓝色和黄色矩形。我希望他们留在一个地方,同时具有像现在一样移动播放器的功能。

1 个答案:

答案 0 :(得分:0)

创建一个尺寸与红色播放器矩形相同的pygame.Surface

bkP1 = pygame.Surface((10, 10))

在绘制播放器之前备份背景(pygame.Surface.blit)并存储播放器的位置:

prevPos = (p1.x, p1.y)
bkP1.blit(screen, (0, 0), (*prevPos, 10, 10))

当必须删除播放器时,在播放器顶部绘制背景:

screen.blit(bkP1, prevPos)

该过程可能如下工作:

prevPos = None
bkP1 = pygame.Surface((10, 10))

while True:

    # [...]

    if prevPos:
        screen.blit(bkP1, prevPos)
    prevPos = (p1.x, p1.y)
    bkP1.blit(screen, (0, 0), (*prevPos, 10, 10))
    pygame.draw.rect(screen, p1.color, (p1.x, p1.y, 10, 10))

当然可以将机制添加到类Player中:

class Player:

    def __init__(self, color):
        self.x = 0
        self.y = 0
        self.color = color
        self. prevPos = None
        self.bk = pygame.Surface((10, 10))

    def draw(self, screen):
        if self.prevPos:
            screen.blit(self.bk, self.prevPos)
        self.prevPos = (self.x, self.y)
        self.bk.blit(screen, (0, 0), (*self.prevPos, 10, 10))
        pygame.draw.rect(screen, self.color, (self.x, self.y, 10, 10))

while True:

    # [...]

    p1.draw(screen)