Как получить пиксельный цвет вне экрана в Pygame? - PullRequest
0 голосов
/ 21 сентября 2018

Я знаю, что для получения цвета пикселей в Pygame я использую get_at.Но мне нужно получить пиксель, который за пределами моего экрана, т. Е. У меня уже есть изображение с бликами и видимой частью.

Например, изображение 1000x1000 на экране 500 500 будет иметь только 50% видимого, остальное будет «выключено» на экране.Поэтому мне нужно получить доступ к части за пределами экрана.

Но если я ссылаюсь на get_at с координатой, большей или меньшей, чем размеры экрана, Pygame останавливается с ошибкой:

IndexError: индекс пикселей вне диапазона

import pygame
W = 1600
H = 600
pygame.init()
screen = pygame.display.set_mode([W, H])
image = pygame.image.load('huge_background.png').convert_alpha()
screen.blit(image, [-5000, -420])
pygame.display.update()
screen.get_at([100, -5]) # generates "IndexError: pixel index out of range"

Как получить цвет пикселя фонового изображения за пределами размеров экрана?


Вот видимый в настоящее время экран пигмея (1600 x 600).3 строки (пурпурные) - это «детекторы» столкновения:

enter image description here

А вот фон, который будет прокручиваться (8000 x 8000):

enter image description here

Итак, вот идея сценария: enter image description here

Итак, линии детектора столкновенийможет превышать пределы экрана Pygame, но для обнаружения столкновения необходимо «прочитать» внешние пиксели.

1 Ответ

0 голосов
/ 26 сентября 2018

Вот автономный пример, который отслеживает положение вида / камеры на более крупном фоне.

import pygame
W = 600
H = 400
pygame.init()
# generate repeated KEYDOWN events when a key is held
pygame.key.set_repeat(500, 50)  
screen = pygame.display.set_mode([W, H])

# image = pygame.image.load('huge_bkgnd.png').convert_alpha()

#create a large bkgnd image
bkgnd = pygame.Surface((W*10, H*10))
# draw a rainbow on the bkgnd surface
colours = ["red", "orange", "yellow", "green", "lightblue1", "blue", "purple"]
bar_width = bkgnd.get_width() // (10 * len(colours))
for x in range(0, bkgnd.get_width() // bar_width):
    rect = [x*bar_width, 0, bar_width, bkgnd.get_height()]
    bkgnd.fill(pygame.Color(colours[x % len(colours)]), rect)

position = [0, 0]
clock = pygame.time.Clock() #for limiting FPS
finished = False
while not finished:
    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                finished = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    position[0] -= 100
                if event.key == pygame.K_RIGHT:
                    position[0] += 100
                if event.key == pygame.K_UP:
                    position[1] -= 100
                if event.key == pygame.K_DOWN:
                    position[1] += 100
                # for all key movement clamp position to size of background
                position[0] = max(0, min(position[0], bkgnd.get_width() - W))
                position[1] = max(0, min(position[1], bkgnd.get_height() - H))
                try:
                    x = position[0] + W*2  # just look at what's to the right
                    y = position[1]
                    print(f"At {position}: Heading for ({x},{y}) {bkgnd.get_at((x, y))}")
                except IndexError:
                    print(f"Heading for the edge! {bkgnd.get_width() - position[0]} to go!")
    # copy bkgnd to screen
    view_rect = (*position, W, H)
    screen.blit(bkgnd.subsurface(view_rect), (0,0))
    # update the screen
    pygame.display.update()
    clock.tick(60)  # limit FPS
pygame.quit()

В начале игнорируйте бит хаки, чтобы создать фоновое изображение радуги, чтобы горизонтальное движение былоочевидно.

Программа перемещает позицию на основе нажатия клавиш со стрелками.Использование pygame.key.set_repeat() позволяет удерживать клавиши со стрелками.

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

После обработки событий на экран выводится участок фона на основе текущей позиции.

Дайте мне знатьесли вам нужны какие-либо разъяснения.

...