上一篇:pygame教程实例(二)模拟三体
下一篇:pygame教程实例(四)小球弹跳(事件)


本教程使用python3


pygame教程实例(一)小球弹跳中我们写了一个小球在重力的作用下反复弹跳。
但是游戏最重要的一点是玩家与游戏的交互(通过鼠标、键盘、手柄等设备)。

一、什么是事件

点击鼠标、移动鼠标、滑动滚轮、按下键盘等都是事件。
不过,点击鼠标其实不是一个事件,而是两个事件(按下鼠标,松开鼠标),按下键盘按键也是一样的

二、事件获取

pygame会把事件放到一个队列里,程序从队列里读取事件并进行相应的处理。当然你也可以不处理,但读取事件是必须的,不然这个队列就满了,然后你的程序会卡住。

1.读取事件

使用pygame.event.get()读取队列里所有事件并清空队列。
我们使用for循环来遍历事件

for event in pygame.event.get():
    # event 是一个事件对象
    # event.type 是事件类型

那么event.type有哪些呢

事件类型产生途径参数
QUIT用户按下关闭按钮none
ATIVEEVENTPygame被激活或者隐藏gain, state
KEYDOWN键盘被按下unicode, key, mod
KEYUP键盘被放开key, mod
MOUSEMOTION鼠标移动pos, rel, buttons
MOUSEBUTTONDOWN鼠标按下pos, button
MOUSEBUTTONUP鼠标放开pos, button
JOYAXISMOTION游戏手柄(Joystick or pad)移动joy, axis, value
JOYBALLMOTION游戏球(Joy ball)移动joy, axis, value
JOYHATMOTION游戏手柄(Joystick)移动joy, axis, value
JOYBUTTONDOWN游戏手柄按下joy, button
JOYBUTTONUP游戏手柄放开joy, button
VIDEORESIZEPygame窗口缩放size, w, h
VIDEOEXPOSEPygame窗口部分公开(expose)?none
USEREVENT触发了一个用户事件code

2.处理事件

先看这个事件类型QUIT
QUIT是pygame里的一个常量,我们必须先导入

import pygame
from pygame.locals import *

当用户点击关闭按钮(就是窗口右上角的那个叉叉)就会触发这个事件。
代码如下

for event in pygame.event.get():
    if event.type == QUIT:
        exit()

也许你希望点击关闭按钮后给用户弹一个框,询问是否退出。

def my_exit():
    # 在这里弹窗
    # 不过pygame里似乎没有弹窗
    # 你可以在窗口里画一个弹窗

for event in pygame.event.get():
    if event.type == QUIT:
        my_exit()

然后是键盘事件

for event in pygame.event.get():
    if event.type == QUIT:
        exit()
    if event.type == KEYDOWN: # KEYDOWN 按键被按下
        if event.key == K_ESCAPE:
            print('你按下了Esc键,准备退出')
            exit()
        if event.key == K_LEFT or event.key == K_a:
            # K_LEFT:左方向键
            # K_a:A键
            print('向左移动')
        if event.key in [K_RIGHT, K_d]:
            print('向右运动')
        if event.key == K_SPACE:
            print('按下了空格键')
    elif event.type == KEYUP: # KEYUP 按键被松开
        if event.key  in [K_LEFT, K_a]:
            print('停止向左移动')

还有鼠标事件

for event in pygame.event.get():
    if event.type == QUIT:
        exit()
    if event.type == KEYDOWN: # KEYDOWN 按键被按下
        pass
    elif event.type == KEYUP: # KEYUP 按键被松开
        pass
    elif event.type == MOUSEBUTTONDOWN: # 鼠标左键被按下
        print('点击的坐标是',event.pos)
        # event.pos 元组,点击位置的x,y坐标
        # 窗口左上角坐标为 (0,0)

按键大全:

