Pygame: как рисовать в не прямоугольной области отсечения

Привет, я хотел бы установить в pygame не прямоугольную область отсечения (в данном случае как символ «P»), где она была бы строго ограничена, где рисовать другие объекты.

Есть ли какой-нибудь вариант?

большое спасибо

2 Solutions collect form web for “Pygame: как рисовать в не прямоугольной области отсечения”

Посмотрим, правильно ли я понял ваш вопрос: вы хотите «разбить» изображение на поверхность, но сделать это через маску, которая позволила бы определенным пикселам источника фактически оказаться на поверхности?

У меня была эта точная проблема, и сначала я подумал, что это возможно только через PIL. Однако после некоторых чтений и экспериментов выясняется, что это можно сделать с помощью довольно неясных «специальных флагов» pygame. Ниже приведена функция, которая, надеюсь, сделает то, что вы хотите.

def blit_mask(source, dest, destpos, mask, maskrect): """ Blit an source image to the dest surface, at destpos, with a mask, using only the maskrect part of the mask. """ tmp = source.copy() tmp.blit(mask, maskrect.topleft, maskrect, special_flags=pygame.BLEND_RGBA_MULT) dest.blit(tmp, destpos, dest.get_rect().clip(maskrect)) 

Маска должна быть белой, если вы хотите, чтобы она была прозрачной и черной в противном случае.

И вот полный код, который blits 2 rects на текст «Hello World!: D». Наслаждаться.

 import pygame, sys, time from pygame.constants import QUIT pygame.init() windowSurface = pygame.display.set_mode((800, 600), 0, 32) pygame.display.set_caption('Hello World!') WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) basicFont = pygame.font.SysFont("Times New Roman", 100) text = basicFont.render('Hello world! :D', True, WHITE) def blit_mask(source, dest, destpos, mask, maskrect): """ Blit an source image to the dest surface, at destpos, with a mask, using only the maskrect part of the mask. """ windowSurface.fill(WHITE) tmp = source.copy() tmp.blit(mask, destpos, maskrect, special_flags=pygame.BLEND_RGBA_MULT) # mask 1 green tmp.blit(red, (destpos[0]+100,0), maskrect, special_flags=pygame.BLEND_RGBA_MULT) # mask 2 red dest.blit(tmp, (0,0), dest.get_rect().clip(maskrect)) pygame.display.update() red = pygame.Surface((200,100)) red.fill(RED) green = pygame.Surface((100,100),0) green.fill(GREEN) for a in range(700): blit_mask(text, windowSurface , (a,0), green, (0,0,800,600)) while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() 
  • Выбор случайного звука Pygame
  • Как разбить изображение на поверхность в pygame, размер которого равен Rectangle
  • Оптимизация использования памяти в numpy
  • Pygame (Python) - TypeError: Аргумент должен быть прямым объектом стиля
  • Как создать клонирование MS Paint с помощью Python и pygame
  • Как подождать некоторое время в pygame?
  • self.rect не найден?
  • Как рисовать таблицу динамического программирования в python
  •  
    Interesting Posts for Van-Lav

    Хорошая совместная фильтрация / сопоставление / библиотека рекомендаций для Python / Django?

    Человек в средней атаке с косой

    Использование базовой карты как фигуры в графическом интерфейсе Python

    как изменить любой тип данных на строку в python

    Как получить текст с помощью веб-драйвера selenium в python

    массив numpy C api

    Возвращение нескольких списков из понимания в python

    Флакон: фоновый поток видит непустую очередь как пустую

    Подавление научной нотации в Numpy при создании массива из вложенного списка

    использование st_mode для идентификации файла или каталога

    Python Chord Diagram (Plotly) – Интерактивные подсказки

    Не удается открыть видеофайлы «.mp4» с использованием OpenCV 2.4.3, Python 2.7 на компьютере под управлением Windows 7

    Управление мышью с помощью Python

    Лучший алгоритм (чем использование dict) для перечисления пар с заданной суммой.

    Как использовать «Пользователь» в качестве внешнего ключа в Django 1.5

    Python - лучший язык программирования в мире.