当鼠标在游戏中徘徊时如何遮挡一个盒子?

时间:2017-10-31 23:59:44

标签: python python-3.x pygame

我正在用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是我的主要绘图表面。

如果您对我的代码有任何疑问,或者我做过的任何事情都只是评论!

2 个答案:

答案 0 :(得分:2)

如果您传递的rects是您自己的派生类,那么我建议创建一个.is_shaded类变量并检查以确保变量为false,然后再进行着色。

如果这些作品不是你自己的课程扩展另一个,那么我建议你制作一个,因为它会使它更简单

答案 1 :(得分:1)

您的代码存在的问题是,当鼠标悬停时,您会继续添加深色矩形。难怪它会变得更暗更暗。

所需要的就是让您的代码稍微改变一下。

在事件处理中,您应该调用一个函数来检查它是否应该对文本进行着色。这应该返回一个布尔值。将其存储在变量中。 CheckToShadeBoxes函数中的大部分代码都可以解决问题。

在渲染部分中,您应该根据布尔值是否为真来渲染文本顶部的一个曲面。在CheckToShadeBoxes函数中创建灰色曲面的代码将起作用,但要确保它只是一个曲面。不要在每次迭代中创建新的表面。在外面定义一次并将其blit到循环内的屏幕。

这应该可以解决您的问题!

我希望这个答案可以帮到你!如果您有任何其他问题,请随时在下面发表评论!