我正在用pygame制作游戏,我希望它是当鼠标悬停在我的文本上时,框会被遮挡。
这是我到目前为止所做的:
在事件处理循环中:
(CheckToUnshadeBoxes
中的元组是一对文本表面及其框(来自get_rect
方法))
elif event.type == MOUSEMOTION:
CheckToShadeBoxes(event, LERect, LoadRect, PlayRect)
CheckToUnshadeBoxes(event, (LERect, LESurf),
(LoadRect, LoadSurf), (PlayRect, PlaySurf))
这里是CheckToShadeBoxes
:
def CheckToShadeBoxes(event, *args):
'''
shade the box the mouse is over
'''
for rect in args:
s = pg.Surface((rect.width, rect.height))
s.set_alpha(50)
print(rect.x, rect.y)
s.fill(COLOURS['gray'])
x, y = event.pos
if rect.collidepoint(x, y):
SURFACE.blit(s, (rect.x, rect.y))
和CheckToUnshadeBoxes
:
def CheckToUnshadeBoxes(event, *args):
''' if the mouse moves out of the box, the box will become unshaded.'''
for (rect, TextSurf) in args:
x, y = event.pos
if not rect.collidepoint(x, y):
SURFACE.blit(TextSurf, (rect.x, rect.y))
这很好用!除了当我将鼠标移到盒子里面时,盒子会继续变暗和变暗,直到你看不到文字!我知道这是一个小细节,但它已经困扰了我很长时间,我不知道如何解决它。
顺便说一句,如果不够明显,COLOURS
是一个包含字符串键和RGB元组值的字典,而SURFACE
是我的主要绘图表面。
如果您对我的代码有任何疑问,或者我做过的任何事情都只是评论!
答案 0 :(得分:2)
如果您传递的rects是您自己的派生类,那么我建议创建一个.is_shaded类变量并检查以确保变量为false,然后再进行着色。
如果这些作品不是你自己的课程扩展另一个,那么我建议你制作一个,因为它会使它更简单
答案 1 :(得分:1)
您的代码存在的问题是,当鼠标悬停时,您会继续添加深色矩形。难怪它会变得更暗更暗。
所需要的就是让您的代码稍微改变一下。
在事件处理中,您应该调用一个函数来检查它是否应该对文本进行着色。这应该返回一个布尔值。将其存储在变量中。 CheckToShadeBoxes
函数中的大部分代码都可以解决问题。
在渲染部分中,您应该根据布尔值是否为真来渲染文本顶部的一个曲面。在CheckToShadeBoxes
函数中创建灰色曲面的代码将起作用,但要确保它只是一个曲面。不要在每次迭代中创建新的表面。在外面定义一次并将其blit到循环内的屏幕。
这应该可以解决您的问题!
我希望这个答案可以帮到你!如果您有任何其他问题,请随时在下面发表评论!