上一篇: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) |
下一篇我们重写一下小球弹跳,使我们能控制小球运动