当前位置: 首页 > 知识库问答 >
问题:

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

徐洛华
2023-03-14

我试图建立一个游戏,包括一个红色的小玩家(矩形)被箭头键控制。黑色背景上有一个白色网格,两个不同颜色的目标(矩形)和几个随机的红色框(矩形)。

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

根据其他一些帖子,我听说唯一的方法是用背景色(在本例中为黑色)填充屏幕,并在屏幕上方重新绘制玩家;然而,在我的例子中,这真的很难,因为我随机放置了红色框和目标,所以每次我再次绘制它们时,它们都会在一个新的随机位置绘制,而不是在原来的位置。我希望红色框和目标保持在相同的位置,但让玩家矩形移动(同时基本上删除它们的旧版本)。

以下是我目前拥有的代码(我已经排除了一些基本内容,如定义颜色、导入和设置屏幕高度/宽度):

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

上面代码的结果是,我可以随心所欲地移动红色矩形,但是因为我在同时循环中调用red_boxes()、yellow_score_box()和blue_score_box()方法,它们会无限期地调用,绘制随机的红色、蓝色和黄色矩形几乎每秒钟都在屏幕上。我希望他们呆在一个地方,同时像我现在这样拥有移动玩家的功能。

共有1个答案

越嘉石
2023-03-14

创建一个pyplay。与红色播放器矩形大小相同的Surface:

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

备份后台(pyplay.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) 
 类似资料:
  • 假设我有一个Hashmap对象myMap,它包含一组键和值, 假设我总共有30把钥匙。 现在我得到了一个键列表:

  • 问题内容: 当我尝试对具有足够大数字的范围进行绘图时,我得到了所有刻度线都相对移动的轴。例如: 我在横坐标轴上得到了这些刻度: 问题是如何删除并获取: 问题答案: 这将抓取,获取x轴axis对象,然后获取主对象,并将设置为false(doc)。 在matplotlib的较新版本(1.4+)中,可以通过 更改默认行为。

  • 问题内容: 我正在使用Google GSON将Java对象转换为JSON。 目前,我具有以下结构: 当前,对象在对象内部。我想跳过对象并将对象移动到对象,如下所示: 如何使用GSON做到这一点? 编辑:我试图使用TypeAdapter来修改Step.class,但是在写入方法中,我无法将我的工时对象添加到JsonWriter中。 问题答案: 您可以通过编写代码,然后为注册一个自定义的序列化器,并确

  • 我有以下型号: 当我运行下面的查询时,用户模型也被删除 有没有办法在不删除用户的情况下删除问题? 我试着重复这些问题但没有用 我认为查询集是懒惰的,所以也许我需要在删除之前评估它,所以我打印了它,但这不起作用。 我知道,将ForeignKey设置为null将为我提供诸如clear和remove之类的方法,但我不想这样做,因为我不希望出现任何孤立的用户问题。 我更新了ForeignKey,如下所示

  • 问题内容: 我想添加子视图并一键删除。这是我的代码: / 添加子视图 / / 删除子视图 / 但是删除它不起作用有人可以帮助我吗?谢谢! 问题答案: 感谢帮助。这是解决方案:我创建了子视图,并添加了一个手势来删除它 更新: 迅捷3+

  • 我试图理解“有效现代C”中关于特殊成员函数生成的第17项,所以我尝试了一些示例,并试图对一些行为进行推理。书中说: ..当我提到移动操作move构造或移动分配一个数据成员或基类时,不能保证实际会发生移动。“Memberwise移动”实际上更像Memberwise移动请求,因为未启用移动的类型(即,对移动操作不提供特殊支持的类型,例如大多数C 98遗留类)将通过其复制操作“移动”。。。此外,不会为任