我有一个SPEEDLINK游戏手柄,想要在游戏手柄中看到动作的结果。我写了这个:
import pygame
from pygame.locals import *
import random
pygame.init()
TV=pygame.display.set_mode((500,500))
joystick_count = pygame.joystick.get_count()
if joystick_count == 0:
# No joysticks!
print("Error, I didn't find any joysticks.")
else:
# Use joystick #0 and initialize it
my_joystick = pygame.joystick.Joystick(0)
my_joystick.init()
x,y=400,400
pygame.draw.circle(TV,(100,200,40),(x,y),10)
pygame.display.flip()
my_joystick = pygame.joystick.Joystick(0)
clock=pygame.time.Clock()
my_joystick.init()
done=False
print pygame.joystick.get_count()
while not done:
for e in pygame.event.get():
if e.type==QUIT:
done=True
elif e.type==JOYBUTTONUP:
x=my_joystick.get_axis(0)
y=my_joystick.get_axis(1)
print x,y
clock.tick(60)
pygame.quit()
但是当我移动帽子时,而不是 1 0 在帽子右边它给了我 0.999969482422 0.0 ,同样在帽子向下我得到 0.0 0.999969482422 而不是 0 1 。为什么会这样,我怎么能像其他职位一样在那些地方获得自己的东西呢?
答案 0 :(得分:1)
浮点运算本质上是不精确的,并且很可能使用一些转换到浮点将传感器输入映射到0~1。我非常怀疑你的游戏手柄是否足够敏感0.999969482422
与1明显不同,因为用Python计算的差异是0.000030517577999988887
,大约是3/100000。即使您的游戏手柄的模拟手柄具有良好的传感器分辨率,您也不可能使用任何操纵杆获得1。使用与浮点运算完全相等是一个坏主意,甚至模糊比较也可能很棘手(如果您可以阅读大量数学数据,请参阅https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/)。如果你真的需要钳制到1,你也可能只是圆(例如round(0.999969482422, 4) == 1.0
)。