python - 如何在 PyGame 中滚动背景表面?

标签 python python-2.7 scroll pygame 2d

我正在尝试在基于 pyGame 的随机 map 生成器中设置滚动。但是,我无法弄清楚如何防止显示“涂抹”背景,而不是仅仅滚动背景。我专门为 Stack Overflow 制作了一个 MCV 示例,仅显示彩色方 block 。也有同样的问题。

如何让显示滚动而不弄脏屏幕?

这是 map 生成器在我滚动一下后显示的内容:

enter image description here

MCV 示例:

""" This example just displays colored squares. """

import pygame
import sys


def main():

    pygame.init()

    screen = pygame.display.set_mode((800, 800))

    x_pos = 0
    y_pos = 0
    yellow = (255, 255, 0)
    blue = (0, 0, 255)

    # draw pattern of yellow and blue squares
    for y in range(100):
        for x in range(100):

            if (y + x) % 2 == 0:
                pygame.draw.rect(screen, yellow, (x_pos, y_pos, 50, 50))
            else:
                pygame.draw.rect(screen, blue, (x_pos, y_pos, 50, 50))

            x_pos += 50

        y_pos += 50
        x_pos = 0

    while True:  # <-- the pyGame loop

        event = pygame.event.poll()
        pressed = pygame.key.get_pressed()

        # handle window closing
        if event.type == pygame.QUIT:
            break

        # handle scrolling
        if pressed[pygame.K_UP]:
            screen.scroll(0, 2)
        elif pressed[pygame.K_DOWN]:
            screen.scroll(0, -2)
        elif pressed[pygame.K_LEFT]:
            screen.scroll(2, 0)
        elif pressed[pygame.K_RIGHT]:
            screen.scroll(-2, 0)

        # updates what the window displays
        pygame.display.update()

    pygame.quit()
    sys.exit(0)


if __name__ == "__main__":
    # runs the pyGame loop
    main()

初始 MCVE 图像

enter image description here

滚动后MCVE显示:

enter image description here

最佳答案

pygame.Surface.scroll()没有达到您的预期。它不会无缝滚动表面。请参阅文档:

scroll() Shift the surface image in place

[...] Areas of the surface that are not overwritten retain their original pixel values. [...]

您必须编写自己的滚动函数,将表面移出的部分放置在表面的另一侧。

例如编写 2 个函数(scrollXscrollY),它们可以沿轴滚动:

def scrollX(screenSurf, offsetX):
    width, height = screenSurf.get_size()
    copySurf = screenSurf.copy()
    screenSurf.blit(copySurf, (offsetX, 0))
    if offsetX < 0:
        screenSurf.blit(copySurf, (width + offsetX, 0), (0, 0, -offsetX, height))
    else:
        screenSurf.blit(copySurf, (0, 0), (width - offsetX, 0, offsetX, height))
def scrollY(screenSurf, offsetY):
    width, height = screenSurf.get_size()
    copySurf = screenSurf.copy()
    screenSurf.blit(copySurf, (0, offsetY))
    if offsetY < 0:
        screenSurf.blit(copySurf, (0, height + offsetY), (0, 0, width, -offsetY))
    else:
        screenSurf.blit(copySurf, (0, 0), (0, height - offsetY, width, offsetY))
if pressed[pygame.K_UP]:
    scrollY(screen, 2)
elif pressed[pygame.K_DOWN]:
    scrollY(screen, -2)
elif pressed[pygame.K_LEFT]:
    scrollX(screen, 2)
elif pressed[pygame.K_RIGHT]:
    scrollX(screen, -2)

关于python - 如何在 PyGame 中滚动背景表面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319181/

相关文章:

python - python 中的 Pushover 确认

python - 有什么方法可以用列表理解来转换这个 for 循环?

javascript - 自定义按钮取代浏览器滚动——按住并连续滚动?

javascript - 为多个元素实现滚动进度条

python - 函数不返回任何值 - 尝试在不使用 x 的情况下找到集合中的最大数字

Gale-shapley算法的python实现

python - 如何从 Python GAE 中检索到的谷歌云存储对象访问我的文件

python - 在 python 中运行 len(array) 的时间复杂度?

database - 如何使用Flask SQLALchemy中的“使用历史记录表版本化”。最好有一些代码示例

Python Tkinter Text-Widget 滚动到特定行