文章目录[隐藏]
这是一个星战小游戏项目。
开发人员:郭安 陈进辉
起始时间: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 在屏幕上绘制飞船
叨叨几句... NOTHING