Как сделать полупрозрачные спрайты в пигаме - PullRequest
4 голосов
/ 08 августа 2009

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

Ответы [ 4 ]

3 голосов
/ 08 августа 2009

После загрузки изображения вам нужно будет включить альфа-канал на Surface. это будет выглядеть примерно так:

background = pygame.Display.set_mode()
myimage = pygame.image.load("path/to/image.bmp").convert_alpha(background)

Это загрузит изображение и немедленно преобразует его в формат пикселей, подходящий для альфа-смешивания на поверхности дисплея. Вы можете использовать какую-то другую поверхность, если вам нужно перевести в другой, внеэкранный буфер в другом формате.

Вы можете установить альфа на пиксель достаточно просто, скажем, у вас есть функция, которая принимает 3-кортеж для значения цвета RGB и возвращает желаемый 4-кратный набор цвета RGBA + альфа, вы можете изменить поверхность на пиксель:

def set_alphas(color):
    if color == (255,255,0): # magenta means clear
        return (0,0,0,0)
    if color == (0,255,255): # cyan means shadow
        return (0,0,0,128)
    r,g,b = color
    return (r,g,b,255) # otherwise use the solid color from the image.

for row in range(myimage.get_height()):
    for col in range(myimage,get_width()):
        myimage.set_at((row, col), set_alphas(myimage.get_at((row, col))[:3]))

Есть и другие, более полезные способы сделать это, но я надеюсь, что это дает вам идею.

2 голосов
/ 10 августа 2009

Возможно, я не был понятен в своем первоначальном вопросе, но, думаю, я понял это самостоятельно. То, что я искал, оказалось методом set_alpha () Поверхности, поэтому все, что мне нужно было сделать, это убедиться, что полупрозрачные изображения были на их собственной поверхности.

Вот пример с моим урезанным кодом:

import pygame, os.path
from pygame.locals import *

class TranslucentSprite(pygame.sprite.Sprite):
  def __init__(self):
    pygame.sprite.Sprite.__init__(self, TranslucentSprite.container)
    self.image = pygame.image.load(os.path.join('data', 'image.bmp'))
    self.image = self.image.convert()
    self.image.set_colorkey(-1, RLEACCEL)
    self.rect = self.image.get_rect()
    self.rect.center = (320,240)

def main():
  pygame.init()
  screen = pygame.display.set_mode((640,480))
  background = pygame.Surface(screen.get_size())
  background = background.convert()
  background.fill((250,250,250))
  clock = pygame.time.Clock()
  transgroups = pygame.sprite.Group()
  TranslucentSprite.container = transgroups

  """Here's the Translucency Code"""
  transsurface = pygame.display.set_mode(screen.get_size())
  transsurface = transsurface.convert(screen)
  transsurface.fill((255,0,255))
  transsurface.set_colorkey((255,0,255))
  transsurface.set_alpha(50)

  TranslucentSprite()
  while 1:
    clock.tick(60)
    for event in pygame.event.get():
      if event.type == QUIT:
        return
      elif event.type == KEYDOWN and event.key == K_ESCAPE:
        return
    transgroups.draw(transsurface)
    screen.blit(background,(0,0))
    screen.blit(transsurface,(0,0))
    pygame.display.flip()

if __name__ == '__main__' : main()

Это лучшая техника? Вроде бы самый простой и понятный.

2 голосов
/ 08 августа 2009

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

например:

color = image.get_at((0,0)) #we get the color of the upper-left corner pixel
image.set_colorkey(color)
1 голос
/ 08 августа 2009

Вы могли бы рассмотреть возможность использования изображений PNG, где вы можете сделать любой вид прозрачности, который вы хотите прямо в изображении.

...