按键:重复延迟、重复速度、速度非线性增长。pygame实现
键盘的重复延迟
是指你按下一个键,系统延迟一段时间后,才会再次响应这个键;
重复速度
就是指不停的按这个键的时间间隔。
人类对这个世界的感知并非线性,而是更接近于某种对数时间。
所以,如果游戏玩家一直按着某个功能键,就让对应事件加速执行,可以提高玩家体验
以下程序主要实现两个功能:
- 事件响应延迟:游戏的刷新速度非常快,不能让事件在每一帧都执行一次,需要延迟一段时间后,才允许执行下一次
- 重复事件加速:如果在重复延迟的每一帧里玩家都在请求执行该事件,那就把下一次事件执行的速度加快,增长速度为指数级
''' timer control
Timer starts or stops a work at a particular time
usage:
1.不使用计时器
if key == True:
do_something()
2.使用计时器
timer = Timer(350,do_something)
if key == True:
timer.do()
author@cse_wkm
'''
import pygame
class Timer:
def __init__(self, duration, func = None):
self.duration = duration
# self reinforcement
self.logarithm = 1
# event trigger times during self.active == True
self._counter = 0
self.func = func
self.start_time = 0
self.active = False
def _activate(self):
self.active = True
self.start_time = pygame.time.get_ticks()
def _deactivate(self):
self.active = False
self.start_time = 0
def do(self):
if self.active == False:
self._activate
self._counter = 0
# 在Timer激活的时间段里(即active=True),触发一次do,counter加一
self._counter += self.active
def update(self):
current_time = pygame.time.get_ticks()
# 在Timer激活的时间段里(即active=True),每经过一帧,counter减一
self._counter -= self.active
if current_time - self.start_time >= self.duration >> self.logarithm:# 事件加速,指数级增长
if self.func and self.start_time != 0:
self.func()
if self._counter == 0: # _counter为0,即每一帧都在触发do,比如按键一直按着不松
# 执行加速,这里没有设置速度上限
self.logarithm += 1 # 固定加速请直接修改self.duration
else:
self.logarithm = 1 # 速度恢复
self._deactivate()
原文地址:https://blog.csdn.net/qq_43470425/article/details/140386410
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!