Python游戏系列之三_控制飞机移动
来源:互联网 发布:我的世界mac存档放哪 编辑:程序博客网 时间:2024/05/21 22:38
Python游戏系列之三_控制飞机移动
之前,我们已经在屏幕上画出飞机来了,接下来的工作,是让飞机动起来。
通过按下键盘的上下左右箭头,来控制飞机上下左右移动。
一、技术准备
1. 事件对象
pygame中的事件(event)有两个常用属性:
(1) type属性:表示事件类型,常见的事件类型有:
pygame.QUIT:退出事件
pygame.KEYDOWN:键盘按键的按下事件
pygame.KEYUP:键盘按键的松开事件
pygame.MOUSEBUTTONDOWN:鼠标按键的按下事件
pygame.MOUSEBUTTONUP:鼠标按键的松开事件
(2) key属性:如果是键盘事件,则事件的key属性可以获知按下的是哪个键。
pygame已经把所有按键都定义成了常量。
例如,按下的是上箭头,常量是K_UP;下箭头是K_DOWN;左箭头是K_LEFT;右箭头是K_RIGHT。
参看在线文档的常量说明:http://www.pygame.org/docs/ref/key.html
另外,键盘事件中,如果长按箭头,只会产生一次键盘事件。
所以如果想长按箭头,让飞机一直往一个方向移动,应该思考一下怎么写。
2. 字典
如果要判断按键事件的键值到底是上、下、左、右中的哪一个,我们可能会想到类似Java语言中的switch...case语法,很遗憾,Python语言不支持这样的语法。
但是Python语言有字典结构,可以实现我们的想法。
Python中的字典相当于Java中的哈希表,其中存储的元素为“键-值”对。
例如:
创建字典:
dict = {'Alice': '1111', 'Beth': '2222', 'Cecil': '3333'}
向字典中添加元素:
dict['Lily'] = "4444"
删除字典元素:
del dict['Lily']
(1) 创建字典
创建字典时,以键盘事件的键为key,value暂时设为0。
offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}
(2) 根据按键事件,修改字典数据
如果键盘按下,且是上下左右箭头,则移动值设为3;如果键盘松开,且是上下左右箭头,则移动值设为0。
这样每次按箭头键,就可以移动飞机了。
# 处理键盘按下和松开事件 if event.type == pygame.KEYDOWN: # 如果是上下左右箭头事件,则修改字典 if event.key in offset: offset[event.key] = 3 elif event.type == pygame.KEYUP: if event.key in offset: offset[event.key] = 0
hero_pos = [hero_pos[0] + offset[pygame.K_RIGHT] - offset[pygame.K_LEFT], hero_pos[1] + offset[pygame.K_DOWN] - offset[pygame.K_UP]]
#!/usr/bin/python# -*- coding: UTF-8 -*-import pygamefrom sys import exitSCREEN_WIDTH = 480 # 屏幕宽度SCREEN_HEIGHT = 640 # 屏幕高度# pygame.init()将会初始化所有导入的pygame模块pygame.init()# set_mode()函数将会创建一个显示面板(surface),即游戏窗口# 参数一为surface的分辨率,即窗口的大小# 参数二为surface的显示模式# 参数三为surface的位深screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])# set_caption()函数设置窗口的标题pygame.display.set_caption('飞机游戏')# 载入图片bg = pygame.image.load('bg1.jpg')ticks = 0 # 一个计数器shoot_img = pygame.image.load('shoot.png') # 载入大图hero_rect1 = pygame.Rect(0, 99, 102, 126) # 定义矩形1hero_rect2 = pygame.Rect(165, 360, 102, 126) # 定义矩形2hero_img1 = shoot_img.subsurface(hero_rect1) # 截取子图形1hero_img2 = shoot_img.subsurface(hero_rect2) # 截取子图形2hero_pos = [200, 500]# 新增代码# 定义一个字典offset = {pygame.K_LEFT: 0, pygame.K_RIGHT: 0, pygame.K_UP: 0, pygame.K_DOWN: 0}clock = pygame.time.Clock()while True: clock.tick(60) # 在surface上绘图,参数一是图像,参数二是左上角的位置 screen.blit(bg, [0, 0]) # 绘制飞机 if ticks % 50 < 25: screen.blit(hero_img1, hero_pos) else: screen.blit(hero_img2, hero_pos) ticks += 1 # 更新屏幕 pygame.display.update() # pygame.event.get()方法可以从事件队列得到所有事件的列表 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 新增代码 # 处理键盘按下和松开事件 if event.type == pygame.KEYDOWN: # 如果是上下左右箭头事件,则修改字典 if event.key in offset: offset[event.key] = 3 elif event.type == pygame.KEYUP: if event.key in offset: offset[event.key] = 0 # 新增代码 # 修改飞机坐标 hero_pos = [hero_pos[0] + offset[pygame.K_RIGHT] - offset[pygame.K_LEFT], hero_pos[1] + offset[pygame.K_DOWN] - offset[pygame.K_UP]]
这里比较巧妙的是,我们将修改飞机坐标的代码放在事件循环之外,这样,长按键盘时,移动值为3;只要不松开键盘,移动值一直都是3,因此每次循环都会让飞机移动;一旦松开键盘,则移动值归零,停止移动。
- Python游戏系列之三_控制飞机移动
- Python游戏系列之二_显示飞机
- python(三):面向对象实现之打飞机游戏
- Android学习之控制飞机移动
- Python系列之三_循环语句
- J2ME 2D小游戏入门之旅(三) 控制飞机的移动
- J2ME 2D小游戏入门之旅(三)控制飞机移动
- 控制飞机的移动
- 控制飞机移动
- Python游戏系列之四_发射子弹
- Python游戏系列之七_显示得分
- J2ME 2D小游戏入门之控制飞机移动
- J2ME 2D小游戏入门之控制飞机移动
- cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄控制坦克移动
- Cocos2d-X研究之豪华版飞机大战游戏开发系列
- Cocos2d-x学习笔记三之飞机游戏详解
- 基于cocos2dx的飞机大战学习[三]-为英雄添加飞行帧动作并控制飞机移动
- Unity3D 游戏引擎之IOS自定义游戏摇杆与飞机平滑的移动(十一)
- idea
- ANR问题分析
- 游戏运动模糊技术讲解
- Swagger中隐藏API
- C# 事件与委托___窗口间的相互开启与关闭
- Python游戏系列之三_控制飞机移动
- 面试高级算法梳理笔记
- java实现bit-map算法存储大数据
- MUI框架中加载外部网页或服务器数据的方法
- Android语音录入(MP3格式)-小白无头脑实现
- 网易2017年秋季校招第二题
- RX系列五 | Schedulers线程控制
- 配置文件中用户更新
- Android NDK(七):JNI异常处理