StarWar

发布于 2022-03-24  336 次阅读


这是一个星战小游戏项目。
开发人员:郭安 陈进辉
起始时间:2022/03/24
项目使用Python3.7以及Pygame库。
Pygame是一组功能强大而有趣的模块,可用于管理图形、动画乃至声音,能够轻松开发复杂游戏。通过使用Pygame来处理在品目上回值图像等任务,可将重点放在程序的高级逻辑上。

目标一

目标一:安装Pycharm,再创建一艘能根据用户输入左右移动和设计的飞船。
开发过程中,将学习如何管理包含多个文件的项目。重构很多代码并管理文件的内容,以确保项目组织有序以及提高效率。

1 Day_01

alien_invasion文件夹包含该项目的所有文件。

1.1 规划项目

《星战》描述

在游戏《星战》(StarWar)中,玩家控制以搜最初出现在屏幕底部中央的飞船。
玩家可以使用箭头键左右移动飞船,还可以使用空格键射击。
游戏开始,一群外星人出现在天空中,并向屏幕下方移动。
玩家任务:杀死外星人。
玩家将所有的外星人都消灭干净后,将出现一些新的外星人。并且速度更快。
只要有外星人撞到玩家的飞船或者到达屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。

1.2 安装Pygarm

python -m pip install --user pygame
# or 
python3 -m pip install --user pygame

2 开始游戏项目

目标

首先要创建一个空的Pygame窗口,供之后用来绘制游戏元素,如飞船和外星人。
让这个游戏响应用户输入,设置背景色,以及加载飞船图像。

2.1 创建Pygame窗口以及响应用户输入

下面创建一个表示游戏的类,以创建空的Pygame窗口。

# alien_invasion.py
import sys

import pygame

class AlienInvasion:
    """管理游戏资源和行为的类"""

    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()

        self.screen = pygame.display.set_mode((1200,800))
        pygame.display.set_caption("Star-war")

    def run_game(self):
        """开始游戏的主循环"""
        while True:
            # 监听键盘和鼠标事件
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # 让最近绘制的屏幕可见
            pygame.display.flip()

if __name__ == '__main__':
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

导入sys和pygame模块。模块pygame包含开发游戏所需的功能。玩家退出时,使用模块sys中的工具来退出游戏。
pygame.init()来初始化背景设置,让Pygame能够正确的工作。
Pygame.display.set_mode()来创建一个显示窗口。将这和窗口属性赋值给self.screen,让这个类中的所有方法都可以使用它。
赋给属性self.screen的对象是一个surface。在Pygame中,surface是屏幕的一部分。用于显示游戏元素。
display.set_mode()返回的suface表示整个游戏窗口。激活游戏的动画循环以后,每经过一次循环都将自动重绘这个surface,将用户输入触发的所有变化都反映出来。
这个游戏由方法run_game()控制。由while循环控制,包含一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏时执行的操作,如按键或移动鼠标,为程序响应事件,可编写一个事件循环,以侦听事件并根据发生的事件类型执行合适的任务。
为了访问Pygame检测到的事件,使用函数pygame.event.get().这个函数返回一个列表,其中包含它上一次被调用后发生的所有事件,所有的键盘事件都将导致这个for循环运行。在这个循环中,将编写一系列if语句来检测并响应特定的事件。
例如,当玩家单机窗口的关闭按钮时,将检测到pygamen.QUIT事件,进而调用sys.exit()来退出游戏。
pygame.display.flip(),命令pygame让最近绘制的屏幕可见。在这里,每执行while循环时都绘制一个空屏幕,并且擦去旧屏幕,使得只有新屏幕可见。
移动元素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并且在原来的位置隐藏元素,从而营造平滑移动效果。
在这个游戏末尾,创建一个游戏实例,并且调用run_game().这些代码放在一个if代码块中,仅当直接运行该文件时,它们才会执行。

2.2 设置背景色

Pygame默认创建一个黑色屏幕,想设置另外一种颜色。

# alien_invasion.py
import sys
import pygame

from settings import Settings
class AlienInvasion:
    """管理游戏资源和行为的类"""

    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()

        self.screen = pygame.display.set_mode((1200,800))
        pygame.display.set_caption("Star-war")
        # 设置背景色
        self.bg_color = (230,230,230)

    def run_game(self):
        """开始游戏的主循环"""
        while True:
            # 监听键盘和鼠标事件
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
            # 每次循环都重绘制屏幕
            self.screen.fill(self.bg_color)
            # 让最近绘制的屏幕可见
            pygame.display.flip()

if __name__ == '__main__':
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

调用方法fill()绘制这种背景填充色填充屏幕。方法fill()用于处理surface,只接受一种实参,一种颜色

2.3 创建设置类

每次给游戏添加新功能时,通常也加入一些新设置。
编写一个sttings的模块,在其中包含一个名为settings的类,用于将所有设置都存储在一个地方。以免在代码中导出添加设置。这样,每次需要访问设置时,只需要用一个设置对象。另外,在项目增大时,这使得修改游戏的外观和行为更加容易:要修改游戏时,只需要修改settings.py中的一些值,而无需查找散布在项目中的各项设置。

# settings.py
class Settings:
    """存储《星战》中所有设置的类"""

    def __init__(self):
        """初始化游戏的设置"""
        # 屏幕设置
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230,230,230)
# alien_invasion.py
import sys
import pygame

from settings import Settings
class AlienInvasion:
    """管理游戏资源和行为的类"""

    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Star-war")

    def run_game(self):
        """开始游戏的主循环"""
        while True:
            # 监听键盘和鼠标事件
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
            # 每次循环都重绘制屏幕
            self.screen.fill(self.settings.bg_color)
            # 让最近绘制的屏幕可见
            pygame.display.flip()

if __name__ == '__main__':
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

2.4 添加飞船图像

加载一副图像,使用Pygame方法blit()绘制它。

2.4.1 创建Ship类

创建一个名为ship的模块,其中包含ship类,负责管理飞船的大部分行为。

import pygame

class Ship:
    """管理飞船的类"""

    def __init__(self,ai_game):
        """初始化飞船并设置其初始位置"""
        self.screen = ai_game.screen
        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

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

在Pygame中,原点(0,0)位于屏幕左上角,右下角为(1200,800)这些坐标对应的是游戏窗口,而不是物理屏幕。

2.4.2 在屏幕上绘制飞船


擦肩而过的概率