Python学习笔记43:游戏篇之外星人入侵(四)

43 篇文章 1 订阅
4 篇文章 0 订阅

前言

在前面的文章中,我们已经对项目进行了简单的分析,并且已经编写好了基础的代码,接下来的工作就是进一步的分析游戏的业务功能,在基础代码之上,进行填充。

背景颜色

我们简单的创建窗口以后,除了命名外暂时没有做特殊处理,背景颜色也是黑色的一片。我们使用书籍中的背景颜色进行填充。

我们找到main模块,将绘制屏幕的函数封装到gf模块中,因为每次循环以后除了简单的更新窗口屏幕,我们还需要刷新飞船,外星人,子弹的位置。

封装屏幕更新函数update_screen,填充背景色。

gf模块代码如下

import sys
import pygame


def check_event():
   --snip--


def update_screen(setting, screen):
    """绘制屏幕"""
    # 填充背景色
    screen.fill(setting.bg_color)
    # 让最近绘制的屏幕可见
    pygame.display.flip()

main模块代码如下

import pygame
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting


def run_game():
    """启动游戏"""

    # 初始化pygame
    pygame.init()
    # 定义一个系统设置对象
    setting = Setting()
    # 新建窗口
    screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
    # 窗口命名
    pygame.display.set_caption(setting.caption)

    while True:
        # 处理监听事件
        gf.check_event()
        # 刷新屏幕
        gf.update_screen(setting, screen)


if __name__ == '__main__':
    run_game()

这个时候执行程序,可以看到背景色已经不是黑色了。

在这里插入图片描述

飞船的加载

在游戏窗口弹出的时候,我们需要加载一个飞船对象,并且我们需要将飞船加载到指定的位置,通常来说,我们会将飞船放置到窗口的正中间。

我们要怎么实现这个功能呢?分成两步。

  • 我们需要在飞船的属性中,设置初始位置。
  • 我们需要一个函数,在窗口中绘制填充飞船。

修改代码如下:

import pygame


class Ship:
    def __init__(self, setting, screen):
        """初始化飞船并设置其初始位置"""
        self.screen = screen
        self.setting = setting
        # 加载图片并外接矩形
        self.image = pygame.transform.scale(
            pygame.image.load('E:/python_project/alien_invasion/assets/image/ship.bmp'), (50, 50))
        # 飞船外接的矩形
        self.rect = self.image.get_rect()
        # 窗口矩形
        self.screen_rect = screen.get_rect()
        # 将每艘新飞船放在屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

    def move(self):
        """移动飞船"""

    def blitme(self):
        """在指定位置绘制飞船"""
        self.screen.blit(self.image, self.rect)

前三行代码比较简单,先是飞船类中的screen对象和setting对相关使用构造函数传入的值进行赋值,然后是加载一个图片对象,这个图片对象明显就是我们飞船图像。

从这段代码self.rect = self.image.get_rect()开始看起。

我们加载飞船图片后,会在图片外接一个矩形。这个矩形的边界,就可以理解为我们飞船的边界。后面对于飞船位置的判断,都是使用这个外接矩形的边界来判定的,比如飞船移动到左边窗口边框,上边窗口边框等等。

接下来是self.screen_rect = screen.get_rect()

这个就是定义一个矩形使用游戏窗口矩形赋值,这个矩形的属性用于飞船位置的定位以及限制飞船的运行范围。

解释一下本次修改的代码:

  1. self.rect.centerx = self.screen_rect.centerx

    这段代码要和前面连着一起解读。前面已经定义图片的矩形和游戏窗口的矩形,这段代码也是一个赋值的代码,重点在于centerxcenterx 是在 Pygame 中获取屏幕宽度中心位置的一种方法。centerx也就是说这段代码将飞船外接矩形的中心坐标点的x坐标设置成了游戏弹窗的中心点x坐标。

  2. self.rect.bottom = self.screen_rect.bottom

    这段代码也需要和前面的一起连着,同样也是一个赋值的代码,这次赋值的是bottom。在Pygame中使用 .bottom 用于获取屏幕(或任何其他 Surface)底部边缘的 y 坐标。也就是说这段代码是将飞船外接矩形的底部y坐标用弹窗底部的y坐标。

    这两行代码是不是就是将图片外接矩形设置在在了底部中央的位置?x坐标是弹窗中心点的x坐标,y坐标是弹窗底部y坐标,稍微理解一下,画个图可能更好理解。

  3. self.screen.blit(self.image, self.rect)

    这个很好理解了,之前pygame基础讲过了,简单的填充代码。那么调用这个函数,就是在指定的screen的底部中央加载一个飞船。

这些代码理解后,我们现在需要做的就是,在main模块中定义一个飞船类,然后在屏幕更新的函数中,调用飞船对象的blitme函数即可。

那么main模块代码更新如下。

import pygame
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Ship


def run_game():
    """启动游戏"""

    # 初始化pygame
    pygame.init()
    # 定义一个系统设置对象
    setting = Setting()
    # 新建窗口
    screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
    # 窗口命名
    pygame.display.set_caption(setting.caption)
    # 定义一个飞船对象
    ship = Ship(setting, screen)

    while True:
        # 处理监听事件
        gf.check_event()
        # 刷新屏幕
        gf.update_screen(setting, screen, ship)


if __name__ == '__main__':
    run_game()

main模块中,定义了一个飞船类,并将这个类作为参数传递到update_screen函数中,对应update_screen函数也应该做出修改

import sys
import pygame


--snip--


def update_screen(setting, screen, ship):
    """更新屏幕"""
    # 填充背景色
    screen.fill(setting.bg_color)
    # 加载飞船
    ship.blitme()
    # 让最近绘制的屏幕可见
    pygame.display.flip()

在更新屏幕的函数中,我们使用ship对象调用自身的函数绘制一个飞船在游戏窗口底部中央的位置。

实际效果如下:
在这里插入图片描述

当然,由于我们前期已经做好了项目分析以及架构设计,我们的项目目录基本不会再变化,我们只需要想办法通过代码实现相应的功能,并讲代码编写在相应的模块即可。

结尾

通过本篇文章,我们已经成功将飞船加载到了指定的位置,那么接下来,我们就该让飞船动起来了!各位加油!!!

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值