Питання Намалюйте прозорий прямокутник у пігеймі


Як я можу зробити прямокутник, який має колір з альфа? Я маю:

windowSurface = pygame.display.set_mode((1000, 750), pygame.DOUBLEBUF)
pygame.draw.rect(windowSurface, pygame.Color(255, 255, 255, 128), pygame.Rect(0, 0, 1000, 750))

Але я хочу, щоб білий прямокутник був прозорим на 50%, але альфа-значення не працювало.


23
2018-06-14 04:28


походження


Вам потрібно додати більше коду, оскільки вищенаведена лінія виглядає добре. Існує щось неправильно з ініціалізацією вікна, так що він не підтримує альфа, або ж ви насправді малюєте ректимну кілька разів без очищення екрана, так що рект з'являється непрозорим. - shang
Вам потрібна також pygame.init? - John Stimac
Хм, оскільки ви не чітко вказали глибину біт, ви можете спробувати windowSurface = pygame.display.set_mode((1000, 750), pygame.DOUBLEBUF, 32). Тільки 32-бітні поверхні підтримують альфа-канал. - shang
Ні, це не спрацювало. - John Stimac
Потрібно додати ще більше коду. Чи можете ви опублікувати основний цикл, де ви робите малюнок? - shang


Відповіді:


pygame.draw функції не будуть малювати з альфа. У документації сказано:

Більшість аргументів приймає колірний арґумент, який є RGB-триплетом. Вони також можуть приймати чотирикратну RGBA. Альфа-значення буде записано безпосередньо на поверхню, якщо воно містить пиксельні альфа, але функція draw не прориватиметься.

Те, що ви можете зробити, це створити другу поверхню, а потім прикріпити її до екрана. Прикріплення буде робити альфа-змішування та кольорові клавіші. Також ви можете вказати альфа на рівні поверхні (швидше і менше пам'яті) або на рівні пікселів (повільніше, але точніше). Ви можете зробити це:

s = pygame.Surface((1000,750))  # the size of your rect
s.set_alpha(128)                # alpha level
s.fill((255,255,255))           # this fills the entire surface
windowSurface.blit(s, (0,0))    # (0,0) are the top-left coordinates

або

s = pygame.Surface((1000,750), pygame.SRCALPHA)   # per-pixel alpha
s.fill((255,255,255,128))                         # notice the alpha value in the color
windowSurface.blit(s, (0,0))

У першому випадку майте на увазі, що все, що ви малюєте s буде знято з зазначенням альфа-значення. Отже, якщо ви використовуєте це для накладання елементів накладання, наприклад, вам, можливо, буде краще використати другу альтернативу.

Крім того, розгляньте можливість використання pygame.HWSURFACE для створення поверхневої апаратної прискореної версії.

Перевірте Поверхові документи на сайті pygame, особливо інтро.


38
2018-06-14 21:11





Ви можете додати четверте значення до свого кольорового кортежу, щоб представляти альфа:

pygame.draw.rect(windowSurface, (255, 255, 255, 127), pygame.Rect(0, 0, 1000, 750))

-7
2018-06-14 04:32



Що не працює. - John Stimac
Все ще не працює - John Stimac
Чи можете ви опублікувати скріншот того, що ви бачите? - yan
Білий наповнює весь вікно, але перед заповненням він був чорним. - John Stimac
Ніякого злочину, але я вважаю, що ця відповідь абсолютно неправильна. IIRC, функції pygame's draw не використовують альфа-канал. - Billy S