2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
pygame是一个比较大的库,以我这点弱小的实力是没办法详解的。所以我只讲我懂得那些部分,其他部分由大家慢慢查找了解。
-------------------------------
我用pygame的目标很明确,写一个自己的游戏娱乐,权当学习时的放松。一个小项目的运行是非常有成就感的,所以一切讲解都按这样的简单步骤来。
首先,我们来理解动画:

上面是一种给孩子玩的小游戏,将几张不同姿态的图片放在一个转轴上,旋转转轴时我们就能看到一个连贯的飞翔动画,几张断开的静止的图像,当我们以高速切换时,人眼就会认为是连续的动作。这就是视觉暂留效应的体现。根据这种原理,人类发明了电影。
# -*- coding: utf8 -*- background_image_filename = 'sky.jpg'
mouse_image_filename = 'cloud.png'
#指定图像文件名称 import pygame #导入pygame库
from sys import exit #向sys模块借一个exit函数用来退出程序 pygame.init() #初始化pygame,为使用硬件做准备
screen = pygame.display.set_mode((600, 450), 0, 32)
#创建了一个窗口
pygame.display.set_caption("Hello, World!")
#设置窗口标题 background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加载并转换图像
while True:
#游戏主循环 for event in pygame.event.get():
if event.type == pygame.QUIT:
#接收到退出事件后退出程序
pygame.quit()
exit() screen.blit(background, (0,0))
#将背景图画上去 x, y = pygame.mouse.get_pos()
#获得鼠标位置
x-= mouse_cursor.get_width() / 2
y-= mouse_cursor.get_height() / 2
#计算光标的左上角位置
screen.blit(mouse_cursor, (x, y))
#把光标画上去 pygame.display.update()
#刷新一下画面
运行结果是这样的:

