游戏控制
1、键盘输入
2、手柄输入
前面说过键盘事件了,按下是一个事件,弹起是一个事件,按下不松下没有连发的;手柄的方向键和按钮的事件是不一样的,所以必须先把所有的事件统一起来,方便编程。
直接上代码吧
#coding=utf-8
import pygame
from pygame.locals import *
from const import *
#控制方案:{CTRL_DIR: DIR_UP, CTRL_BUTTON:[0,0,0,0,0,0]}
#方向上下左右,同时只能有一个按下的有效,就是第一个
#按键最多6个,1SELECT,2START,后面4个为两个连发,两个单发
#控制配置
KEY_MAPS = {
K_w:(WHO_PLAYER1, DIR_UP), K_s:(WHO_PLAYER1, DIR_DOWN), K_a:(WHO_PLAYER1, DIR_LEFT), K_d:(WHO_PLAYER1, DIR_RIGHT),
K_v:(WHO_PLAYER1, KEY_SELECT), K_b:(WHO_PLAYER1, KEY_START),
K_u:(WHO_PLAYER1, KEY_S1), K_i:(WHO_PLAYER1, KEY_S2), K_j:(WHO_PLAYER1, KEY_S3), K_k:(WHO_PLAYER1, KEY_S4),
K_UP:(WHO_PLAYER2, DIR_UP), K_DOWN:(WHO_PLAYER2, DIR_DOWN), K_LEFT:(WHO_PLAYER2, DIR_LEFT), K_RIGHT:(WHO_PLAYER2, DIR_RIGHT),
K_KP4:(WHO_PLAYER2, KEY_S1), K_KP5:(WHO_PLAYER2, KEY_S2), K_KP1:(WHO_PLAYER2, KEY_S3), K_KP2:(WHO_PLAYER2, KEY_S4),
}
#手柄(X轴0[-1,0,1],Y轴1[-1,0,1])
X_NONE = -1
Y_NONE = -2
JOY_AXS = {
"01-1":(WHO_PLAYER1, DIR_UP), "011":(WHO_PLAYER1, DIR_DOWN), "00-1":(WHO_PLAYER1, DIR_LEFT), "001":(WHO_PLAYER1, DIR_RIGHT),
"010":(WHO_PLAYER1, Y_NONE), "000":(WHO_PLAYER1, X_NONE),
"11-1":(WHO_PLAYER2, DIR_UP), "111":(WHO_PLAYER2, DIR_DOWN), "10-1":(WHO_PLAYER2, DIR_LEFT), "101":(WHO_PLAYER2, DIR_RIGHT),
"110":(WHO_PLAYER2, Y_NONE), "100":(WHO_PLAYER2, X_NONE)
}
JOY_BTN = {
"D08":(WHO_PLAYER1, KEY_SELECT), "D09":(WHO_PLAYER1, KEY_START), "U08":(WHO_PLAYER1, KEY_SELECT), "U09":(WHO_PLAYER1, KEY_START),
"D00":(WHO_PLAYER1, KEY_S1), "D01":(WHO_PLAYER1, KEY_S2), "D02":(WHO_PLAYER1, KEY_S3), "D03":(WHO_PLAYER1, KEY_S4),
"U00":(WHO_PLAYER1, KEY_S1), "U01":(WHO_PLAYER1, KEY_S2), "U02":(WHO_PLAYER1, KEY_S3), "U03":(WHO_PLAYER1, KEY_S4),
"D18":(WHO_PLAYER2, KEY_SELECT), "D19":(WHO_PLAYER2, KEY_START), "U18":(WHO_PLAYER2, KEY_SELECT), "U19":(WHO_PLAYER2, KEY_START),
"D10":(WHO_PLAYER2, KEY_S1), "D11":(WHO_PLAYER2, KEY_S2), "D12":(WHO_PLAYER2, KEY_S3), "D13":(WHO_PLAYER2, KEY_S4),
"U10":(WHO_PLAYER2, KEY_S1), "U11":(WHO_PLAYER2, KEY_S2), "U12":(WHO_PLAYER2, KEY_S3), "U13":(WHO_PLAYER2, KEY_S4)
}
KEYBUTTONS = [0,0,0,0,0,0,0,0,0,0]
class InputManage:
def __init__(self):
self.key_map = {
WHO_PLAYER1:{"KD":KEYBUTTONS, "KU":KEYBUTTONS},
WHO_PLAYER2:{"KD":KEYBUTTONS, "KU":KEYBUTTONS}
}
self.toggle_fullscreen = False
joystick_count = pygame.joystick.get_count()
for i in range(joystick_count):
joystick = pygame.joystick.Joystick(i)
joystick.init()
pass
def events(self):
ret_events = []
for who in (WHO_PLAYER1, WHO_PLAYER2):
player = self.key_map[who]
for i in range(10):
if player["KD"][i] > 0:
ret_events += [(who, i, True)]
if player["KU"][i] > 0:
ret_events += [(who, i, False)]
return ret_events
#键盘或手柄产生统一的事件
def handle_event(self):
ret_value = True
self.key_map = {
WHO_PLAYER1:{"KD":[0 for i in range(10)], "KU":[0 for i in range(10)]},
WHO_PLAYER2:{"KD":[0 for i in range(10)], "KU":[0 for i in range(10)]}
}
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
ret_value = False
elif event.type == KEYDOWN:
if event.key == K_F4:
self.toggle_fullscreen = True
else:
t = KEY_MAPS.get(event.key)
if t != None:
who,btn = t
self.key_map[who]["KD"][btn] = 1
elif event.type == KEYUP:
t = KEY_MAPS.get(event.key)
if t != None:
who,btn = t
self.key_map[who]["KU"][btn] = 1
elif event.type == JOYBUTTONDOWN:
key = "D%d%d"%(event.joy, event.button)
t = JOY_BTN.get(key)
if t != None:
who,btn = t
self.key_map[who]["KD"][btn] = 1
elif event.type == JOYBUTTONUP:
key = "U%d%d"%(event.joy, event.button)
t = JOY_BTN.get(key)
if t != None:
who,btn = t
self.key_map[who]["KU"][btn] = 1
elif event.type == JOYAXISMOTION:
key = "%d%d%d"%(event.joy, event.axis, int(event.value))
t = JOY_AXS.get(key)
if t != None:
who,btn = t
if btn >= 0:
self.key_map[who]["KD"][btn] = 1
else:
if btn == X_NONE:
self.key_map[who]["KU"][DIR_LEFT] = 1
self.key_map[who]["KU"][DIR_RIGHT] = 1
else:
self.key_map[who]["KU"][DIR_UP] = 1
self.key_map[who]["KU"][DIR_DOWN] = 1
return ret_value