Рисование поверхности и прозрачность

Я просмотрел в Интернете довольно много руководств, но я не могу нарисовать полупрозрачный красный круг на поверхности.

Я хочу, чтобы этот метод использовался для выделения спрайта полупрозрачным красным кругом:

def highlight(self):
    s = pygame.Surface((self.rect[2]*2,self.rect[3]*2)) #create a surface to draw circle on twice as big as the sprite rectangle)
    s.fill((0,0,0)) #fills the surface with black
    pygame.draw.circle(s, (255,0,0), self.rect.center, self.rect[3], 0) # draws red circle on the surface
    s.set_colorkey((0,0,0)) # makes the black surface background transparent
    s.set_alpha(50) # makes the whole surface translucent (i.e. the red circle remaining)
    variables.screen.blit(s, (self.rect[0]-self.rect[2]/2,self.rect[1]-self.rect[3]/2)) #blit's the red circle centered on my sprite.

Я действительно не знаю, что я делаю неправильно... Я могу получить красный круг, просто используя:

def highlight(self):
    pygame.draw.circle(DISPLAYSURF, (255,0,0), self.rect.center, self.rect[3], 0) # with display surf as my background for the whole game

Но я не могу сделать его прозрачным. Я также не хочу использовать gfxdraw, поскольку он говорит, что он может не поддерживаться в будущих версиях Pygame.

Спасибо за помощь.


person Sorade    schedule 02.05.2016    source источник
comment
Вы используете 24-битные или 32-битные поверхности? в любом случае для прозрачности вам нужна 32-битная поверхность. затем забудьте о цветовом ключе, просто залейте альфа канал черным цветом (полная прозрачность) по кругу. затем заполните альфа-область круга некоторым средним значением.   -  person Mikhail V    schedule 03.05.2016
comment
Кроме того, я хотел бы сказать, что есть достаточно сообщений о том, как использовать colorkey и альфа, и почему вы не смешиваете эти две концепции. Для начала просто создайте простую программу без каких-либо классов и попробуйте минимальные случаи, но сначала решите, какой тип поверхностей вы будете использовать.   -  person Mikhail V    schedule 03.05.2016
comment
Спасибо, Михаил В. Знаете ли вы, как я могу проверить, являются ли мои поверхности 32-битными или 64-битными? Если это поможет, я использую python и pygame в 32-битной версии.   -  person Sorade    schedule 03.05.2016
comment
Под прозрачным вы подразумеваете частично прозрачный?   -  person kmaork    schedule 03.05.2016
comment
Красный круг должен быть частично прозрачным. Фон поверхности должен быть полностью прозрачным.   -  person Sorade    schedule 03.05.2016
comment
извините, я был не точен. Вы можете сделать это так же, как вы это делаете, с цветовой клавишей, а затем установив альфа-значение. На самом деле код кажется правильным. скорее всего вы путаетесь с координатами и просто не видите результата. Как сказано, попробуйте протестировать минимальный код. Кроме того, если вы вызываете свой метод повторно, вы должны инициировать поверхность и цветовую клавишу/альфа только один раз. После этого просто нарисуйте круг, и он должен работать   -  person Mikhail V    schedule 04.05.2016
comment
Итак, в вашем случае вы имеете дело с 24-битной поверхностью по умолчанию, но есть и другой способ сделать вещи прозрачными. Затем вы инициализируете поверхность, например: pygame.Surface((w, h), pygame.SRCALPHA, 32), и рисуете круг цветом (255,0,0,50), где 50 — это альфа. В этом случае вы просто рисуете круг, не используя set_colorkey() или set_alpha().   -  person Mikhail V    schedule 04.05.2016
comment
Также вы можете попробовать добавить функцию рисования круга после установки цветового ключа и альфы.   -  person Mikhail V    schedule 04.05.2016