2013-07-10 2 views
0

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

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 

я сделать класс LightSource

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() 

И общий цикл.

Ошибки я получаю: Ошибка типа: «getset_descriptor» объект не вызываемая

+0

Можете ли вы сказать мне номер строки ошибки дает и дать цельные код без перерывов? – PygameNerd

ответ

0
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

+0

Спасибо за вход, я считаю, что это правильный путь. Однако использование surfarray требует numpy, и я не могу заставить ИТ работать. Любой установщик, который я пытаюсь запустить, просто сбой или после установки, я не могу его импортировать. – Benkku

+0

Используя свой метод, я получил этот код: TempPimeys = pygame.surfarray.pixels_alpha (pimeys) и это вызывает ошибку в NumPy: ValueError: неподдерживаемые colormasks для альфа эталонного массива Есть ли что-то не так с моим изображением? Это нормальный формат .png, проблем с этим не должно быть. – Benkku

+0

Можете ли вы вставить полный код в контейнер для вставки, чтобы я мог попробовать запустить его? Чтобы установить numpy, убедитесь, что вы соответствуете версии python и той же 32/64-битной версии, которую вы использовали для установки python. Я использую 32, чтобы упростить установку пакетов, даже если ОС 64-разрядная. – ninMonkey

Смежные вопросы