我如何不断更新鼠标光标?

问题描述 投票:0回答:1

我正在尝试更改pygame中的光标图标,但遇到了一些麻烦。我在游戏循环中尝试过,

pygame.mouse.set_visible(False)
screen.blit(mouseRed, pygame.mouse.get_pos())

其中mouseRed只是先前加载的图像。但是,这会导致在屏幕上绘制每个图像,从而产生绘画效果,这意味着它使用我加载的位图为屏幕着色。我考虑过在每个位置都用来填充屏幕,但这并不是最佳选择。有没有办法可以做到这一点?

这是我得到的,但不想要的。

s

pygame
1个回答
0
投票

基本上有两种方法可以使用这里的方法:使用“脏区”算法对背景的上一个鼠标位置部分进行重新粉刷,或者每次都重新粉刷整个屏幕/窗口。无论哪种方式,代码都是“清理”鼠标的旧图像。

重新绘制整个屏幕非常简单:

import pygame

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

DARK_BLUE = (   3,   5,  54)

### initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("M-o-u-s-e")

# Mouse
pygame.mouse.set_visible( False )
cursor_icon = pygame.image.load( 'mouse_cursor.png' ).convert_alpha()

### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True

    # Clear the entire window
    window.fill( DARK_BLUE )

    # Paint the mouse cursor
    window.blit( cursor_icon, pygame.mouse.get_pos() )

    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)

pygame.quit()

如果您愿意连续复制鼠标下方的区域,这也相对容易。请注意,在此示例中,背景并非每帧都重新绘制,鼠标光标会使用background-copy擦除其先前的位置。如果还存在其他运动对象,这可能会变得棘手,所有这些都必须同步。否则,旧光标位置“下方”的内容可能已经移动了。

import pygame

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE


### initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("M-o-u-s-e")

### Mouse
pygame.mouse.set_visible( False )
cursor_icon = pygame.image.load( 'mouse_cursor.png' ).convert_alpha()

# Background to fill the window
background_image = pygame.image.load( "grassy.jpg" )  # ref: http://www.plaintextures.com/
background_image = pygame.transform.smoothscale( background_image, ( WINDOW_WIDTH, WINDOW_HEIGHT ) ) 

### Main Loop
clock = pygame.time.Clock()
done = False
under_cursor = None                         # Used to store what was under the cursor
under_cursor_rect = None

window.blit( background_image, ( 0, 0 ) )   # NOTE: Paint the background once
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True

    # Clean up where the mouse was before (if there was a mouse before)
    if ( under_cursor != None ):
        window.blit( under_cursor, under_cursor_rect )

    # Save the background before painting the cursor
    # this involves making a copy of the background, and the location
    mouse_pos = pygame.mouse.get_pos()
    under_cursor = pygame.Surface( ( cursor_icon.get_width(), cursor_icon.get_height() ) )
    under_cursor.blit( window, ( 0, 0 ), ( mouse_pos[0], mouse_pos[1], cursor_icon.get_width(), cursor_icon.get_height() ) )
    under_cursor_rect = ( mouse_pos[0], mouse_pos[1], cursor_icon.get_width(), cursor_icon.get_height() )

    # Paint the mouse cursor at the new location
    window.blit( cursor_icon, mouse_pos )

    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)

pygame.quit()

如果您对哪种最好没有意见,我将首先重新绘制整个背景,因为它更简单。如果您认为这会导致性能问题,请在遇到问题时使用脏存储技术进行调查。

© www.soinside.com 2019 - 2024. All rights reserved.