当鼠标在屏内移动时,云也会跟着移动,当然这朵云是我临时抠的,实在是很违和。。大家略过这一点。
大家先看主循环里的
while True:
#游戏主循环
...
screen.blit(background, (0,0))
#将背景图画上去
...
screen.blit(mouse_cursor, (x, y))
#把光标画上去
pygame.display.update()
#刷新画面
把不需要的东西省略掉,先看这几句。在主循环里,我们一次次地执行下面三句代码的操作。就是先画背景图,再花光标图,然后刷新画面。每次因为光标发生了变化,它就每次画出不同的图像,所以这就变成了动画,也就能实时显示,也就是我上面说的部分。
那么,事件呢?
看这段代码:
for event in pygame.event.get():
if event.type == pygame.QUIT:
#接收到退出事件后退出程序
pygame.quit()
exit()
这是一段事件响应代码,pygame.event.get()方法会接受所有程序中发生的事件。当判断这个事件是一个关闭程序(QUIT)的事件时,就将程序关闭。
那么有哪些事件呢?
| 事件 | 产生途径 | 参数 |
|---|---|---|
| QUIT | 用户按下关闭按钮 | none |
| ATIVEEVENT | Pygame被激活或者隐藏 | 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 |
| VIDEORESIZE | Pygame窗口缩放 | size, w, h |
| VIDEOEXPOSE | Pygame窗口部分公开(expose)? | none |
| USEREVENT | 触发了一个用户事件 | code |
这里有很多事件,我们当然是不用把它背下来的,这里只是一个说明。之后在font模块时,我将写一个可以显示所有你得到的事件的程序。
再详细说明上述代码
background_image_filename = 'sky.jpg'
这句是简单的字符串赋值语句,只是为了之后使用时能更简单地理解名称的意义。
screen = pygame.display.set_mode((600, 450), 0, 32)
这一句使用了pygame.display.set_mode((640, 450), 0, 32)这一句是创建一个窗口,第一个参数是一个元组,用于传递窗口的大小,第二个参数是窗口的模式,默认可以写0,第三个参数为色深,一般写32就行。
set_mode()返回一个Surface对象,之后可以对这个对象操作。
第二个参数有如下使用:
| 标志位 | 功能 |
|---|---|
| FULLSCREEN | 创建一个全屏窗口 |
| DOUBLEBUF | 创建一个“双缓冲”窗口,建议在HWSURFACE或者OPENGL时使用 |
| HWSURFACE | 创建一个硬件加速的窗口,必须和FULLSCREEN同时使用 |
| OPENGL | 创建一个OPENGL渲染的窗口 |
| RESIZABLE | 创建一个可以改变大小的窗口 |
| NOFRAME | 创建一个没有边框的窗口 |
大家可以自己使用看看效果。
background = pygame.image.load(background_image_filename).convert()
convert()可以把图像数据都转化为Surface对象,每次加载完图像以后就应该做这件事件(事实上因为它太常用了,如果你不写pygame也会帮你做);convert_alpha相比convert,保留了Alpha 通道信息(可以简单理解为透明的部分),这样我们的光标才可以是不规则的形状。
blit()是个重要函数,第一个参数为一个Surface对象,第二个为左上角位置。将第一个对象画到相应的位置上。
但是画完还没有用,必须把画完以后的图像用update()显示在屏幕上,否则画面一片漆黑。
2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示的更多相关文章
- 2015/11/9用Python写游戏,pygame入门(8):按钮和游戏结束
昨天没有更新内容,今天相对多写一些. 因为我们已经基本完成游戏框架,但是游戏结束后,并不知道怎样比较好开始.我本来本着懒的原则,想结束后显示一个黑屏,然后你重新点一下鼠标就重新开始.但是那样实在太不像 ...
- 2015/11/1用Python写游戏,pygame入门(1):pygame的安装
这两天学习数据结构和算法,有时感觉并不如直接做项目来的有趣.刚刚学完python的基本使用,现在刚好趁热打铁做个小项目. 由于本人一直很想制作一款游戏,就想使用Python制作一个基础的游戏.搜了一下 ...
- 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象
昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...
- 2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理
游戏里面一般是肯定会出现文字显示的,即使是俄罗斯方块也应该显示分数.那么我们应该怎样来显示文字呢,今天一起学习一下pygame的font模块. 使用字体模块 pygame可以直接调用系统字体,也可以调 ...
- 2015/11/7用Python写游戏,pygame入门(7):碰撞检测
我们已经完成了飞机大战的大部分东西,但是游戏还是没有办法正式开玩,因为子弹并不能打掉飞机.只有完成了这一个工作,游戏才算基本成型. 今天的内容就非常简单了,就是做到这个碰撞检测,以及控制好子弹和飞机的 ...
- 2015/11/5用Python写游戏,pygame入门(5):面向对象的游戏设计
昨天的内容里有了运动的子弹,虽然我们只添加了一个子弹,但你可以看到我们需要记录子弹的x,y坐标,每次要更新它的坐标.如果我们想要有多颗子弹,就需要存储多个坐标.那时候处理起来就不显得那么简单,也许我们 ...
- 2015/11/4用Python写游戏,pygame入门(4):获取鼠标的位置及运动
按昨天的说法,今天将开始做一个简单的游戏了. 目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有 ...
- python写的battle ship小游戏 - 1.0
最近学python,这是今天写的一个小游戏. from random import randint class Board(object): board = [] def __init__(self, ...
- PYTHON 写函数,计算传入字符串中【数字、字母、空格、以及其他的个数】
def func1(s): al_num = 0 spance_num = 0 digit_num = 0 others_num = 0 for i in s: if i.isdigit(): # i ...
随机推荐
- 20172311-ASL测试 2018-1938872补充博客
20172311-ASL测试 2018-1938872补充博客 课程:<程序设计与数据结构> 班级: 1723 姓名: 赵晓海 学号: 20172311 实验教师:王志强老师 测试日期:2 ...
- Java接口interface,匿名内部类
接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...
- Controller控制器
控制器概述 上接应用(北向),下接设备(南向),左右扩展(东西接口). 谁掌控了控制器,或者制定了标准,就掌握了SDN. 南向功能:通过Openflow等南向接口技术,对网络设备进行管控,例如拓扑发现 ...
- 利用p4实现ipv6转发实验
写在前面 只是作为一个入门p4的实验尝试,借用了一些即成的运行代码. p4代码 /**p4_16,v1_model**/ #include<core.p4> #include<v1m ...
- 读我是一只IT小小鸟有感
进入大学半年了,每个人都说软件工程是一个非常有前途的高薪职业,但我这半年来都很迷茫,看不清自己的未来,不知道如何度过接下来的三年半时光,虽然我也认为软件工程是有前途的专业,但是经过一学期的学习,发现不 ...
- 周总结<8>
周次 学习时间 新编代码行数 博客量 学到知识点 15 15 100 1 Html页面设计:虚拟机:(C语言)排序 Html案例: <!DOCTYPE html PUBLIC "-// ...
- C++中使用内存映射文件处理大文件
引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile().ReadFile() ...
- 桥接,NAT,Host Only的区别
桥接,NAT,Host Only的区别 一.Brigde——桥接 :默认使用VMnet0fish批注:只要在虚拟机中将IP设对,即使宿主机的IP是错的,也可以通信.但是如此物理网卡被禁用了,则不能 ...
- php自带的filter过滤函数
PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. filter_has_var()检查是否存在指定输入类型的变量. filter_id()返回指定过滤器的 ID 号. filt ...
- [C/C++] 指针数组和数组指针
转自:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html 这两个名字不同当然所代表的意思也就不同.我刚开始看到这就吓到了,主要是中文 ...