自学内容网 自学内容网

按键:重复延迟、重复速度、速度非线性增长。pygame实现

键盘的重复延迟是指你按下一个键,系统延迟一段时间后,才会再次响应这个键;
重复速度就是指不停的按这个键的时间间隔。

人类对这个世界的感知并非线性,而是更接近于某种对数时间。
所以,如果游戏玩家一直按着某个功能键,就让对应事件加速执行,可以提高玩家体验

以下程序主要实现两个功能:

  1. 事件响应延迟:游戏的刷新速度非常快,不能让事件在每一帧都执行一次,需要延迟一段时间后,才允许执行下一次
  2. 重复事件加速:如果在重复延迟的每一帧里玩家都在请求执行该事件,那就把下一次事件执行的速度加快,增长速度为指数级
''' 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)!