Pygame鼠标速度

2024-04-26 11:32:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新的编码和pygame,我正在寻找代码来检查鼠标是否以一定的速度移动。如果是,那就退出游戏

if the mouse speed is greater than say 10 pixels per second
     Run = False

Tags: the代码游戏编码ifis鼠标pygame
2条回答

您可以通过pygame.mouse.get_pos()函数跟踪鼠标位置的每一帧,当鼠标位置发生变化时,请检查pygame.time.get_ticks()的时间

比如:

MAX_SPEED = 50

previous_mouse_position = None
previous_sample_time    = None
...

current_mouse_pos = pygame.mouse.get_pos()
if ( previous_mouse_position != current_mouse_pos ):
    # mouse has moved
    pixels_movement = distance( previous_mouse_position, current_mouse_pos )
    time_now        = pygame.time.get_ticks()
    movement_time   = ( time_now - previous_sample_time ) / 1000  # milliseconds -> seconds
    movement_speed = pixels_movement / movement_time
    if ( movement_speed > MAX_SPEED ):
        doSomething()

elif ( previous_mouse_position == None ):
    # No previous recorded position
    previous_mouse_position = current_mouse_pos
    previous_sample_time    = pygame.time.get_ticks()

当然euclidian distance between two points可以相当容易地计算出来

编辑:

import math

def distance( point1, point2 ):
    """ Return the Euclidian distance between two points 
        Ref: https://en.wikipedia.org/wiki/Euclidean_distance#Two_dimensions """
    # NOTE: this code hasn't been tested
    p1x, p1y  = point1
    p2x, p2y  = point2
    x_squared = ( p2x - p1x ) * ( p2x - p1x )
    y_squared = ( p2y - p1y ) * ( p2y - p1y )
    pixel_dist= math.sqrt( x_squared + y_squared )
    return pixel_dist

MOUSEMOTION事件有一个属性rel,它表示鼠标相对于其先前位置移动了多少。使用这个属性,我们可以使用毕达哥拉斯定理来计算速度(**在Python中表示功率)。因此,在事件循环中,可以执行以下操作:

for event in pygame.event.get():
    if event.type == pygame.MOUSEMOTION:
        dx, dy = event.rel
        speed = (dx ** 2 + dy ** 2) ** (1/2)  # Pythagoras theorem.
        if speed >= MAX_SPEED:
            quit()  # Or show quit screen or whatever.

确保在循环之前定义MAX_SPEED(例如,作为全局变量)

这种方法的一个问题是,第一个事件将有一个相对于原点的位置,即当游戏开始时,如果鼠标位于(100100),那么rel属性将是(100100)

因为您可能不想在应用程序开始时就强制执行游戏规则,所以这应该不是问题。但是,如果您希望在执行此规则的情况下打开游戏,则需要跳过第一个MOUSEMOTION事件。这可以通过检查布尔值来实现

# Define this globally (or somewhere where it will only be set on startup).
# Also, use a better name than 'first'. Something that represent the logic for your game. 
first = False


for event in pygame.event.get():
    if event.type == pygame.MOUSEMOTION:
        dx, dy = event.rel
        speed = (dx ** 2 + dy ** 2) ** (1/2)  # Pythagoras theorem.
        if speed >= MAX_SPEED and first:
            quit()  # Or show quit screen or whatever.
        first = True

相关问题 更多 >