سؤال

لقد بدأت للتو العمل مع Pygame وأنا أحاول إنشاء Sprite شبه شفافة، وملف مصدر Sprite هو ملف صورة نقطية غير شفافة محملة من القرص. لا أريد تحرير صورة المصدر إذا كان بإمكاني مساعدته. أنا متأكد من أن هناك طريقة للقيام بذلك مع رمز Pygame، ولكن Google ليست مساعدة بالنسبة لي.

هل كانت مفيدة؟

المحلول 3

ربما لم أكن واضحا في سؤالي الأصلي، لكنني أعتقد أنني أحسبها بمفردي. ما كنت أبحث عنه يتحول إلى أسلوب 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()

هل هذه هي أفضل تقنية؟ يبدو أنه الأكثر بساطة ومباشرة.

نصائح أخرى

بعد تحميل الصورة، ستحتاج إلى تمكين قناة ألفا على Surface. وبعد هذا سيبدو قليلا مثل هذا:

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

سيؤدي ذلك إلى تحميل هذه الصورة وتحويله على الفور إلى تنسيق Pixel مناسب لمزج ألفا على سطح العرض. يمكنك استخدام بعض السطح الآخر إذا كنت بحاجة إلى الاستزج إلى بعض المخزن المؤقت لشاشة أخرى بتنسيق آخر.

يمكنك تعيين ألفا لكل بكسل ببساطة بما فيه الكفاية، ويقول إن لديك وظيفة تستغرق ثلاثية ثلاثية قيمة لون RGB وإرجاع بعض الربع الرابع المرغوب فيه من اللون 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]))

هناك طرق أخرى أكثر فائدة للقيام بذلك، ولكن هذا يمنحك الفكرة، آمل.

إذا كانت صورتك تحتوي على خلفية ملونة صلبة تريدها أن تصبح شفافة يمكنك ضبطها مفتاح اللون القيمة، وسوف تجعل Pygame شفافة عند تخفيف الصورة.

على سبيل المثال:

color = image.get_at((0,0)) #we get the color of the upper-left corner pixel
image.set_colorkey(color)

قد تفكر في التحول إلى استخدام صور PNG حيث يمكنك القيام بأي نوع من الشفافية التي تريدها مباشرة في الصورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top