如何在鼠标位置只在屏幕上进行一次blit

时间:2016-06-13 00:45:12

标签: python pygame

我一直在尝试使用鼠标位置将图像blit到我的屏幕上。这是我的代码。

#Placing the farm
if farm:


    if pygame.mouse.get_pressed()[0]:
        hi = True
    if hi:
        screen.blit(farm_image,mouse_pos)

所以基本上我想让它在单击鼠标时将图像blit只在mouse_position屏幕上显示一次。但是它不会显示图像,而是使用mouse_pos移动。如何使图像仅在mouse_position显示一次。在此之前我确实有一个主循环。 我试过的是在图像为blit后将hi设置为False,但是后者会删除图像。感谢您提供的任何答案!

3 个答案:

答案 0 :(得分:1)

您可以尝试使用其他变量检查是否是您的第一次点击:

if pygame.mouse.get_pressed()[0]:
    if first_click == False:
        hi = true
        first_click = True
    else:
        pass

确保在使用之前定义first_click。此代码使用first_click来查看您是否已经点击过一次。其起始值为False,并在鼠标单击后更改为True。这也将hi更改为True,而不允许第二次点击first_click不再是False。这导致了elsepass语句,几乎没有任何内容。

答案 1 :(得分:1)

在PythonMaster的基础上做出这样的回答可能会起作用,并确保每个帧都保持服务器场的状态,以防每次都用背景刷新所有屏幕:

#Placing the farm
if farm:

    if pygame.mouse.get_pressed()[0] == False: #resets the first_click to False everytime the button is released
        first_click = False

    if pygame.mouse.get_pressed()[0]:
        if first_click == False: 
            first_click = True
        else:
            pass
        if first_click == True: #set's the farm position it will keep updating the position of the farm as you drag the mouse, if you do not want that set first_click to False here.
            farm_pos = mouse_pos
    try: #using try here, prevents errors when farm_pos is not yet defined
        screen.blit(farm_image,farm_pos)
    except:
        print 'farm position not defined yet, click to place'

答案 2 :(得分:1)

当您只需要单击一次时,您还可以使用事件检查而不是状态检查。这特别有用,因为它意味着您不会错过点击(如果用户在您的代码未检查用户输入时点击并释放鼠标,则可能会发生这种情况)。 Pygame具有事件MOUSEBUTTONDOWNMOUSEBUTTONUP,它们都为您提供鼠标的位置和点击的按钮。

如何将此功能合并到代码中取决于代码的其余部分,例如:如果你已经在其他地方使用pygame事件队列。小例子:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
    if event.type == pygame.MOUSEBUTTONDOWN:
        if farm:
            screen.blit(farm_image,(event.pos[0], event.pos[1]))

根据PythonMaster和Sorade的建议,您可以使用变量来跟踪状态,或者更好的是,将场的位置和可见状态存储在场对象(Sprite)中并简单地blit只要状态设置为可见,它就到了它的位置。