Невозможно правильно использовать pygame.PixelArray

Я пытаюсь создать попиксельную систему 2D-освещения, но постоянно получаю странную ошибку. Вот мой код с пояснениями по пути:

import pygame, sys, math

white = (255, 255, 255)
black = (0, 0, 0)

screen_width = 640
screen_height = 480

pygame.init()
pygame.display.set_caption("Light sources")
screen = pygame.display.set_mode([screen_width, screen_height])
clock = pygame.time.Clock()

Это обычные строки настройки для любой игры pygame.

darkness = pygame.image.load("grafiikka/pimeys.png")
darkness.set_alpha(254)

lights_list = [] ### For controlling all light sources at a time

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

class lightsource: ### The parameters for a light
    def ___init___(self, loc, ang, direction, radius):
        self.loc = loc
        self.ang = ang
        self.dir = direction
        self.radius = radius

Я делаю класс источника света

def LightDraw(): ### Drawing the lights, pixel per pixel
    for v in lights_list:
        for i in range (int((v.dir - v.ang/2)), int((v.dir + v.ang/2))):
            for l in range (0, v.radius):
                if int(i) < 90 and int(i) >= 0:
                    x = (v.loc[0]) + int(-l * math.cos(math.radians(i)))
                    y = (v.loc[1]) + int(-l * math.sin(math.radians(i)))
                elif i < 180 and i >= 90:
                    x = (v.loc[0]) + int(l * math.cos(math.pi - math.radians(i)))
                    y = (v.loc[1]) + int(-l * math.sin(math.pi - math.radians(i)))
                elif i < 270 and i >= 180:
                    x = (v.loc[0]) + int(l * math.sin(1.5 * math.pi - math.radians(i)))
                    y = (v.loc[1]) + int(l * math.cos(1.5 * math.pi - math.radians(i)))
                elif i < 360 and i >= 270:
                    x = (v.loc[0]) + int(-l * math.cos(2 * math.pi - math.radians(i)))
                    y = (v.loc[1]) + int(l * math.sin(2 * math.pi - math.radians(i)))
                alpha = int(254 * (l / v.radius))
                print(int(254 * (l / v.radius)))
                pygame.TempPimeys[x, y] = pygame.Color.a(alpha) ### THIS CAUSES ERROR

    return TempPimeys.make_surface()

### Adding a test light source at (300, 200) on screen    
testValo = lightsource()
testValo.___init___((300,200), 360, 90, 100)
lights_list.append(testValo)

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

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    myOtherImage_rect.topleft = pygame.mouse.get_pos()

    screen.fill(white)
    TempPimeys = pygame.PixelArray(pimeys)
    hämärä = LightDraw()
    screen.unlock()
    screen.blit(hämärä, (0, 0))
    pygame.display.update()

И общий шлейф.

Ошибка, которую я получаю: TypeError: объект getset_descriptor не вызывается


person Benkku    schedule 10.07.2013    source источник
comment
Можете ли вы сказать мне номер строки, которую дает ошибка, и привести весь код без разрывов?   -  person ThisIsAQuestion    schedule 11.07.2013


Ответы (1)


pygame.TempPimeys[x, y] = pyame.Color.a(alpha) ### THIS CAUSES ERROR

# same as
>>> pygame.Color.a(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'getset_descriptor' object is not callable

Вы вызываете a как метод класса pygame.Color.a(), когда он ожидает быть экземпляром. Бывший:

>>> pygame.Color('red')
(255, 0, 0, 255)
>>> c = pygame.Color('red')
>>> c.a
255
>>> c.a = 20

Если причина в том, что вы хотите изменить только альфа, а не RGB, вы можете использовать pygame.surfarray.pixels_alpha

person ninMonkey    schedule 10.07.2013
comment
Спасибо за участие, я считаю, что это правильный путь. Однако для использования surfarray требуется numpy, и я не могу заставить его работать. Любой установщик, который я пытаюсь запустить, просто падает или после установки я не могу его импортировать. - person Benkku; 11.07.2013
comment
Используя ваш метод, я получил этот код: TempPimeys = pygame.surfarray.pixels_alpha(pimeys), и это вызывает ошибку в numpy: ValueError: неподдерживаемые цветовые маски для массива ссылок альфа Что-то не так с моим изображением? Это обычный формат .png, с этим проблем быть не должно. - person Benkku; 11.07.2013
comment
Можете ли вы вставить полный код в корзину для вставки, чтобы я мог попробовать его запустить? Чтобы установить numpy, убедитесь, что вы соответствуете версии Python и той же 32/64-битной версии, которую вы использовали для установки Python. Я использую 32, чтобы упростить установку пакетов, хотя ОС 64-битная. - person ninMonkey; 12.07.2013
comment
Мой python и numpy оба 32-битные, так что этого быть не должно. Что вы имеете в виду под pastebin? Весь мой код находится в первом сообщении, только с некоторыми пояснениями между сегментами. - person Benkku; 12.07.2013