手把手讲解超详细python入门游戏项目‘打外星飞船’(二)
上次我们在(一)中创建了游戏的背景,现在我们这里将要实现用键盘控制飞船的移动、射击子弹,但是在此之前我们还有一个非常重要的部分–重构。

重构

在大型项目中,经常需要添加新代码重构旧的代码,简单来说就把一些代码整理成函数,用函数之前的代码就变成了一句函数。这里我们就需要把之前的run_game()拆分成两个辅助方法,基本上辅助方法要以单个下划线打头。
我们直接回顾上此的代码

   def run_game(self):while True:#这里把管理事件的代码移动到这两个函数里面了,代码在下面self._check_events()self._update_screen()def _check_events(self):
#这个是之前按键和鼠标的代码for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()def _update_screen(self):#更新图像,切换到新屏幕self.screen.fill(self.settings.bg_color)self.ship.blitme()pygame.display.flip()

飞船的控制

这里我开始把按键链接到电脑,每一次按下一个按键,pygame上都会注册一个事件,这里每次按下都会注册一个KEYDOWN事件,如果检测到这个事件就会移动

def _check_events(self):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN: #检测到了按键被按下      if event.type == pygame.K_RIGHT:#按下的键是右键self.ship.rect.x +=1#这里的距离+1,即右边移

左右持续移动

        # 添加左右的移动的标志,立flag是好个方法,简化代码过程self.moving_right = Falseself.moving_left = False

但检测到左右移动键按下后,flag变成1

      if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.type == pygame.KEYUP:if event.key == pygame.K_RIGHT:self.ship.moving_right = False

这个时候我们在主运行加入移动函数,update()

    def run_game(self):"""Start the main loop for the game."""while True:self._check_events()self.ship.update()#控制移动self._update_screen()

下面这个就是移动函数

    def update(self):if self.moving_right:self.ship.rect.x +=1#右移动加一if self.moving_left:self.ship.rect.x -=1#左移动减一

调整数独、限制活动范围
这里我们就整体展现下ship加工部分了。

import pygameclass Ship:def __init__(self, ai_game):self.screen = ai_game.screenself.settings = ai_game.settings#这里添加一个settings属性,等会要在update用self.screen_rect = ai_game.screen.get_rect()        self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()    self.rect.midbottom = self.screen_rect.midbottom#这里有个方法是储存小数值,因为飞船移动的是像素,所以这里要要把位置赋给能够储存小数值的变量self.x = float(self.rect.x)# 移动的flagself.moving_right = Falseself.moving_left = Falsedef update(self):if self.moving_right and self.rect.right < self.screen_rect.right:#飞船未飞出右边的边缘self.x += self.settings.ship_speed#移动的速度会不断地加一个像素的大小,注意:主函数中已经设置了速度为self.ship_speed=1.5if self.moving_left and self.rect.left > 0:#如果飞船未飞出左侧,左侧是0self.x -= self.settings.ship_speed#根据self.x更新rect对象self.rect.x = self.x

再次重构
因为一句添加了不少内容,所以

    def _check_events(self):"""Respond to keypresses and mouse events."""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)#添加说明elif event.type == pygame.KEYUP:self._check_keyup_events(event)def _check_keydown_events(self, event):#这是刚才的语句,写进了这个句子if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Truedef _check_keyup_events(self, event):#同样的if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = False

按Q键退出

    def _check_keydown_events(self, event):"""Respond to keypresses."""if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = True#这里我们设置的按键Q退出,接受到Q键反应接受后执行sys模块的退出指令elif event.key == pygame.K_q:sys.exit()

全屏运行

    def __init__(self):"""Initialize the game, and create game resources."""pygame.init()self.settings = Settings()#游戏开始时传入的是(0,0)以及参数pygame.FULLSCREEN,这个指令是覆盖整个屏幕self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)#这里使用屏幕的高和宽更新数据self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().height

