Python学习笔记(六)--游戏项目(1)
介绍
我们将练习使用Python中的Pygame来制作一个小游戏。游戏是一个叫做《外星人入侵》的打飞机小游戏。
Pygame是Python中很强大的一个库,他可以对游戏中的图形、动画乃至声音进行控制。
安装Pygame
Pygame下载网址:
https://pypi.org/project/pygame/#files
下载后使用python安装。
也可以使用pip安装:
pip install pygame
创建游戏场景
创建背景
首先,我们创建一个空的Pygame窗口。
使用Pygame编写的游戏基本格式如下:
import sys
import pygame
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
screen = pygame.display.set_mode((1200,800))
pygame.display.set.capation("Aline Invasion")
#游戏主循环
while True:
#监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#让最近绘制的屏幕可见
pygame.display.flip()
run_game()
注意,为了方便管理这个项目,我们将创建一个文件夹,所有的模块、素材和程序文件都将放在这个文件夹中。在文件夹中,我们首先新建一个主文件。我们将这个文件命名为alien_invasion.py
。
在这个文件中;
首先,我们导入了模块sys
和pygame
。
模块pygame
包含开发游戏所需的功能。玩家退出时,我们将使用模块sys
来退出游戏。
pygame.init()
初始化背景设置,让Pygame能够正确地工作。
调用pygame.display.set_mode()
来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制,实参(1200, 800)是一个元组,指定了游戏窗口的尺寸。
对象screen
是一个surface
。在Pygame中,surface
是屏幕的一部分,用于显示游戏元素。
为访问Pygame检测到的事件,我们使用方法pygame.event.get()
。所有键盘和鼠标事件都将促使for循环运行。在这个循环中,我们将编写一系列的if语句来检测并响应特定的事件。例如,玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT
事件,而我们调用sys.exit()
来退出游戏。
pygame.display.flip()
命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元素时,pygame.display.flip()
将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。
我们可以更改背景的颜色:
bg_color = (230, 230, 230)
# 每次循环时都重绘屏幕
screen.fill(bg_color)
完整代码:
import sys
import pygame
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
screen = pygame.display.set_mode((1200,800))
pygame.display.set.capation("Aline Invasion")
bg_color = (230, 230, 230)
#游戏主循环
while True:
#监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
screen.fill(bg_color)
#让最近绘制的屏幕可见
pygame.display.flip()
run_game()
该颜色只需指定一次,因此我们在进入主while循环前定义它。
在Pygame中,颜色是以RGB值指定的。这种颜色由红色、绿色和蓝色值组成,其中每个值的可能取值范围都为0~255。颜色值(255, 0, 0)表示红色,(0, 255, 0)表示绿色,而(0, 0, 255)表示蓝色。通过组合不同的RGB值,可创建1600万种颜色。在颜色值(230, 230, 230)中,红色、蓝色和绿色量相同,它将背景设置为一种浅灰色。
我们调用方法screen.fill(),用背景色填充屏幕;这个方法只接受一个实参:一种颜色。
创建设置类
每次给游戏添加新功能时,通常也将引入一些新设置。下面来编写一个名为settings的模块,其中包含一个名为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
def run_game():
# 初始化游戏并创建一个屏幕对象,设置和pygame
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set.capation("Aline Invasion")
#游戏主循环
while True:
#监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
#让最近绘制的屏幕可见
pygame.display.flip()
run_game()
注意我们用settings
中的量来代替了主文件alien_invasion.py
中的参数。
添加飞船
为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame方法blit()
绘制它。
我们使用这张图片来作为飞船(可替换)
并将其命名为ship.bmp(注意是bmp格式图片)
我们在项目的文件夹中新建一个images文件夹,并将图片放置其中。
选择用于表示飞船的图像后,需要将其显示到屏幕上。我们将创建一个名为ship的模块,其中包含Ship类,它负责管理飞船的大部分行为。
ship.py
import pygame
class ship():
def __init__(self,screen):
self.screen = screen
#加载飞船图片并获取其外接矩形
self.image = pygame.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# 将每艘新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centcrx
self.rect.bottom = self.screen_rect.bottom
def blime(self):
""""在指定位置绘制飞船"""
self.screen.bilt(self.image,self.rect)
首先,我们导入了模块pygame。Ship的方法__init__()
接受两个参数:引用self
和screen
,其中后者指定了要将飞船绘制到什么地方。为加载图像,我们调用了pygame.image.load()
,这个函数返回一个表示飞船的surface
,而我们将这个surface
存储到了self.image
中。
加载图像后,我们使用get_rect()
获取相应surface
的属性rect
,处理rect对象时,可使用矩形四角和中心的x和y坐标。可通过设置这些值来指定矩形的位置。
要将游戏元素居中,可设置相应rect对象的属性center
、centerx
或centery
。要让游戏元素与屏幕边缘对齐,可使用属性top
、bottom
、left
或right
;要调整游戏元素的水平或垂直位置,可使用属性x
和y
,它们分别是相应矩形左上角的x和y坐标.
我们将把飞船放在屏幕底部中央。为此,首先将表示屏幕的矩形存储在self.screen_rect
中,再将self.rect.centerx
(飞船中心的x坐标)设置为表示屏幕的矩形的属性centerx
,并将self.rect.bottom
(飞船下边缘的y坐标)设置为表示屏幕的矩形的属性bottom
。Pygame将使用这些rect
属性来放置飞船图像,使其与屏幕下边缘对齐并水平居中。
我们最后定义了方法blitme()
,它根据self.rect
指定的位置将图像绘制到屏幕上。
完成后我们要更新alien_invasion.py
文件:
import sys
import pygame
from settings import Settings
from ship import Ship
def run_game():
# 初始化游戏并创建一个屏幕对象,设置和pygame
pygame.init()
#seting类
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Aline Invasion")
#创建一艘飞船
ship = Ship(screen)
#游戏主循环
while True:
#监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme() # 重绘飞船
#让最近绘制的屏幕可见
pygame.display.flip()
run_game()
在这样设计之后我们就可以运行,发现初步的背景已经设置成功。
(补充:为便于后续处理,这里替换了背景颜色和飞机图片)
之后的部分详见后续博客。
本文来自作者:CK_0ff,转载请注明原文链接:https://www.cnblogs.com/Ck-0ff/p/15841266.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)