这是我的代码的一部分,问题所在:
button = pygame.image.load("button1.png")
screen.blit(button, (100, 100))
此图像如下:
[
当用户单击图像时,我需要增加变量的值。
我尝试了一些解决方案,但是大多数解决方案是在图片上绘制一个“不可见”矩形,即使有人单击了三角形附近的空白,变量的值也增加了。
答案 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:
答案 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()