手把手讲解超详细python入门游戏项目‘打外星飞船’(二)相关推荐

  1. 手把手讲解超详细python入门游戏项目‘打外星飞船’(四)

    手把手讲解超详细python入门游戏项目'打外星飞船'(四) 在经过创立屏幕.飞船移动和设置子弹,我们这里开始设置外形人的创建和移动.我们这里主要的任务是:创建一众外星人让它们充满屏幕,让他们向下和两 ...

  2. 手把手讲解超详细python入门游戏项目‘打外星飞船’(五)

    手把手讲解超详细python入门游戏项目'打外星飞船'(五) 这是最后一个项目了,前面我们讲了整个游戏页面的控制.飞船.子弹.外星人的创建,这里我们讨论一下子弹射杀外星人和整个游戏的结束,我们这里的文 ...

  3. 手把手讲解超详细python入门游戏项目‘打外星飞船’(三)

    手把手讲解超详细python入门游戏项目'打外星飞船'(三) 第三部分我们讲解一下飞船需要射出子弹,那么子弹的部分是怎么操作呢?接下来我直接把项目的四个文件展示出来,以注释的形式在旁边讲解.因为有很多 ...

  4. 手把手讲解超详细python入门游戏项目‘打外星飞船’(一)

    手讲解超详细python入门游戏项目'打外星飞船'手把(一) 由于内容比较多,这里会分为五篇文章来讲解,从页面的创建.飞船控制.射击.外星人创建.射杀外星人五片来展开. 做一个窗口和设置响应用户 im ...

  5. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

  6. 【转】超强、超详细Redis入门教程 ,建议收藏

    转载自: 这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3. ...

  7. python详细安装教程-超详细Python与PyCharm安装教程,看这一篇就够了

    原标题:超详细Python与PyCharm安装教程,看这一篇就够了 学习了三天的python, 之前测试一直用课程自带的网页版玩玩, 为了学习 然后就下载了一个python和pycharm 现在分享下 ...

  8. 超详细Redis入门教程——Redis命令(下)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令 相关知识,具体内容包括简单动态字符串 SDS,集合的底层实现原理,BitMap 操作命令,HyperLogLog 操作命令,Geo ...

  9. 超详细Redis入门教程——Redis命令(上)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令(上) 相关知识,具体内容包括Redis 基本命令,Key 操作命令,String 型 Value 操作命令,Hash 型 Valu ...

最新文章

  1. linux硬链接不能创建目录,为什么硬链接不允许用于目录?
  2. php投影,box-shadow实现不同角度的投影
  3. dedecms切换模板css,DEDECMS的模板的css的详细解释 -电脑资料
  4. iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架
  5. 《Linux编程》上机作业 ·005【进程管理与通信】
  6. JPA与EJB3的关系
  7. 从零实现深度学习框架——理解正则化(二)
  8. 将安卓手机摄像头打造成电脑高清摄像头
  9. 文章-编程需要知道多少数学知识?
  10. 计算机毕业设计-基于springboot的社区志愿者管理系统
  11. 复习汇总vue知识点
  12. 用flex布局实现携程网首页的制作
  13. neo4j报错1:因CREATE和MERGE报错
  14. 基于Linux下的VIC使用(2)Routing部分(Fortran版本)
  15. 播放失败,请在设置中切换输出设备(电脑插入耳机还是外放的问题)
  16. ubuntu下的python的diango环境安装
  17. 考研数学第三章复习:微分中值定理以及导数的应用(1)
  18. 三星Note 7停产,原来是吃了流程的亏
  19. oracle bloom过滤,布隆过滤(Bloom Filter)-必须了解的优化器算法
  20. 功耗问题之过多唤醒源 wakeups

热门文章

  1. fastai图像分割_如何使用Fastai-v2创建用于多光谱卫星图像分割的DataBlock
  2. 数字信号处理实验(一) —— 线性卷积与循环卷积
  3. 2022年NOC软件创意编程(学而思)决赛小学高年级组scratch
  4. [译]从《孙子兵法》到软件开发
  5. 永磁同步电机矢量控制一更
  6. msn 登录死机问题
  7. 博达路由器常见功能教学11
  8. TKO 6-6 DP入门之村庄援助
  9. python 通过ip获取城市_如何根据普通ip地址获取当前地理位置
  10. 单片机:11.UART串口通信