KeyASCIIASCII描述
K_BACKSPACEb退格键(Backspace)
K_TABt制表键(Tab)
K_CLEAR 清楚键(Clear)
K_RETURNr回车键(Enter)
K_PAUSE 暂停键(Pause)
K_ESCAPE^[退出键(Escape)
K_SPACE 空格键(Space)
K_EXCLAIM!感叹号(exclaim)
K_QUOTEDBL"双引号(quotedbl)
K_HASH#井号(hash)
K_DOLLAR$美元符号(dollar)
K_AMPERSAND&and 符号(ampersand)
K_QUOTE'单引号(quote)
K_LEFTPAREN(左小括号(left parenthesis)
K_RIGHTPAREN)右小括号(right parenthesis)
K_ASTERISK*星号(asterisk)
K_PLUS+加号(plus sign)
K_COMMA,逗号(comma)
K_MINUS-减号(minus sign)
K_PERIOD.句号(period)
K_SLASH/正斜杠(forward slash)
K_000
K_111
K_222
K_333
K_444
K_555
K_666
K_777
K_888
K_999
K_COLON:冒号(colon)
K_SEMICOLON;分号(semicolon)
K_LESS<小于号(less-than sign)
K_EQUALS=等于号(equals sign)
K_GREATER>大于号(greater-than sign)
K_QUESTION?问号(question mark)
K_AT@at 符号(at)
K_LEFTBRACKET[左中括号(left bracket)
K_BACKSLASH\反斜杠(backslash)
K_RIGHTBRACKET]右中括号(right bracket)
K_CARET^脱字符(caret)
K_UNDERSCORE_下划线(underscore)
K_BACKQUOTE`重音符(grave)
K_aaa
K_bbb
K_ccc
K_ddd
K_eee
K_fff
K_ggg
K_hhh
K_iii
K_jjj
K_kkk
K_lll
K_mmm
K_nnn
K_ooo
K_ppp
K_qqq
K_rrr
K_sss
K_ttt
K_uuu
K_vvv
K_www
K_xxx
K_yyy
K_zzz
K_DELETE 删除键(delete)
K_KP0 0(小键盘)
K_KP1 1(小键盘)
K_KP2 2(小键盘)
K_KP3 3(小键盘)
K_KP4 4(小键盘)
K_KP5 5(小键盘)
K_KP6 6(小键盘)
K_KP7 7(小键盘)
K_KP8 8(小键盘)
K_KP9 9(小键盘)
K_KP_PERIOD.句号(小键盘)
K_KP_DIVIDE/除号(小键盘)
K_KP_MULTIPLY*乘号(小键盘)
K_KP_MINUS-减号(小键盘)
K_KP_PLUS+加号(小键盘)
K_KP_ENTERr回车键(小键盘)
K_KP_EQUALS=等于号(小键盘)
K_UP 向上箭头(up arrow)
K_DOWN 向下箭头(down arrow)
K_RIGHT 向右箭头(right arrow)
K_LEFT 向左箭头(left arrow)
K_INSERT 插入符(insert)
K_HOME Home 键(home)
K_END End 键(end)
K_PAGEUP 上一页(page up)
K_PAGEDOWN 下一页(page down)
K_F1 F1
K_F2 F2
K_F3 F3
K_F4 F4
K_F5 F5
K_F6 F6
K_F7 F7
K_F8 F8
K_F9 F9
K_F10 F10
K_F11 F11
K_F12 F12
K_F13 F13
K_F14 F14
K_F15 F15
K_NUMLOCK 数字键盘锁定键(numlock)
K_CAPSLOCK 大写字母锁定键(capslock)
K_SCROLLOCK 滚动锁定键(scrollock)
K_RSHIFT 右边的 shift 键(right shift)
K_LSHIFT 左边的 shift 键(left shift)
K_RCTRL 右边的 ctrl 键(right ctrl)
K_LCTRL 左边的 ctrl 键(left ctrl)
K_RALT 右边的 alt 键(right alt)
K_LALT 左边的 alt 键(left alt)
K_RMETA 右边的元键(right meta)
K_LMETA 左边的元键(left meta)
K_LSUPER 左边的 Window 键(left windows key)
K_RSUPER 右边的 Window 键(right windows key)
K_MODE 模式转换键(mode shift)
K_HELP 帮助键(help)
K_PRINT 打印屏幕键(print screen)
K_SYSREQ 魔术键(sysrq)
K_BREAK 中断键(break)
K_MENU 菜单键(menu)
K_POWER 电源键(power)
K_EURO 欧元符号(euro)

下一篇我们重写一下小球弹跳,使我们能控制小球运动


上一篇:pygame教程实例(二)模拟三体
下一篇:pygame教程实例(四)小球弹跳(事件)

Last modification:July 2nd, 2020 at 04:53 pm
如果觉得我的文章对你有用,请随意赞赏