【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】

学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=androidShare&utm_source=qq

Pygame事件处理机制

1.Pygame事件处理机制简介

===================================================================================

2.键盘事件及类型的使用

按键的修饰符event.mod修饰符的按位或运算event.mod = KMOD_ALT | KMOD_SHITF

测试一下键盘的事件吧:测试代码:

 1 import pygame, sys
 2
 3 pygame.init()
 4 screen = pygame.display.set_mode((600, 400))
 5 pygame.display.set_caption("Pygame事件处理")
 6
 7 while True:
 8     for event in pygame.event.get():
 9         if event.type == pygame.QUIT:
10             sys.exit()
11         elif event.type == pygame.KEYDOWN:
12             if event.unicode == "":
13                 print("[KEYDOWN]:", "#", event.key, event.mod)
14             else:
15                 print("[KEYDOWN]:", event.unicode, event.key, event.mod)
16         elif event.type == pygame.MOUSEMOTION:
17             print("[MOUSEMOTION]:", event.pos, event.rel, event.buttons)
18         elif event.type == pygame.MOUSEBUTTONUP:
19             print("[MOUSEBUTTONUP]:", event.pos, event.button)
20         elif event.type == pygame.MOUSEBUTTONDOWN:
21             print("[MOUSEBUTTONDOWN]:", event.pos, event.button)
22
23     pygame.display.update()

PygameEventPrint.py

===================================================================================

3.鼠标事件及类型的使用
鼠标事件及属性pygame.event.MOUSEMOTION        鼠标移动事件pygame.event.MOUSEBUTTONUP      鼠标键释放事件pygame.event.MOUSEBUTTONDOWN    鼠标键按下事件-------------------------------------------------------------鼠标事件及属性pygame.event.MOUSEMOTION    鼠标移动事件

•event.pos        鼠标当前坐标值(x,y),相对于窗口左上角•event.rel        鼠标相对运动距离(X,Y),相对于上次事件•event.buttons    鼠标按钮状态(a,b,c),对应于鼠标的三个键------------------------------------------------------------鼠标事件及属性pygame.event.MOUSEBUTTONUP      鼠标键释放事件

•event.pos      鼠标当前坐标值(x,y),相对于窗口左上角•event.button   鼠标按下键编号n 取值0/1/2,分别对应三个键-------------------------------------------------------------鼠标事件及属性pygame.event.MOUSEBUTTONDOWN    鼠标键按下事件•event.pos      鼠标当前坐标值(x,y),相对于窗口左上角

•event.button   鼠标按下键编号n 取值为整数,左键为1,右键为3,设备相关

用上面测试键盘事件的代码再测试一下鼠标事件吧!===================================================================================

4.壁球小游戏(鼠标型)壁球小游戏(鼠标型)需求:    鼠标可以通过左键摆放壁球,当释放按键时壁球运动从需求到实现的关键要素:    •鼠标事件:对于鼠标键按下和释放的合理处置-------------------------------------------------------------壁球小游戏(鼠标型)鼠标左键按下(左键按下拖拽小球)鼠标左键释放(左键释放小球继续运动)-------------------------------------------------------------壁球小游戏(鼠标型)局部处理:增加一种交互方式要考虑额外的局部处理游戏逻辑的调试
源代码:

 1 # 壁球小游戏(鼠标型)源代码
 2 import pygame, sys
 3
 4 pygame.init()
 5 size = width, height = 600, 400
 6 speed = [1, 1]
 7 BLACK = 0, 0, 0
 8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  # 窗口大小可调
 9
