ominae escribió:1-En la introducción de pygame.mouse está esta frase:
Si el cursor del ratón está oculto, and the input is grabbed to the current display the mouse will enter a virtual mode, donde los movimientos relativos del ratón nunca se detendrán en el límite de la pantalla. Ver las funciones pygame.mouse.set_visible y pygame.mouse.set_grab para conseguir configurarlo.
2- En pygame.mouse.get_rel:
El movimiento relativo del ratón está limitado a los vertices de la pantalla, pero see the virtual input mouse mode for a way around this.
Saludos, estuve haciendo algunas pruebas con pygame y creo tener una idea
de lo que significa este "modo virtual". Por defecto, cuando manipulamos
el puntero del mouse, este reporta coordenadas absolutas y coordenadas
relativas (la cantidad de movimiento contando desde el instante anterior).
Las coordenadas relativas sirven para saber que tan "brusco" o "rápido" es
un movimiento, si muevo el mouse muy lento las coordenadas relativas serán
valores como dx=1 o dx=-1. En cambio si muevo el mouse muy rápido, estos
valores serán mayores, dx=15 por ejemplo.
El punto es que dependiendo de si el mouse está visible o no, las coordenadas
relativas se comportan un poco diferente: Si el mouse está visible y le pido
a pygame que atienda todas las entradas de datos a la aplicación (usando la
sentencia "pygame.event.set_grab"), ocurrirán dos cosas:
1: el mouse quedará "atrapado" en el area de la ventana, no tendré la
posibilidad de mover el cursor a otra aplicación, ni siquiera cerrar la
ventana con un "click" en la cruz de la barra de título.
2: las coordenadas relativas se detendrán al mover el mouse en los bordes de
ventana, a esto hace referencia tu consulta sobre la función
"pygame.mouse.get_rel". Significa que las coordenadas relativas serán siempre
0, sin exceder los bordes. Creo que la traducción podría ser:
"El movimiento relativo del mouse está limitado a los vértices de la
pantalla, pero puede ver acerca del modo de entrada de datos virtual para
exceder este límite."
y luego dice algo como "El modo de entrada de datos virtual se explica al
principio de la página". Es decir, si llamo a "pygame.event.set_grab" (para
"atrapar" el mouse en la ventana) y dejo el mouse visible, entonces las
coordenadas relativas se informan excepto en los bordes.
En cambio, si oculto el mouse con la sentencia
"pygame.mouse.set_visible(False)", pygame me informará las coordenadas
relativas todo el tiempo.
Armé un pequeño ejemplo de esto:
pueden ver como pygame informa las coordenadas del mouse en la parte
superior de la ventana. Con la tecla ENTER podemos cambiar a modo "virtual".
- Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import pygame
def imprimir_pantalla(screen, font, mouse, estado_visible):
fg = (0, 0, 0)
bg = (200, 200, 200)
pos = font.render(u"Posición absoluta: (%d, %d)" %mouse.pos, 1, fg, bg)
rel = font.render(u"Posición relativa: (%d, %d)" %mouse.rel, 1, fg, bg)
screen.fill(bg)
screen.blit(pos, (10, 10))
screen.blit(rel, (10, 40))
if estado_visible:
msg = u"El mouse está visible, pulse ENTER"
else:
msg = u"En modo virtual, pulse ENTER"
referencia = font.render(msg, 1, fg, bg)
screen.blit(referencia, (10, 200))
pygame.font.init()
quit = False
screen = pygame.display.set_mode((320, 240))
font = pygame.font.Font(None, 24)
estado_visible = True
while not quit:
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit = True
elif e.type == pygame.MOUSEMOTION:
imprimir_pantalla(screen, font, e, estado_visible)
elif e.type == pygame.KEYUP:
if e.key == pygame.K_RETURN:
if estado_visible:
estado_visible = False
pygame.mouse.set_visible(False)
pygame.event.set_grab(True)
else:
estado_visible = True
pygame.mouse.set_visible(True)
pygame.event.set_grab(False)
pygame.time.delay(10)
pygame.display.flip()
Con respecto a la consulta 1, modifiqué un poco el primer párrafo intentando
explicar el tema del modo de entrada virtual.
Saludos, y en nombre de todos los que usamos pygame: ¡ Muchas gracias por
tus traducciones !