pygame编写的坦克游戏(六)

游戏控制

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
                


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值