10 icon = pygame.image.load("PYG03-flower.png")
11 pygame.display.set_icon(icon)
12 pygame.display.set_caption("Pygame壁球")
13 ball = pygame.image.load("PYG02-ball.gif")
14 ballrect = ball.get_rect()
15 fps = 300
16 fclock = pygame.time.Clock()
17 still = False
18
19 while True:
20     for event in pygame.event.get():
21         if event.type == pygame.QUIT:
22             sys.exit()
23         elif event.type == pygame.KEYDOWN:
24             if event.key == pygame.K_LEFT:
25                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1) * int(speed[0] / abs(speed[0]))
26             elif event.key == pygame.K_RIGHT:
27                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
28             elif event.key == pygame.K_UP:
29                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
30             elif event.key == pygame.K_DOWN:
31                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1) * int(speed[1] / abs(speed[1]))
32             elif event.key == pygame.K_ESCAPE:
33                 sys.exit()
34         elif event.type == pygame.VIDEORESIZE:
35             size = width, height = event.size[0], event.size[1]
36             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
37         elif event.type == pygame.MOUSEBUTTONDOWN:
38             if event.button == 1:
39                 still = True
40         elif event.type == pygame.MOUSEBUTTONUP:
41             still = False
42             if event.button == 1:
43                 ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
44         elif event.type == pygame.MOUSEMOTION:
45             if event.buttons[0] == 1:
46                 ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
47     if pygame.display.get_active() and not still:
48         ballrect = ballrect.move(speed)
49     if ballrect.left < 0 or ballrect.right > width:
50         speed[0] = - speed[0]
51         if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
52             speed[0] = - speed[0]
53     if ballrect.top < 0 or ballrect.bottom > height:
54         speed[1] = - speed[1]
55         if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
56             speed[1] = - speed[1]
57
58     screen.fill(BLACK)
59     screen.blit(ball, ballrect)
60     pygame.display.update()
61     fclock.tick(fps)

壁球小游戏(鼠标型)源代码

===================================================================================5.Pygame事件处理函数

事件处理的重要函数:处理事件:pygame.event.get()pygame.event.poll()pygame.event.clear()操作事件队列:pygame.event.set_blocked()pygame.event.get_blocked()pygame.event.set_allowed()生成事件:pygame.event.post()pygame.event.Event()

Pygame事件队列事件队列(同时仅能存储128个事件 当队列满时,更多事件将被丢弃)pygame.event.set_blocked()pygame.event.set_allowed()pygame.event.get_blocked()•设置事件队列能够缓存事件的类型-------------------------------------------------------------事件处理函数:

pygame.event.get()•从事件队列中获得事件列表,即获得所有在队列的事件for event in pygame.event.get():    if event.type == pygame.QUIT:        sys.exit()•可以增加参数,获得某类或某些类事件:pygame.event.get(type)pygame.event.get(typelist)

pygame.event.poll()•从事件队列中获得一个事件While True:    event= pygame.event.poll()•事件获取将从事件队列中删除•如果事件队列为空,则返回event.NOEVENT

pygame.event.clear()•从事件队列中删除事件,默认删除所有事件•该函数与pygame.event.get()类似,区别仅是不对事件进行处理•可以增加参数,删除某类或某些类事件:pygame.event.clear(type)pygame.event.clear(typelist)-------------------------------------------------------------事件处理函数:

pygame.event.set_blocked(type or typelist)•控制哪些类型事件不允许被保存到事件队列中pygame.event.set_allowed(type or typelist)•控制哪些类型事件允许被保存到事件队列中

pygame.event.get_blocked(type)•测试某个事件类型是否被事件队列所禁止•如果事件类型被禁止,则返回True,否则返回False

pygame.event.post(Event)•产生一个事件,并将其放入事件队列•一般用于放置用户自定义事件(pygame.USEREVENT)•也可以用于放置系统定义事件(如鼠标或键盘等),给定参数

pygame.event.Event(type, dict)•创建一个给定类型的事件•其中,事件的属性和值采用字典类型复制,属性名采用字符串形式•如果创建已有事件,属性需要一致

测试事件产生机制源代码:

 1 import pygame, sys
 2
 3 pygame.init()
 4 screen = pygame.display.set_mode((600, 400))
 5 pygame.display.set_caption("Pygame事件处理")
 6 fps = 1
 7 fclock = pygame.time.Clock()
 8 num = 1
 9
