都已经解决 同步“飞行” 和 “射击 ”的问题了,为什么还要写 (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()
好了,射击时间间隔也控制好了,那么可以编写不同的子弹,设置不同的间隔,例如普通子弹的速度快些,导弹类的子弹速度可以慢些。敌人的飞机的子弹也可以用这个办法来控制。