接上篇。完美解决。
单键单击有效,双键单击有效,双键同时按住有效,同时松开有效,分别松开有效……,总之 解决了游戏控制键和发射键按键的所有状态。
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)
#储存键盘的'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:
self.fiercount += 1
print('j key press Fire! ' + str(self.fiercount))
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 才能看清楚结果,游戏时,可以把 delay 这条删掉
pygame.time.delay(100)
self.press_move()
self.press_fire()
pygame.display.update()
# self.press_fire()
if __name__ == "__main__" :
demo1 = Keycontral()
demo1.keyTest()
解决了英雄飞机的边飞边战斗的问题,又可以继续学习飞机大战的其他知识了。