您的位置:首页 > 编程语言 > Python开发

Python实现飞机大战-第一部分(附源码、素材、超详细实现过程)

2020-07-09 15:12 337 查看

这里写目录标题

  • 1.5.控制飞机移动
  • 1.6.控制玩家飞机移动速度
  • 1.7.限制飞机移动范围
  • 1.8.文件目录
  • 源码、素材链接

    源码、素材免费下载链接
    https://download.csdn.net/download/qq_44744724/12615682

    前言

    最近在家闲来无事,二刷了Python基础,对于Python类的使用一直都很困惑,类和继承都是面向对象编程语言的特性之一。二刷之后对类的相关知识有了新的认识。顺便找个小项目练练手,加深对函数、类、重构的理解,最后想通过这篇博客记录一下实现过程。如果遇到什么困难或者不理解的地方欢迎滴滴我,同时程序中可能会有很多不足,望不吝赐教。
    看这篇教程之前你要熟悉掌握Python基础,比如:Python基础语法、函数、类、重构等等
    Pygame就无所谓,这个项目是为了练习python,并不是为了掌握pygame。

    这里是整个项目的第一部分,在游戏窗口内生成玩家飞机,并控制玩家飞机上下、左右移动,同时防止飞机超出游戏窗口

    首先创建一个文件夹用来存放所有py文件,文件名自拟,我命名为AirplaneWar,同时在这个文件夹内创建名为image的子文件夹

    1.1.创建Pygame窗口

    在Airplane文件目录下创建一个名为main.py的文件,作为主文件

    import pygame
    def start_game():
    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()
    screen = pygame.display.set_mode((480,700))
    # 窗口的标题
    pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com")
    # 背景图片地址
    background_image_path = './image/bg_image.png'
    # 加载背景图片
    background = pygame.image.load(background_image).convert()
    while True:
    '''游戏主循环'''
    # 响应键鼠
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    # 填充背景图片
    screen.blit(background, (0, 0))
    # 刷新窗口
    pygame.display.update()
    
    start_game()

    下面运行代码

    如图,游戏的窗口我们已经创建完成

    1.2.创建设置类

    这个设置类目前只是为了控制窗口的大小。
    在同一目录下创建一个名为settings.py的文件

    class Settings():
    '''游戏设置的类'''
    
    def __init__(self):
    '''游戏设置初始化'''
    # 游戏窗口宽度
    self.screen_weight = 480
    # 游戏窗口高度
    self.screen_height = 700
    # 背景图片的地址
    self.background_image = './image/bg_image.png'

    在这个类中可以看到,包含了三个内容;窗口宽度、窗口高度、背景图片的path。接下来修改main.py内的代码

    import sys
    import pygame
    from settings import Settings
    
    def start_game():
    
    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()
    
    # 实例化Settings类
    player_settings = Settings()
    
    # 创建一个高度为player_settings.screen_height,宽度为player_settings.screen_weight的游戏窗口
    # 调用user_settings对象中的screen_weight和screen_height属性
    screen = pygame.display.set_mode((player_settings.screen_weight, player_settings.screen_height))
    
    # 设置窗口的标题
    pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com")
    
    # 调用player_settings中的image属性,其中有背景图片的路径
    background = pygame.image.load(player_settings.background_image).convert()
    while True:
    '''游戏主循环'''
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    
    # 填充背景图片
    screen.blit(background, (0, 0))
    
    pygame.display.update()
    
    start_game()

    首先在文件的头部引入settings.py中的

    Settings
    类,接着实例化Settings类。

    1.3.添加玩家飞机

    在窗口的底部的中央添加一个玩家的飞机,首先创建player_plane.py,创建玩家飞机类

    import pygame
    class Plane():
    '''玩家飞机的类'''
    def __init__(self, screen, player_settings):
    
    self.screen = screen
    self.image = pygame.image.load('image/player.png')
    self.rect = self.image.get_rect()
    self.screen_rect = screen.get_rect()
    self.player_settings = player_settings
    # 飞机放在屏幕底部中间
    self.rect.centerx = self.screen_rect.centerx
    self.rect.bottom = self.screen_rect.bottom
    
    def blitme(self):
    '''绘制飞机位置'''
    self.screen.blit(self.image, self.rect)

    修改main.py中的代码

    加载图像后,使用get_rect()来获取图像的矩形边框,接着使用rect对象的属性center、centerx、centery,可让图像居中;使用属性bottom、top、left、right,可让图像屏幕边缘对齐;属性x、y,可调整图像的水平和垂直的位置。

    import sys
    import pygame
    from settings import Settings
    from player_plane import Plane
    
    def start_game():
    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()
    
    -- skip -- 重复的代码不再写,只提示在相应位置添加部分代码
    
    # 实例化飞机类,对象为players_plane
    players_plane = Plane(screen, player_settings)
    while True:
    -- skip --
    
    # 绘制玩家飞机
    players_plane.blitme()
    
    start_game()

    接着运行代码,看看效果。

    添加成功了。

    1.4.重构main.py模块

    如果你还不知道什么是重构那么可以看这篇文章…待续
    重构就是为了使代码结构清晰,逻辑更加清楚容易理解。
    可以通过将main.py中实现某一功能的代码段,提取出来放到一个函数里面,然后创建一个新的py文件(比如game_functions.py)用来存放这些函数,当main.py中需要使用到这些函数时我们可以通过import game_functions调用模块中的某个函数。

    1.4.1.check_keyboard() 监视键鼠事件的函数


    main.py中这个代码段实现的功能就是监视键盘鼠标,接下来创建一个函数实现同样的功能,添加到game_functions.py中。

    import sys
    import pygame
    
    def check_keyboard():
    '''监视键盘和鼠标事件'''
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    1.4.2.update_screen() 刷新屏幕的函数

    同理,添加update_screen()到game_functions.py中。

    import sys
    import pygame
    
    def update_screen(player_settings,players_plane, screen):
    '''更新窗口图像'''
    # 调用player_settings中的image属性,其中有背景图片的路径
    background = pygame.image.load(player_settings.background_image).convert()
    
    # 填充窗口背景
    screen.blit(background, (0, 0))
    
    # 绘制玩家飞机
    players_plane.blitme()
    
    # 刷新屏幕: update只刷新窗口有变动的地方,flip刷新整个窗口
    pygame.display.update()
    # pygame.display.flip()

    修改main.py

    import pygame
    from settings import Settings
    from player_plane import Plane
    import game_functions as game_functions
    def start_game():
    
    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()
    
    # 实例化Settings类
    player_settings = Settings()
    
    # 创建一个高度为player_settings.screen_height,宽度为player_settings.screen_weight的游戏窗口
    # 调用user_settings对象中的screen_weight和screen_height属性
    screen = pygame.display.set_mode((player_settings.screen_weight, player_settings.screen_height))
    
    # 设置窗口的标题
    pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com")
    
    # 实例化飞机类,对象为players_plane
    players_plane = Plane(screen, player_settings)
    
    while True:
    '''游戏主循环'''
    # 调用文件game_functions内的check_keyboard函数,是一个响应键鼠的函数
    game_functions.check_keyboard()
    
    # 调用update_screen函数,更新窗口
    game_functions.update_screen(player_settings,players_plane, screen)
    start_game()

    一系列操作之后,main.py是不是更加的简洁,逻辑非常清晰。

    1.5.控制飞机移动

    1.5.1.左右移动

    添加玩家飞时我们用到bottom和centerx控制飞机图像放置的位置,centerx用来控制图像的水平坐标。要让图像左右移动,只需要改变rect.centerx属性的值,添加一个方法change_position来修改rect.centerx的值。
    为了实现用户按下键盘,飞机一直连续移动,需要给Plane类添加一个移动标志,初值为False(此时飞机不动),如果监测到键盘按下,移动标志被赋值为Ture。键盘松开,赋值为False。

    player_plane.py

    import pygame
    class Plane():
    '''玩家的飞机的类'''
    def __init__(self, screen, player_settings):
    --skip--
    
    # 是否移动标志
    self.moving_right = False
    self.moving_left = False
    
    def change_position(self):
    '''根据移动标志改变飞机的位置'''
    if self.moving_right:
    self.rect.centerx += 1
    if self.moving_left:
    self.rect.centerx -= 1

    修改了Plane的类,还要修改监视键盘的函数。

    game.functions

    '''储存大量游戏内的函数'''
    import sys
    import pygame
    
    def check_keyboard(players_plane):
    '''监视键盘和鼠标事件'''
    --skip--
    # KEYDOWN检测键盘是否按下
    elif event.type == pygame.KEYDOWN:
    # 检测右箭头键是否按下
    if event.key == pygame.K_RIGHT:
    players_plane.moving_right = True
    # 检测左箭头键是否按下
    elif event.key == pygame.K_LEFT:
    players_plane.moving_left = True
    
    # KEYUP检测键盘是否松开
    elif event.type == pygame.KEYUP:
    # 检测右箭头键是否松开
    if event.key == pygame.K_RIGHT:
    players_plane.moving_right = False
    # 检测左箭头键是否松开
    elif event.key == pygame.K_LEFT:
    players_plane.moving_left = False
    1.5.2.上下移动

    上下移动需要飞机的rect的bottom属性控制,代码的实现与上下移动基本相似,不再赘述。

    player_plane.py

    import pygame
    class Plane():
    '''玩家的飞机的类'''
    def __init__(self, screen):
    --skip--
    # 是否移动标志
    self.moving_up = False
    self.moving_down = False
    
    def change_position(self):
    --skip--
    if self.moving_up:
    self.rect.bottom -= 1
    if self.moving_down:
    self.rect.bottom += 1

    game.functions
    在左右移动的下方添加下面的代码

    # 检测上箭头键是否按下
    elif event.key == pygame.K_UP:
    players_plane.moving_up = True
    #检测下箭头键是否按下
    elif event.key == pygame.K_DOWN:
    players_plane.moving_down = True
    
    # 检测上箭头键是否松开
    elif event.key == pygame.K_UP:
    players_plane.moving_up = False
    # 加测下箭头键是否松开
    elif event.key == pygame.K_DOWN:
    players_plane.moving_down = False

    运行代码,按下上下左右代码,测试一下效果。

    1.6.控制玩家飞机移动速度

    运行代码后,有木有感觉这飞机特喵的飞的好慢啊。接下来实现如何调整飞机的移动速度。
    接下来画面转移到这里(Plane的类中的change_position方法),
    注意:把下图中的self.rect.y改为self.rect.bottom

    在这可以看出,键盘被按下后每次只改变1,现在修改这个值。在Settings类中添加一个player_change_speed属性,再把player_change_speed属性赋值给相应坐标的变化。这里注意,添加的属性再settings.py内,在player_plane.py中引用时,需要使用from settings import Settings 引入这个类。

    player_plane.py
    只需修改change_position()方法


    settings.py

    1.7.限制飞机移动范围

    程序中的screen_rect对象可以get到游戏窗口的矩形边框,rect对象可以get到飞机图像的矩形边框。可以通过他们的属性right、left、top、bottom,来限制飞机的移动范围。

    例如:我不想让飞机超出屏幕的下边缘,就可以让飞机图像的下边缘rect.bottom小于游戏窗口的下边缘screen_rect.bottom,那么我在Plane类中的change_position()方法中的if语句再加一个条件 rect.bottom < screen_rect.bottom,剩下左右和上边缘道理相同,不再赘述。
    修改Plane类的change_position()方法,如下代码。

    def change_position(self):
    '''根据移动标志改变飞机的位置'''
    if self.moving_right and self.rect.right < self.screen_rect.right:
    self.rect.centerx += self.player_settings.player_change_speed
    if self.moving_left and self.rect.left > 0:
    self.rect.centerx -= self.player_settings.player_change_speed
    if self.moving_up and self.rect.top > self.screen_rect.top:
    self.rect.bottom -= self.player_settings.player_change_speed
    if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
    self.rect.bottom += self.player_settings.player_change_speed

    1.8.文件目录

    现附上目录图


    完成第一部分后的文件目录大概是这个样子的。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