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

在这个文件中;
首先,我们导入了模块syspygame

模块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__()接受两个参数:引用selfscreen,其中后者指定了要将飞船绘制到什么地方。为加载图像,我们调用了pygame.image.load(),这个函数返回一个表示飞船的surface,而我们将这个surface存储到了self.image中。

加载图像后,我们使用get_rect()获取相应surface的属性rect,处理rect对象时,可使用矩形四角和中心的x和y坐标。可通过设置这些值来指定矩形的位置。

要将游戏元素居中,可设置相应rect对象的属性centercenterxcentery。要让游戏元素与屏幕边缘对齐,可使用属性topbottomleftright;要调整游戏元素的水平或垂直位置,可使用属性xy,它们分别是相应矩形左上角的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()

在这样设计之后我们就可以运行,发现初步的背景已经设置成功。
(补充:为便于后续处理,这里替换了背景颜色和飞机图片)

在这里插入图片描述

之后的部分详见后续博客。

posted @   CK_0ff  阅读(178)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示