Как прокрутить поверхность фона в PyGame? - PullRequest
1 голос
/ 24 марта 2019

Я пытаюсь настроить прокрутку в моем генераторе случайных карт на основе pyGame. Тем не менее, я не могу понять, как не допустить «размывания» фона на экране, а не просто прокручивать его. Я сделал пример MCV только для переполнения стека, который отображает только цветные квадраты. У него та же проблема.

Как сделать так, чтобы экран прокручивался без размазывания экрана?

Это то, что отображает генератор карт после небольшого прокручивания:

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

1 Ответ

1 голос
/ 24 марта 2019

pygame.Surface.scroll() не делает то, что вы ожидаете.Она не бесшовная катится поверхность.См. Документацию:

scroll() Сдвиг изображения поверхности на место

[...] Области поверхности, которые не были перезаписаны, сохраняют свои исходные значения пикселей.[...]

Вы должны написать свои собственные scroll функции, которые помещают часть поверхности, которая была смещена, на другую сторону от вашей поверхности,

например, написать 2 функции (scrollX и scrollY), которые могут свернуть вдоль оси:

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)

...