pygame教程实例(三)游戏事件

 28 2019-09-03 11:48:03 字数 3920 阅读 28 评论 0 喜欢 0

上一篇: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)

按键大全:

KeyASCII ASCII 描述
K_BACKSPACE \b 退格键(Backspace)
K_TAB \t 制表键(Tab)
K_CLEAR 清楚键(Clear)
K_RETURN \r 回车键(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_0 0 0
K_1 1 1
K_2 2 2
K_3 3 3
K_4 4 4
K_5 5 5
K_6 6 6
K_7 7 7
K_8 8 8
K_9 9 9
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_a a a
K_b b b
K_c c c
K_d d d
K_e e e
K_f f f
K_g g g
K_h h h
K_i i i
K_j j j
K_k k k
K_l l l
K_m m m
K_n n n
K_o o o
K_p p p
K_q q q
K_r r r
K_s s s
K_t t t
K_u u u
K_v v v
K_w w w
K_x x x
K_y y y
K_z z z
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_ENTER \r 回车键(小键盘)
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教程实例(四)小球弹跳(事件)

喜欢 0

发表我的评论

Hi,您需要填写昵称和邮箱!

  • 必填项

网友评论0