微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我将如何使用 pygame.mask 进行颜色碰撞?

如何解决我将如何使用 pygame.mask 进行颜色碰撞?

我在某些敌人周围准备了一些碰撞箱。这些碰撞箱是白色的。当它们接触到某种颜色时,例如红色,就会触发 if 语句。我听说 pygame.mask 在这种情况下很有用。

代码

# Setting a display width and height and then creating it
display_width = 700
display_height = 500
display_size = [display_width,display_height]
game_display = pygame.display.set_mode(display_size)
intro_display = pygame.display.set_mode(display_size)

spaceship = pygame.image.load("spaceship2.png")
blue_enemy = pygame.image.load("blue_enemy.png")
green_enemy = pygame.image.load("green_enemy.png")
orange_enemy = pygame.image.load("orange_enemy.png")
pink_enemy = pygame.image.load("pink_enemy.png")
yellow_enemy = pygame.image.load("yellow_enemy.png")

# Creating a way to add text to the screen
def message(sentence,color,x,y,font_type,display):
    sentence = font_type.render(str.encode(sentence),True,color)
    display.blit(sentence,[x,y])

# Creating a loop to keep program running
    while True:
        # --- Event Processing and controls
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    spaceship_x_change = 10
                elif event.key == pygame.K_LEFT:
                    spaceship_x_change = -10
            elif event.type == pygame.KEYUP:
                spaceship_x_change = 0

message(str(blue_enemy_health),white,65,10,font,game_display)
        game_display.blit(blue_enemy,(20,25))
        blue_hit_Box = pygame.draw.rect(game_display,[30,35,80,70],1)

        message(str(green_enemy_health),203,game_display)
        game_display.blit(green_enemy,(160,25))
        green_hit_Box = pygame.draw.rect(game_display,[180,60,1)

        message(str(orange_enemy_health),341,game_display)
        game_display.blit(orange_enemy,(300,25))
        orange_hit_Box = pygame.draw.rect(game_display,[315,43,1)

        message(str(pink_enemy_health),496,game_display)
        game_display.blit(pink_enemy,(440,25))
        pink_hit_Box = pygame.draw.rect(game_display,[460,90,1)

        message(str(yellow_enemy_health),623,game_display)
        game_display.blit(yellow_enemy,(580,25))
        yellow_hit_Box = pygame.draw.rect(game_display,[590,40,85,1)

        # Creating a spaceship,lasers,and enemies
        laser = pygame.draw.rect(game_display,red,[spaceship_x + 69,100,4,300])
        game_display.blit(spaceship,(spaceship_x,spaceship_y))

我希望当敌人周围的白色碰撞盒与红色接触时触发 if 事件。我希望通过 pygame.mask 专门完成此操作。 谢谢

解决方法

Pygame 中的 mask 碰撞多次回答。请参阅 Mask 和以下问题的答案:

但是,您有一个特殊情况,您想从红色 (255,0) 创建蒙版。


要从单一颜色创建蒙版,请使用 pygame.Surface.convert 创建格式不带每像素 alpha 的图像,并使用 pygame.Surface.set_colorkey 根据蒙版颜色设置透明色键:

mask_image = image.convert()
mask_image.set_colorkey(mask_color)

使用 pygame.mask.from_surface 从图像中创建蒙版并使用 pygame.mask.Mask.invert 反转蒙版:

mask = pygame.mask.from_surface(mask_image)
mask.invert()

最小示例:

import pygame

def ColorMask(image,mask_color):
    mask_image = image.convert()
    mask_image.set_colorkey(mask_color)
    mask = pygame.mask.from_surface(mask_image)
    mask.invert()
    return mask

pygame.init()
window = pygame.display.set_mode((450,250))

test_image = pygame.Surface((200,200),pygame.SRCALPHA)
pygame.draw.circle(test_image,(255,0),(70,70),70)
pygame.draw.circle(test_image,(0,255,(130,255),130),70)

mask = ColorMask(test_image,0))

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill(0)
    window.blit(test_image,(25,25))
    window.blit(mask.to_surface(),(250,25))
    pygame.display.flip()

pygame.quit()
exit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。