Pygame: можно ли читать цвета из переменной класса в функции pygame.draw.rect? - PullRequest
1 голос
/ 23 мая 2019

Я хотел бы знать, возможно ли использовать функцию pygame.draw.rect() в Pygame с переменной цвета в классе.

Это мой код с подробными объяснениями под него: (обратите внимание, что я 'мы возьмем только полезную часть)

# consider pygame as 'pg' as I set with
# the line 'import pygame as pg'

class icon:
    def __init__(self, picture, position, key):
        self.icon = picture
        self.position = position
        self.p_x, self.p_y = position
        self.size = 50
        self.unlocked = False
        self.key = key
        self.status = 'off'
        self.pulse_value = 0
        self.pulse = 'down'
        self.pulse_type = 'red'
        self.c_icon = self.icon.get_rect()
        self.c_icon.center = ( (self.p_x + 25), (self.p_y + 25))

    def unlock(self):
        self.unlocked = True
        self.status = 'pulse'
        self.pulse_type = 'grey'

    def draw(self):
        if self.unlocked == True :
            if self.status == 'off':
                pg.draw.rect(screen, color_passive, (*self.position, 50, 48))

            elif self.status == 'on':
                pg.draw.rect(screen, color_active, (*self.position, 50, 55))

            elif self.status == 'pulse':
                if self.pulse == 'down' :
                    self.pulse_value = self.pulse_value + 1
                    if self.pulse_value == 255 :
                        self.pulse = 'up'

                elif self.pulse == 'up' :
                    self.pulse_value = self.pulse_value - 1
                    if self.pulse == 0 :
                        self.pulse = 'down'

                if self.pulse_type == 'red' :
                    self.color_pulse = (self.pulse_value, 0, 0)
                elif self.pulse_type == 'grey' :
                    self.color_pulse = (self.pulse_value, self.pulse_value, self.pulse_value )
                pg.draw.rect(screen, *self.color_pulse, (*self.position, *self.size))

            screen.blit(self.icon, self.c_icon)

world_2 = pg.image.load('ice_mountains.png').convert_alpha()
icon_1 = icon('world_2', (60, 60), K_1)

Это значок класса, который показывает любые значки вкладок на экране и определяет, разблокирована ли вкладка или нет.

Как видите,Я использую здесь функцию pygame.draw.rect()

Но в этой функции переменная цвета является «переменной класса» ( self.color_pulse).

Переменная self.color_pulse определяется как ( self.pulse_value, self.pulse_value, self.pulse_value) настрока выше.

И self.pulse_value - это переменная класса, которая увеличивается на 5 каждый icon_2.draw() со скоростью 30 раз в секунду.

В основном я использую функцию icon_2.draw() восновной цикл.

    elif exp >= 1000:
        n_unlock = n_unlock + 1
        icon_2.unlock()
        print('world 2 unlocked')

это код для разблокировки значка.В тот момент, когда основной цикл выполняет icon_2.draw() сразу после того, как этот разблокирован, ожидаемый результат заключается в том, что на экране должна появиться иконка, по умолчанию ... импульс, пока пользователь не щелкнет по ней.

НОК сожалению, я получил это:

#----------*={ _MAD_ }=*----------#
        May Avoid Destruction         
             by Edhyjox           
#----------*={ _MAD_ }=*----------#

Loading...
========== Ok

custom setting succesfully imported
Window main not existing, redirect to game

World 2 unlocked
Traceback (most recent call last):
  File "************************/___MAD___/script/MAD - The game.py", line 266, in <module>
    icon_2.draw()
  File "************************/___MAD___/script/MAD - The game.py", line 190, in draw
    pg.draw.rect(screen, *self.color_pulse, (*self.position, *self.size))
TypeError: 'int' object is not iterable

Я не совсем понимаю, почему я получил эту ошибку.Это означает, что я использую 'int' в функции pg.draw.rect(), но в этой точке программы переменная self.color_pulse равна (5, 5, 5).

И, похоже, она работает для переменной, котораяне в классе ... У кого-нибудь есть подсказка по проблеме?

1 Ответ

1 голос
/ 23 мая 2019

2-й параметр pygame.draw.rect() должен быть цветом. В PyGame цвет может быть кортежем из 3 целых значений.
Поэтому оператор * (оператор распаковки) является излишним.

Обратите внимание, что

self.color_pulse = (self.pulse_value, 0, 0)
pg.draw.rect(screen, *self.color_pulse, (*self.position, *self.size))

совпадает с

pg.draw.rect(screen, self.color_pulse, 0, 0, (*self.position, *self.size))

Учтите, что self.pulse_value инициализируется 0 в конструкторе.

self.pulse_value = 0

Если self.pulse_type не является ни 'red', ни 'grey', то *self.color_pulse все равно не будет работать и приведет к ошибке.


Далее 3-й параметр должен быть прямоугольником. Прямоугольник - это кортеж из 4 значений, но self.size - это одно целое значение.

self.size = 50

Итак, *self.size приводит к ошибке.


Пропустить оператор * до self.color_puls и изменить *self.size на self.size, self.size:

pg.draw.rect(screen, self.color_pulse, (*self.position, self.size, self.size))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...