文章目录

  • 介绍
  • 安装Pygame
  • 创建游戏场景
    • 创建背景
    • 创建设置类
    • 添加飞船

介绍

我们将练习使用Python中的Pygame来制作一个小游戏。游戏是一个叫做《外星人入侵》的打飞机小游戏。

Pygame是Python中很强大的一个库,他可以对游戏中的图形、动画乃至声音进行控制。

安装Pygame

Pygame下载网址:
https://pypi.org/project/pygame/#files
下载后使用python安装。

也可以使用pip安装:

pip install pygame

创建游戏场景

创建背景

正式开始前,可以了解一下pygame中最常用的对象rect·的相关概念:

本处暂略,可参考以下博客:
https://blog.csdn.net/qq_32966727/article/details/82320347

首先,我们创建一个空的Pygame窗口。
使用Pygame编写的游戏基本格式如下:

import sys
import pygamedef 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 pygamedef 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 = 1200self.screen_height = 800self.bg_color = (230, 230, 230)

同时也要在alien_invasion.py中修改:

import sys
import pygame
from settings import Settings
def run_game():# 初始化游戏并创建一个屏幕对象,设置和pygamepygame.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 pygameclass 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.centcrxself.rect.bottom = self.screen_rect.bottomdef 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 Shipdef run_game():# 初始化游戏并创建一个屏幕对象,设置和pygamepygame.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()

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

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

Python学习笔记(六)--游戏项目(1)相关推荐

  1. Python学习笔记六——画小猪佩奇

    目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...

  2. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

  3. python学习笔记六 初识面向对象上(基础篇)

    python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性是继承. ...

  4. 【懒懒的Python学习笔记六】

    大多数程序旨在最终解决用户问题,为此通常需要从用户那里输入信息,在本章学习中,我们将学习Python的raw_input()函数接受用户输入以及学习while循环来控制程序的运行. 函数raw_inp ...

  5. Python学习笔记六(Python time模块)

    通过python time模块提供的函数和方法可以获取与时间相关的操作,例如:获取系统时间,统计程序执行时间,WEB程序的响应时间等. 1)time.time(),该函数返回从1970年1月1日0点0 ...

  6. Python学习笔记(六)Python基础_数据类型——字符串

    文章目录 字符串 字符串输入 字符串拼接 字符串操作 字符串格式化 访问字符串中的值 字符串切片 字符串遍历 常用的字符串方法 字符串 字符串是 Python 中最常用的数据类型:一般以使用引号' ' ...

  7. python学习笔记六:Series

    Series是一种类似于一维数组的对象,由以下两部分组成: values:一组数据(ndarray或list类型) index:相关的数据索引标签 一维数组默认索引为0,1,2,3...,而Serie ...

  8. Python学习笔记(六)—几个标准类型内建函数

    比如说cmp(),str(),type(),repr()等等 cmp(a,b)比较a和b,根据比较的结果返回一个整数i. 当a<b时返回i<0;(即-1) 当a>b时返回i>0 ...

  9. Python学习笔记总结

    了解了python语言后,决定以后使用python来进行各项工作,因此一直想要深入学习python.千里之行始于足下,万事开头难. 由于最近在准备写毕业论文,陆陆续续学习了Python的语法知识. P ...

  10. python学习笔记(六)字典

    python学习笔记(六)字典 1.字典初见 python中的字典实际上就是一系列的"键-值"对(key-value),它们之间时无序的,每一个键都必须有与之对应的值,这个值可以是 ...

最新文章

  1. 笔记本电脑双显卡的切换技巧
  2. vuejs linux windows,vue.js环境在window和linux安装
  3. leetcode算法题--数组中重复的数字
  4. 文字超出部分显示..._matplotlib图形内的文字、注释、箭头
  5. android新闻管理,Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储...
  6. Java并发(八)——Fork/Join
  7. gcc include lib路径扩展
  8. 最新海洋CMS(海洋视频内容管理系统)V12.6版
  9. html水平排列三个元素,且三者占宽度相同
  10. OpenCL专题04:ViennaCL与Eigen双剑合璧
  11. <LeetCode天梯>Day004 买卖股票的最佳时机 II(DP动态规划法) | 初级算法 | Python
  12. 黑马全套Java教程(十一)
  13. 自定义SpringBoot启动图片banner -- 佛祖保佑 永不宕机 永无BUG
  14. 创建glance镜像报错HTTP403
  15. postgresql中连接两张表更新第三张表(updata)
  16. Android代码设置锁屏壁纸
  17. Eclipse自定义设置显示隐藏工具栏toolbar
  18. 女猎头联系程序员遭调戏,怒怼:你有病吧,色狼,妥妥的渣男!
  19. 如何用视频制作gif图?教你一键在线视频gif制作
  20. phh mysql语法_MySQLPHP语法

热门文章

  1. 安装cuda过程中出现running processes的提示
  2. c/c++/MFC变量转换
  3. ECharts 学习和使用——一切都在官网文档里
  4. python输出文本居中_#python PIL ImageDraw text 文本居中#
  5. 罗斯蒙特变送器三种常见故障
  6. JAVA计算机毕业设计学生自购书平台Mybatis+源码+数据库+lw文档+系统+调试部署
  7. POJ2891——Strange Way to Express Integers(一元线性同余方程组)
  8. 常用的利率定价 - jason的文章
  9. Java 枚举注解反射
  10. PHP计算两个时间戳相差多少个月