python入门_day12_chap12_游戏项目_基本框架

12.1首先安装pip,wheel和pygame。

昨天安装时候出现了错误:在cmd命令中可以import pygame.但是在shell中不行。需要将下好的四个pygame文件放到python的lib/site-packages里面才可以进行。
在这里插入图片描述

ps下载pygame时候需要注意版本号。

至于安装过程可参考网上的教程。

12.3开始游戏项目

现在来开始开发游戏《外星人入侵》。
首先创建一个空的Pygame窗口,供后面用来绘制游戏元素,如飞船和外星人。我们还将让这个游戏响应用户输入、设置背景色以及加载飞 船图像。

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

首先,我们创建一个空的Pygame窗口。使用Pygame编写的游戏的基本结构如下:
aline_invasion.py

import sys
import pygame

def run_game():
    #初始化游戏并且创建一个屏幕对象
    pygame.init()
    screen=pygame.display.set_mode((1200,800))
    pygame.display.set_caption("Alien Invasion")

    #开始游戏主循环
    while True:

        #监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                sys.exit()


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


run_game()

① 我们导入了模块sys 和pygame 。
模块pygame 包含开发游戏所需的功能。玩家退出时,我们将使用模块sys 来退出游戏。

② 游戏《外星人入侵》的开头是函数run_game() 。

pygame.init() 初始化背景设置,让Pygame能够正确地工作。
pygame.display.set_mode() 来创建一个名为screen 的显示窗口,这个游戏的所有图形元素都将在其中绘制。

实参(1200, 800) 是一个元组,指定了游戏窗口的尺 寸。通过将这些尺寸值传递给pygame.display.set_mode() ,我们创建了一个宽1200像素、高800像素的游戏窗口(你可以根据自己的显示器尺寸调整这些值)。

对象screen 是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。

display.set_mode() 返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。

为访问Pygame检测到的事件,我们使用方法pygame.event.get() 。所有键盘和鼠标事件都将促使for 循环运行。在这个循环中,我们将编写一系列的if 语句来检测并响应 特定的事件。例如,玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT 事件,而我们调用sys.exit() 来退出游戏。

pygame.display.flip() ,命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while 循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可 见。在我们移动游戏元素时,pygame.display.flip() 将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。 在这个基本的游戏结构中,最后一行调用run_game() ,这将初始化游戏并开始主循环。

2.设置背景色
import sys
import pygame

def run_game():
    #初始化游戏并且创建一个屏幕对象
    pygame.init()
    screen=pygame.display.set_mode((1200,800))
    pygame.display.set_caption("Alien 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()

首先,我们创建了一种背景色,并将其存储在bg_color 中。该颜色只需指定一次,因此我们在进入主while 循环前定义它。

在Pygame中,颜色是以RGB值指定的。这种颜色由红色、绿色和蓝色值组成,其中每个值的可能取值范围都为0~255。颜色值(255, 0, 0)表示红色,(0, 255, 0)表示绿色,而(0, 0, 255)表示蓝色。通过组合不同的RGB值,可创建1600万种颜色。在颜色值(230, 230, 230)中,红色、蓝色和绿色量相同,它将背景设置为一种浅灰色。 我们调用方法screen.fill() ,用背景色填充屏幕;这个方法只接受一个实参:一种颜色。

3.创建设置类

下面来编写一个名为settings 的模块,其中包含一个名为Settings 的类,用于将所有设置存储在一个地方,以免在代 码中到处添加设置。
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.init()
    ai_settings=Settings()    
    screen=pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien 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 类,调用pygame.init() ,再创建一个Settings 实例,并将其存储在变量ai_settings 中。创建屏幕时,使用 了ai_settings 的属性screen_width 和screen_height ;接下来填充屏幕时,也使用了ai_settings 来访问背景色。

12.4添加飞船图像

1.添加飞船图像

为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame方法blit() 绘制它。

在主项目文件夹(alien_invasion)中新建一个文件夹,将其命名为images,并将文件ship.bmp保存到这个文件夹中。

将图片变成,bmp的格式:
用画图工具打开再另存为即可。

选择用于表示飞船的图像后,需要将其显示到屏幕上。
我们将创建一个名为ship 的模块,其中包含Ship 类,它负责管理飞船的大部分行为。

ship.py

import pygame

class Ship():


    def __init__(self,screen):
        """ 初始化飞船并设置其初始位置"""
        self.screen=screen

        #加载飞船图像并获取其他外接矩形
        self.image=pygame.image.load('images/ship.bmp')
        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 blitime(self):
        """ 在指定位置绘制飞船"""
        self.screen.blit(self.image,self.rect)

首先,我们导入了模块pygame 。

Ship 的方法__init__() 接受两个参数:引用self 和screen ,其中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 坐标。

tip:在Pygame中,原点(0, 0)位于屏幕左上角,向右下方移动时,坐标值将增大。在1200×800的屏幕上,原点位于左上角,而右下角的坐标为(1200, 800)。

最后,,我们定义了方法blitme()它根据self.rect 指定的位置将图像绘制到屏幕上

2.在屏幕上绘制飞船

更新alien_invasion.py,使其创建一艘飞船,并调用其方法blitme():

import sys
import pygame

from settings import Settings
from ship import Ship

def run_game():
    #初始化游戏并且创建一个屏幕对象
    pygame.init()
    ai_settings=Settings()    
    screen=pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien 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()
5.重构:模块game_functions

game_functions.py

import sys
import pygame


def check_events():
    """ 响应键盘和鼠标事件"""
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

下面来修改alien_invasion.py,使其导入模块game_functions ,并将事件循环替换为对函数check_events() 的调用:

import pygame

from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():
    #初始化游戏并且创建一个屏幕对象
    pygame.init()
    ai_settings=Settings()    
    screen=pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #创建一艘飞船
    ship=Ship(screen)

    
    #开始游戏主循环
    while True:
        gf.check_events()


        #每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
        ship.blitme()


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


run_game()

运行结果:
在这里插入图片描述
2函数update_screen()
为进一步简化run_game() ,下面将更新屏幕的代码移到一个名为update_screen() 的函数中,并将这个函数放在模块game_functions.py 中:

import sys
import pygame


def check_events():
    """ 响应键盘和鼠标事件"""
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

def update_screen(ai_settings,screen,ship):
    
    #更新屏幕上的图像,并切换到新屏幕
    screen.fill(ai_settings.bg_color)
    ship.blitme()
    #让最近绘制的屏幕可见
    pygame.display.flip()

alien_invasion.py

import pygame

from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():
    #初始化游戏并且创建一个屏幕对象
    pygame.init()
    ai_settings=Settings()    
    screen=pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #创建一艘飞船
    ship=Ship(screen)

    
    #开始游戏主循环
    while True:
        gf.check_events()


        gf.update_screen(ai_settings,screen,ship)




run_game()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值