Python项目实战学习 外星人入侵游戏开发总结
外星人入侵开发总结
设置屏幕大小、游戏名称、背景颜色
pygame.init() #初始化背景设置ai_settings = Settings()screen = pygame.display.set_mode((120, 800))pygame.display.set_caption("外星人入侵")
set_mode()就是设置游戏屏幕宽高的函数,坐标原点在电脑屏幕左上角。
set_caption()就是设置游戏名称的函数
背景颜色
#设置背景颜色bg_color = (230, 230, 230)screen.fill(ai_settings.bg_color) #只能有一个参数
screen.fill()函数只能传递一个参数,设置背景的颜色。
这些基本的参数可用在一个文件中写,然后在其他文件中引用。
让屏幕绘制可见
# 让最近绘制的屏幕可见pygame.display.flip()
这句代码必须有,不然所有的screen设置都无法显示。 正常在每个循环中都会重新设置
设置键盘和鼠标监听事件
def check_events(ai_settings,screen,ship,bullets):""" 响应按键和鼠标事件,在这个方法中指定需要检查的事件 """# 事件都是通过pygame.event.get()方法获取for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 每次按键都会注册一个KEYDOWN# 检测到KEYDOWN事件时,我们需要检查按下的是否是特定的键elif event.type == pygame.KEYDOWN:check_keydown_events(event,ai_settings,screen,ship,bullets)# 松开方向键时触发的事件,将moving_right or moving_left设为falseelif event.type == pygame.KEYUP:check_keyup_events(event,ship)
为了能够访问Pygame检测到的事件,需要使用pygame.event.get()函数,获取事件,然后再通过event.type来判断获取的事件类型
键盘按键事件编码大全
KeyASCII | ASCII | Common Name |
---|---|---|
K_BACKSPACE | \b | backspace |
K_TAB | \t | tab |
K_CLEAR | clear | |
K_RETURN | \r | return |
K_PAUSE | pause | |
K_ESCAPE | ^[ | escape |
K_SPACE | space | |
K_EXCLAIM | ! | exclaim |
K_QUOTEDBL | " | quotedbl |
K_HASH | # | hash |
K_DOLLAR | $ | dollar |
K_AMPERSAND | & | 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 |
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 | keypad 0 | |
K_KP1 | keypad 1 | |
K_KP2 | keypad 2 | |
K_KP3 | keypad 3 | |
K_KP4 | keypad 4 | |
K_KP5 | keypad 5 | |
K_KP6 | keypad 6 | |
K_KP7 | keypad 7 | |
K_KP8 | keypad 8 | |
K_KP9 | keypad 9 | |
K_KP_PERIOD | . | keypad period |
K_KP_DIVIDE | / | keypad divide |
K_KP_MULTIPLY | * | keypad multiply |
K_KP_MINUS | - | keypad minus |
K_KP_PLUS | + | keypad plus |
K_KP_ENTER | \r | keypad enter |
K_KP_EQUALS | = | keypad equals |
K_UP | up arrow | |
K_DOWN | down arrow | |
K_RIGHT | right arrow | |
K_LEFT | left arrow | |
K_INSERT | insert | |
K_HOME | home | |
K_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 | right shift | |
K_LSHIFT | left shift | |
K_RCTRL | right control | |
K_LCTRL | left control | |
K_RALT | right alt | |
K_LALT | left alt | |
K_RMETA | right meta | |
K_LMETA | left meta | |
K_LSUPER | left Windows key | |
K_RSUPER | 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 |
加载图片 添加图片元素
以ship.py为例
class Ship():def __init__(self,ai_settings, screen):""" 初始化飞船设置其初始化位置"""self.screen = screenself.ai_settings = ai_settings# 加载飞船图像并获取其外接矩形self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect() self.screen_rect = screen.get_rect()#将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 在飞船的属性center中存储小数值self.center = float(self.rect.centerx)# 添加一个向右移动的属性 初始化为False# 在向右键按下时,为真,松开为False,实现按住持续移动self.moving_right = Falseself.moving_left = False
通过pygame.image.load()函数加载图片,存放图片素材的文件最好与ship.py在同一级目录。
self.image.get_rect() 是获取图片所占用的矩形,此后就像操作一个矩形一样操控图片,简单快捷高效。
screen.get_rect() 同理就是获取屏幕的矩形。
两个获取的矩形rect其实都是为了获取对象的参数,方便设置位置等。可用使用矩形的四角和中心(x,y)坐标来设置图片的位置。
rect的对象还有center,centerx,centery属性。
属性 | 作用 |
---|---|
center | 即矩形中心,返回的是矩形中心的坐标 |
centerx | 矩形x轴的中心,返回的是矩形x轴中心的x值 |
centery | 矩形y轴的中心,返回的是矩形y轴中心的y值 |
top | 矩形顶部 |
bottom | 矩形底部 |
left | 矩形左边 |
right | 矩形右边 |
这些值都是可用修改的。
在指定位置绘制图片元素
""" 在指定位置绘制飞船"""self.screen.blit(self.image,self.rect)
blit()向屏幕添加图片元素,self.image传递的是图片,self.rect传递是矩形元素,通过rect的centerx和bottom属性设置的矩形图片在屏幕中的位置
事件响应
def check_keydown_events(event,ai_settings,screen,ship,bullets):# 响应按键 右方向键# 通过读取event.key,检查按下的是否是右箭头键if event.key == pygame.K_RIGHT:# 向右移动飞船# ship.rect.centerx += 1 飞船向右移动ship.moving_right = Trueelif event.key == pygame.K_LEFT:# 向左移动飞船# ship.rect.centerx -= 1ship.moving_left = Trueelif event.key == pygame.K_SPACE: # 设置开火指令fire_bullet(ai_settings, screen, ship, bullets)# 按下Q时退出游戏elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event ,ship):# 响应松开if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ai_settings,screen,ship,bullets):""" 响应按键和鼠标事件,在这个方法中指定需要检查的事件 """# 事件都是通过pygame.event.get()方法获取for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 每次按键都会注册一个KEYDOWN# 检测到KEYDOWN事件时,我们需要检查按下的是否是特定的键elif event.type == pygame.KEYDOWN:check_keydown_events(event,ai_settings,screen,ship,bullets)# 松开方向键时触发的事件,将moving_right or moving_left设为falseelif event.type == pygame.KEYUP:check_keyup_events(event,ship)
简单的讲,就是按某个键,pygame检测到这个键被触发,然后找到对应的处理方法,然后触发相应的响应事件。
这里就是控制飞船的移动,也就是修改飞船的位置参数。
有按键按下事件,松开事件,单击按动事件
将子弹设置成从飞船顶部发出
# 设置子弹的位置,位于飞船的正上方。self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top
理解:pygame中元素的布局其实是相对布局。将A元素的rect参数设置成B元素的rect,则B元素是相对于A元素的布局位置
创建元素编组,存储生成的元素
# 创建一个用于存储子弹的编组,存储所有有效的子弹,# 管理发射出去的子弹bullets = Group()# 创建一个空编组,用于存储全部外星人aliens=Group()
其实就是将元素建个数组存起来,方便在需要的查找到该元素。
飞船开火事件
这种开火事件其实就是按一下空格生成一颗子弹,并且让子弹移动。
elif event.key == pygame.K_SPACE: # 设置开火指令fire_bullet(ai_settings, screen, ship, bullets)
def fire_bullet(ai_settings, screen, ship, bullets):# 如果还没有到达限制,就发射一颗子弹# 创建一颗子弹,并将其加入到编组bullets中# 按下空格时,发射子弹,并且限制子弹数量if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)
感想
这样的游戏开发其实非常简单,就是添加几个元素,然后通过修改它的位置属性来实现它的移动。
对动态的理解,游戏的动态效果其实就是基于电脑高速的计算速度,每一次的绘制其实都是静态的,但是通过非常快的速度对飞船的位置进行细微的修改,就实现了动态的效果,也就在不断的循环刷新游戏界面,所以一般电脑屏幕刷新率高的游戏更流畅,电脑运行速度快的也更流畅。系统里面其实有一个死循环,在不停的根据事件响应来删掉旧的,更新添加。所以在游戏开发中这个循环是必不可少的,而且最好是while循环来实现
Python项目实战学习 外星人入侵游戏开发总结相关推荐
- Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果
外星人入侵 本篇博客紧接上一篇博客:设置飞船发出子弹https://blog.csdn.net/Ace_bb/article/details/104845723 本篇博客实现在游戏窗口中添加动态的外星 ...
- Python项目实战学习 外星人入侵实现子弹射杀外星人,并且在外星人全部消灭后生成新的外星人
这里写自定义目录标题 外星人入侵 当子弹碰到外星人飞船时外星人被消灭 响应外星人和飞船碰撞 有外星人达到底部 各文件完整代码 settings.py ship.py alien.py bullet.p ...
- C/C++项目实战:华容道游戏开发丨570 行源码分享来啦~
每天一个C/C++小项目,提升你的编程能力! 华容道是古老的中国民间益智游戏,以其变化多端.百玩不厌的特点与魔方.独立钻石一起被国外智力专家并称为"智力游戏界的三个不可思议".它与 ...
- Python项目实战学习案例--股票模拟交易系统
Python学习案例–股票模拟交易系统 源代码地址:https://gitee.com/wujize188_admin/mini_stock.git 主要技术 后台:Flask框架,sqlalchem ...
- Python项目:《外星人入侵》代码及笔记 via:《Python变成入门到实战》
Python项目:<外星人入侵>代码及笔记 (via:<Python变成入门到实战>) [项目代码] alien_invasion.py import pygame from ...
- Python项目实战:开发PetStore宠物商店项目-关东升-专题视频课程
Python项目实战:开发PetStore宠物商店项目-487人已学习 课程介绍 课程内容包括项目分析与设计过程.数据库设计过程.项目敏捷开发.MySQL数据库.Python访问数据库 ...
- Python项目实战:数据可视化与股票数据分析-关东升-专题视频课程
Python项目实战:数据可视化与股票数据分析-333人已学习 课程介绍 本视频内容包括使用Matplotlib绘制图表.MySQL数据库.Python访问数据库和Lambda表达式. ...
- Python项目实战:使用PySpark对大数据进行分析
Python项目实战:使用PySpark对大数据进行分析 大数据,顾名思义就是大量的数据,一般这些数据都是PB级以上.PB是数据存储容量的单位,它等于2的50次方个字节,或者在数值上大约等于1000个 ...
- Python数据分析实战学习
Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习 AprilJulyOctober2015AprilJulyOctobe ...
最新文章
- Java 树形结构数据生成--不需要顶级节点
- Python第七章-面向对象高级
- python数据结构二叉树的前序,中序,后续遍历与推导
- 我们做自媒体是怎么失败的?
- vue.js环境部署
- 分布式事务处理--消息发送一致性的异常流程处理
- 4. PSR-4 --- 自动加载
- EdrawMax 11 for mac(亿图图示)中文版
- 计算机408专业考研真题,2021年计算机考研408历年真题及答案
- 链家网租房信息数据分析——从爬虫到房租预测
- 迅雷离线下载与高速通道运作原理详解
- python自带idle_使用自带的IDLE
- windows11安装日语输入法(添加输入法)
- 为何干电池是1.5v?而充电电池是1.2v?
- Linux命令之pwd
- android安装并启用新输入法
- php ssl 465,帝国CMS邮件无法发送SSL465端口无法发送的解决办法
- 小白也能轻松上手的Prometheus教程
- 我的人工智能梦(一、前言)
- python爬取qq空间说说
热门文章
- python中idx是什么意思_使用Python解析MNIST数据集(IDX文件格式)
- Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} fa
- 删除隧道适配器 本地连接
- Shader Graph入门
- 操作系统实验一 进程调度 FCFS_SJF_HRRN_RR算法
- 初中计算机罗辑思维测试,逻辑思维能力测试20题_数学教学中学生创造思维能力的培养...
- 计算机系男生横幅,超有创意的男生节条幅标语精选2016
- 骗局乎?中彩乎?《辉煌北京》纪念册仅发行一万套,现在还没有卖完,可惜,但别上当!!!...
- 20190513——python基础(列表、数据类型:字典、列表和字典的异同)
- ygo游戏王卡组_【YGO游戏王】卡组介绍——英雄(文字版)