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 ...
随机推荐
- 第一次C++作业
电梯调度问题,PTA作业 ... 电梯调度问题 [github]https://github.com/zhanglingxin/elevator-scheduling 在本次代码中我第一次使用C++的 ...
- Dijkstra+优先队列 模板
#include<bits/stdc++.h> using namespace std; #define ll long long ; const ll inf=1e17; struct ...
- ElasticSearch API 简要介绍
调用其API会返回很多信息,例如集群的信息,节点的信息等 检查集群的状态----Restful API说明 1:检查集群状态信息 2:管理集群 3:执行 增删改查 命令 4:执行高级命令 Restfu ...
- Mysql中关键词执行顺序
MySQL的语句执行顺序 MySQL的语句一共分为11步,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对 ...
- NIO网络编程中重复触发读(写)事件
一.前言 公司最近要基于Netty构建一个TCP通讯框架, 因Netty是基于NIO的,为了更好的学习和使用Netty,特意去翻了之前记录的NIO的资料,以及重新实现了一遍NIO的网络通讯,不试不知道 ...
- 分布式架构核心RPC原理
在应用的迭代演进过程中,随着系统访问量提高,业务复杂度提高,代码复杂度提高,应用逐渐从单体式架构向面向服务的分布式架构转变.RPC(Remote Procedure Call Protocol远程过程 ...
- 【Linux笔记】CentOS yum 安装 vsftpd
vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用,下面直接上干货. 一.安装vsftp 以管理员的身份使用yum命令安装vsftp: [root@localh ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- BZOJ3811 玛里苟斯(线性基+概率期望)
k=1的话非常好做,每个有1的位都有一半可能性提供贡献.由组合数的一些性质非常容易证明. k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率.找出所有 ...
- 关于Centos的yum安装LAMP
Step1.配置网易的源 在mirrors.163.com中找到centos的帮助信息,完成源的更新配置,如图1,图2,图3所示. 图1 图2 图3 Step2.然后安装PHP+MySQL+apach ...