IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 学习P有game---Day3 -> 正文阅读

[Python知识库]学习P有game---Day3

????????今天要学习的是重构方法和操控飞船(左右移动)。

重构方法

? ? ? ? 随着游戏开发的深入run_game()函数会越来越长(结尾就知道会有多长啦).所以有没有一种方式,能让简化它呢?重构run_game()就呼之欲出了。我们可以把它拆分成多个小方法,然后调用就行了。这种小方法被我们称之为辅助方法(helper method)它的形式为def _your_helper_method(),也就是要在def后面加一个下划线_

? ? ? ? 我们可以把run_game()函数拆分为_check_event()和_updata_screen()

    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:
                pygame.quit()
                sys.exit()

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        pygame.display.flip()

? ? ? ? 这样,run_game()方法就变得很简单明了了。

操控飞船

? ? ? ? 向左向右移动是相似的,这里我就只演示一下如何操控飞船向右移动

? ? ? ? 首先是get_event()函数是能捕捉到键盘的操作的,当按下键盘时event.type=KEYDOWN,当松开键盘时event.type=KEYUP。所以我们可以利用这个来判断是否按下键盘:

    def _check_events(self):
        for event in pygame.event.get():  
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            # 检测到了键盘按下
            elif event.type == pygame.KEYDOWN:
            

            # 检测到了键盘松开
            elif event.type == pygame.KEYUP:

? ? ? ? 如何判断按的是左键还是右键呢?再加一个判断即可:

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            # 检测到了键盘按下
            elif event.type == pygame.KEYDOWN:
                # 按下的是右键
                if event.key == pygame.K_RIGHT:
                    # 向右移动
                    self.ship.rect.x += 1

            elif event.type == pygame.KEYUP

? ? ? ? 向右移动就是把x的坐标加上一个值(向左就是减去一个值),至于检测键盘有无松开用来干什么,接下来就会讲到。

? ? ? ? 到了这,我们发现飞船的确是可以动了,但是想要它连续移动却对手速的要求很高,能不能一直按着右键就一直移动呢?当然是可以的,我们可以建立一个循环,当按着时候,循环一直进行,松开就跳出循环。而run_game()这个方法的循环就给了我们很大的帮助。我们可以在ship.py中设置一些关于左右移动的参数。

    def __init__(self, ai_game):# ai_game为AlienInvasion的一个实例
     -------snip-------

        # 设置一个向右移动标志
        self.moving_left = False
     def updata(self):
        '''根据移动标志更新坐标'''
        if self.moving_right:
            self.rect.x += 1

? ? ? ? ?我们在初始化中增加的了self.moving_left的属性并且定义了一个update的方法,如果判断为True,便会向右移动,我们再在alien_invasion.py中的run_game()中调用这个方法只要一直是True,便会一直移动:

 def run_game(self):
        '''开始游戏的主循环'''
        while True:
            # 检测用户的操作(事件)
            self._check_events()
            # 更新飞船位置
            self.ship.updata()
            # 更新窗口
            self._update_screen()

? ? ? ? 那什么时候就变为True呢?当然是按下右键时。所以我们可以这样写:

            # 检测到了键盘按下
            elif event.type == pygame.KEYDOWN:
                # 按下的是右键
                if event.key == pygame.K_RIGHT:
                    # 向右移动
                    self.ship.moving_right = True

? ? ? ? 如果这样写,运行会发现一按右键就会一直向右跑,松了也没用。这时候检测松开就有用了:

 # 检测到了键盘松开
            elif event.type == pygame.KEYUP:
                # 松开的是右键
                if event.key == pygame.K_RIGHT:
                    # 停止向右
                    self.ship.moving_right = False

? ? ? ? 到了这就差不多了,但是可以做的更好。就比如飞行的速度。这里是1,要改的话很麻烦,有速度的地方我们都要改,所以我们可以把它写在settings.py中:

class Settings:
    '''储存游戏中的所有设置'''

    def __init__(self):
    ------snip-------

        # 飞船设置
        self.ship_speed = 1.5

? ? ? ? 添加一个速度属性。

? ? ? ? 在ship.py中就可进行修改啦:

import pygame
class Ship:
    '''管理飞船的类'''

    def __init__(self, ai_game):# ai_game为AlienInvasion的一个实例
    -------snip--------
    settings = ai_game.settings

    def updata(self):
        '''根据移动标志更新坐标'''
        if self.moving_right:
            self.rect.x += self.settings.ship_speed

? ? ? ? 首先是增加了一个属性,让我们能在ship.py中访问settings.py,移动的增量就成为了速度。

? ? ? ? 今天的任务算是完成了,我们会发现_check_events()这个方法也变得复杂,所以还可以增加辅助方法,这就是明天的内容了。

PS:对于rect对象,他们是不能接受小数的,在书上用了一个self.x = float(self.rect.x)来操作,最后再用self.rect.x = self.x来赋值回去(但还是只能赋值整数部分),我认为作用不大(其实是太懒了)就不写上去了。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:42:01  更:2021-08-16 11:43:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:32:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码