Nano Hash - криптовалюты, майнинг, программирование

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

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

Есть ли вариант?

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

09.05.2011

Ответы:


1

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

У меня была именно эта проблема, и сначала я думал, что это можно сделать только через 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))

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

09.05.2011
  • Да ты прав. Ваш код мне очень помог (как это просто: D). Спасибо. 11.05.2011

  • 2

    А вот полный код, который разбивает 2 прямоугольника на текст "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()
    
    10.05.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..