Pygame点击图片(不是矩形)

时间:2019-06-12 12:34:18

标签: python image pygame rectangles

这是我的代码的一部分,问题所在:

button = pygame.image.load("button1.png")
screen.blit(button, (100, 100))

此图像如下:

[1

当用户单击图像时,我需要增加变量的值。

我尝试了一些解决方案,但是大多数解决方案是在图片上绘制一个“不可见”矩形,即使有人单击了三角形附近的空白,变量的值也增加了。

3 个答案:

答案 0 :(得分:2)

使用mask module很容易。

从文档中

  

对于快速像素完美碰撞检测很有用。遮罩每像素使用1位存储碰撞的部分。


首先,根据图片创建一个Mask

mask = pygame.mask.from_surface(button)

然后,在检查鼠标单击事件时,检查掩码中的点是否为set

这是一个简单的例子:

import pygame

def main():
    pygame.init()
    screen = pygame.display.set_mode((480, 320))
    button = pygame.image.load('button.png').convert_alpha()
    button_pos = (100, 100)
    mask = pygame.mask.from_surface(button)
    x = 0
    while True:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                return
            if e.type == pygame.MOUSEBUTTONDOWN:
                try:
                    if mask.get_at((e.pos[0]-button_pos[0], e.pos[1]-button_pos[1])):
                        x += 1
                        print(x)
                except IndexError:
                    pass

        screen.fill((80,80,80))
        screen.blit(button, button_pos)
        pygame.display.flip()

main()

用于测试的示例button.png:

enter image description here

答案 1 :(得分:1)

在pygame中,除了手动计算鼠标的位置并弄清楚鼠标是否在三角形中之外,没有其他简便的方法。

您正在加载的图像(button1.png)是正方形图像,因此pygame或其他任何库都无法知道它的“实际”形状是什么。您要么必须自己做,要么可以让用户单击空白。

答案 2 :(得分:1)

您可以使用Surface.get_at()检查鼠标单击的像素的颜色。如果它是背景色(在您的情况下为白色),则将其视为外部,否则为内部,然后触发操作。

这是一个可行的例子。 insideimage函数检查单击是否在表面button(矩形)的内部,并检查鼠标坐标处像素的颜色。如果单击位于曲面内部并且颜色不是白色,则返回True
如果在图像内部不再使用背景色,则此方法有效。

import sys
import pygame

SCREENWIDTH = 500
SCREENHEIGHT = 500

pygame.init()
screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))

button = pygame.image.load("button1.png")
screen.blit(button, (100, 100))

def insideimage(pos, rsurf, refcolor):
    """rsurf: Surface which contains the image
    refcolor: background color, if clicked on this color returns False
    """
    refrect = rsurf.get_rect().move((100, 100))
    pickedcol = screen.get_at(pos)
    return refrect.collidepoint(pos) and pickedcol != refcolor

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONUP:
            valid = insideimage(event.pos, button, (255, 255, 255, 255))
            #(255, 255, 255, 255) this is color white with alpha channel opaque
            print(valid)

    pygame.display.update()