10 while True:
11     uevent = pygame.event.Event(pygame.KEYDOWN, {"unicode": 123, "key": pygame.K_SPACE, "mod": pygame.KMOD_ALT})
12     pygame.event.post(uevent)
13     num = num + 1
14     for event in pygame.event.get():
15         if event.type == pygame.QUIT:
16             sys.exit()
17         elif event.type == pygame.KEYDOWN:
18             if event.unicode == "":
19                 print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
20             else:
21                 print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod)
22
23     pygame.display.update()
24     fclock.tick(fps)

测试事件产生机制




 
时间: 2024-10-11 13:20:07

【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】的相关文章

【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=androidShare&utm_source=qq pygame安装方法:http://www.cnblogs.com/GraceSkyer/p/8004004.html 1.Pygame 简介与安装 Python优秀的第三方库SDL:各个操作系统上提供的一种能直接与计算机外设打交道的一个第三方库在这个库

Python编程从入门到实践(第三、四章的列表和元祖) &#142015;

原文: http://blog.gqylpy.com/gqy/414 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

游戏开发入门500vip全套源码下载游戏开发概述

1.游戏机发展500vip全套源码下载dsluntan.com 20世纪70年×××始 首款主机magnavox odysse80年代 红白机80-90年代 各类非FC主机(PS,NDS等) PC单机游戏90年代-2000年 局域网对战游戏2000年后 大型多人游戏 页游 手游现在 VR,AR ..2.游戏是如何开发出来的,开发流程是什么? 原始的游戏比较粗糙,内容也很少,一般就一个人开发,美术与策划都由自己完成(建议看看<doom启示录>). 随着游戏逐渐变得复杂,需要多人去合作完成,分工也

Flask Web开发入门北京快乐8出售之文件上传

本章北京快乐8出售 dsluntan.com 我们介绍Flask Web开发中涉及的文件上传模块 定义后台接收处理逻辑@app.route('/upload', methods=['POST'])def upload_file():if request.method == 'POST': check if the post request has the file part if 'file' not in request.files: logger.debug('No file part')

python爬虫从入门到放弃(三)之 Urllib库的基本使用

官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.request 请求模块urllib.error 异常处理模块urllib.parse url解析模块urllib.robotparser robots.txt解析模块 urlopen 关于urllib.request.urlopen参数的介绍:urllib.request.urlopen(url,

前端开发入门到进阶第三集【定时器】

var mi = 0; var timer = setTimeout(handler,1000); function handler(){ if(mi == 5){ $(".item-desc .desc-part").empty(); clearTimeout(timer); return; 你没有在clearTimeout后return函数的结果,导致代码继续运行. https://zhidao.baidu.com/question/1542396607093854467.html

Android 开发艺术探究V第三章之view的事件分发机制

在介绍点击事件的传递机制,首先我们要分析的对象就是MOtionEvent,即点击事件,(当点击屏幕时由硬件传递过来,关于MotionEvent在View的基础知识中做了介绍),所谓的点击事件的分发就是MotionEvent的分发过程.即当一个MoTionEvent产生以后,系统需要把这个事件具体传递给一个具体的View,而这个传递过程就是分发过程,点击事件传递过程有三个很重要的方法,下面先来介绍这几个方法.  public boolean dispatchTouchEvent(MOtionEve

Node.js开发入门—语音合成示例

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php. 直接上代码吧,okVoiceTts.js,内容如下: var http = require('http'); var fs =require('fs'); var crypto = require('crypto'); var util = require('util'); va

Node.js开发入门—使用对话框ngDialog

做网站经常会遇到弹出对话框获取用户输入或弹出对话框让用户确认某个操作之类的情景,有一个基于AngularJS的扩展模块可以帮我们优雅地完成这类事情:ngDialog. ngDialog在github上提供了一个示例网页,演示了它的各种用法,在这里:https://github.com/likeastore/ngDialog/blob/master/example/index.html.ngDialog的github主页的readme也对常用的指令和服务做了较为详细的介绍,可以参考.我这篇就纯粹是