Pygame "set_at" для объектов "pygame.Surface" не применяется к объекту "кортеж" - PullRequest
0 голосов
/ 11 октября 2019

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

У меня есть блок кода, который читаетфайл, который прекрасно работает, но когда я пытаюсь отображать пиксели один за другим, я получаю сообщение об ошибке, в котором говорится, что «дескриптор« set_at »для объектов« pygame.Surface »не применяется к объекту« кортеж »». «Сетка» - это двумерный массив, содержащий данные 0 и 1 из файла.

print("Done processing file, Drawing pixels...")

for i in range(0, height - 2):
    for j in range(0, width - 2):
        if grid[i][j] == 0:
            pygame.Surface.set_at((i, j), "black") #Throws the error
        elif grid[i][j] == 1:
            pygame.Surface.set_at((i, j), "white")

print("Pixels drawn!")

Я пытаюсь использовать значения «i» и «j» для описания «x» и «y» пикселя, который я хочу изменить, но Pygame, похоже, читает это какдругой тип данных, чем я хочу? Я не совсем уверен, почему Pygame не ожидает кортеж для координат (мне кажется, наиболее логичный тип данных для декартовых координат).

Я очень новичок в Pygame, поэтому я надеюсь, что это относительно простая ошибка с легким исправлением. Если вы хотите документы для этой конкретной функции: https://www.pygame.org/docs/ref/surface.html#pygame.Surface.set_at

1 Ответ

1 голос
/ 11 октября 2019

Ваша проблема не (x,y), а pygame.Surface.

Вы должны использовать экземпляр класса pygame.Surface, а не класса pygame.Surface

surface = pygame.Surface((800,600))
surface.set_at((i, j), (255,255,255))

или

screen = pygame.display.set_mode((800,600))
screen.set_at((i, j), (255,255,255))

или

image = pygame.image.load('image.png')
image.set_at((i, j), (255,255,255))

или

font = pygame.font.SysFont(None, 50)
text = font.render("Hello World", True, (255,255,255))
text.set_at((i, j), (255,255,255))

У вас будет другая проблема с цветом. Это должно быть кортеж (R,G,B) - в конечном итоге (R,G,B,A), если вы используете прозрачность (альфа-канал).

Для white это будет (255,255,255), для black это будет (0,0,0).

Чтобы использовать строку с именем, вы должны будете использовать класс pygame.color.Color(name)

screen.set_at((i, j), pygame.color.Color('white'))    

Пример кода:

import pygame

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

#WHITE = pygame.color.Color('white')
WHITE = (255,255,255)

for x in range(100):
    for y in range(100):
        screen.set_at((350+x, 250+y), WHITE)

pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()
...