pygame之飞机大战按键操作解决方案比较(3)

都已经解决 同步“飞行” 和 “射击 ”的问题了,为什么还要写 (3)呢?

因为用了列表储存数据后,子弹的射击间隔无法控制了。按键 有 击键的时间差,可以让子弹看起来还算正常的发射,但是按住后,完全看的是 电脑 对按键的相应时间了,我的电脑产不多是 10 毫秒 左右一次。子弹看起来是一直线了。显然不合理。

用 pygame.time.delay()?  of course not 行,这个函数是暂停整个程序的运行,而不能只让子弹间隔加长。摸索了一些其他函数,都不行,还是换回笨办法 ,先设置一个函数 pretime 读取当前时间。运行时再次读取 currenttime 两个时间相减,如果大于你想要的interval  发射子弹,不然 略过。

测试代码如下:

import pygame
from sys import exit  #用到exit() 省的每次退出都有红字提示
 
class Keycontral(object):
 
    def __init__(self):
        pygame.init()
        scene = pygame.display.set_mode((400,600))
        pygame.display.set_caption('按键测试')
        #记录 a 键 按下的次数
        self.key_a_count = 0  
        #记录 j 键 按下的次数  
        self.key_j_count = 0
        # pygame.key.set_repeat(1,50)
        #子弹发射间隔
        self.interval = 200 #毫秒
        #得到当前时间
        self.pretime = pygame.time.get_ticks()
 
        #储存键盘的'a s d w'键,控制飞机移动
        self.key_down_list = []
        #存储键盘的 j 键,用来射击fire
        self.fire_key_list = []
        self.rightcount = 1
        self.fiercount = 1
        self.leftcount = 1
    def move(self,direction):
        if direction == "RIGHT":
            self.rightcount += 1
            print('right ' + str(self.rightcount))
        elif direction == "LEFT":
            self.leftcount += 1
            print('left ' +str(self.leftcount))
        
    #储存按键到列表
    def key_down(self, key):
        self.key_down_list.append(key)
 
    def key_up(self,key):
        if len(self.key_down_list) != 0:
            try:
                self.key_down_list.remove(key)
            except Exception:
                pass
 
    def press_move(self):
        if len(self.key_down_list) != 0:
            if self.key_down_list[0] == pygame.K_a:
                self.move('LEFT')
            elif self.key_down_list[0] == pygame.K_d:
                self.move('RIGHT')
           
    
    #键盘按下向列表添加fire
    def fire_key_down(self, key):
        self.fire_key_list.append(key)
 
    #键盘松开向列表删除fire
    def fire_key_up(self, key):
        if len(self.fire_key_list) != 0: #判断是否为空
            try:
                self.fire_key_list.remove(key)
            except Exception:
                pass
    #按键fire不放,持续开火
    def press_fire(self):
        if len(self.fire_key_list) != 0: 
            if self.fire_key_list[0] == pygame.K_j:
                currenttime = pygame.time.get_ticks()
                passedtime = currenttime - self.pretime
                #如果时间差满足射击的时间间隔,则射击。
                if passedtime > self.interval:
                    self.fiercount += 1
                    print('j key press Fire! ' + str(self.fiercount))
                    # 前时间改为当前时间,这个很重要,要考的。
                    self.pretime = currenttime
            
 
    def keyTest(self):
        while True:
            for event in pygame.event.get():
                #退出程序
                if event.type == pygame.QUIT:
                        pygame.quit()
                        exit()
                #按键测试开始,按键被按下
                # 判断事件类型是否是键盘按下事件
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_j:
                       self.fire_key_down(pygame.K_j)
                    elif event.key == pygame.K_a:
                       self.key_down(pygame.K_a)
                    elif event.key == pygame.K_d:
                        self.key_down(pygame.K_d)
               # 判断事件类型是否是键盘松开事件
                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_j:
                        self.fire_key_up(pygame.K_j)
                    elif event.key == pygame.K_a:
                      self.key_up(pygame.K_a)
                    elif event.key == pygame.K_d:
                     self.key_up(pygame.K_d)
            #delay 可以删掉了 
            # pygame.time.delay(100) 
            self.press_move()
            self.press_fire()
            pygame.display.update()
            # self.press_fire() 
 
if __name__ == "__main__" :
    demo1 = Keycontral()
    demo1.keyTest()
 

好了,射击时间间隔也控制好了,那么可以编写不同的子弹,设置不同的间隔,例如普通子弹的速度快些,导弹类的子弹速度可以慢些。敌人的飞机的子弹也可以用这个办法来控制。

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88205228