第八章:用pygame制作游戏

第一节:关于pygame

pygame库

Pygame 是python game的缩写,Pygame是一个包含图像、声音,建立在SDL基础上的、专门用于制作和开发图形化的计算机游戏库,SDL(全名Simple DirectMedia Layer),传言是Sam Lantinga写的,为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,已经倒闭)更有效的工作,创造了pygame.,但百度说作者是Pete Shinners,具体读者可再深究确定。
Pygame就是Python中使用它的一个库(或者称模块)。Pygame已经存很长的时间,一直都在更新和完善中。使得游戏制作变得非常容易和简单

在这里插入图片描述

pygame的安装

pygame不是python所附带的,需要第三方库的支持和下载。但它可以完全免费地使用。

【方式一】正常下载
点击在线下载网址: https://pygame.org.
在这里插入图片描述
注:需根据不同的操作系统及所安装的python版本,选择正确的安装程序
windows系统:下载相对应的python版本的msi文件。例:pygame-1.9.1.win32-py3.2.msi
Mac系统:下载.zip文件或.dmg文件并运行它们。
Linux系统:打开终端并运行“sudo apt-get install python-pygame”

【方式二】推荐下载
在pycham或其他编缉器、或直接电脑终端输入下面代码,等下载进度条完成后就OK

pip3 install pygame

在这里插入图片描述
在这里插入图片描述

pygame的使用

使用pygam库和其他模块一样,直接使用import 就可以了,但是值得注意的是pygame模块除了封装了固定的函数之外,还对部份的变量和常量进行了设置,因此在调用pygame模块的同时,一般也会把pygame.locals也一起调用,方便后续常量的操作。

import pygame
from pygame.locals import *

# 电脑检查工具包是否完整
pygame.init()

第二节:搭建游戏界面

游戏的窗口

在pygame中,所有的游戏都需要一个窗口进行演示,称为“游戏的舞台”
pygame.display.set_mode( (x, y) ) ———— 窗口设置,参数x、y指的是窗和高,需元组类型
pygame.display.set_caption("标题") ———— 设置窗口标题,标题名为字符串

游戏循环与游戏状态

在pygame游戏制作中,常常会使用到循环——while True ,该循环会处理以下三个事情:
1、循环地监听用户的按键或控制操作,并做出反应
2、循环地更新游戏的状态。
3、根据用户操作或代码运行,循环地绘制游戏状态或内容。
直到主动或被动地终此循环,以此保证实时画面的进行。

import pygame
form pygame.locals import *

pygame.init( )
# 设置游戏的窗口
screen = pygame.display.set_mode((400,400))
# 设置窗口的标题
pygame.display.set_caption("我的游戏窗口")
# 开启游戏循环
while True:
	#下面是保证窗口安全退出条件(必写)
	all_event = pygame.event.get()
	for e in all_event:
		if e.type == QUIT:
			exit()

运行结果:
在这里插入图片描述

窗口的背景色

前期的内容中,也讲过颜色的表示方法,除了颜色的单词外,还可以使用光的三颜色:红®、绿(G)、蓝(B).通过3种颜色不同的量组合成任何颜色。颜色的量值最低为0,最高为255.pygame的有关颜色的内容,也多用此方法表示颜色。

在这里插入图片描述

要对窗口进行背景色的设置,便要了解Surface的概念。Surface是“表面”的意思,也是pygame的Surface对象,可以理解为如果你想对窗口进行颜色的设置,必须创建一个可以除上颜色的对象,然后把它粘贴在窗口上。
.
【常用API】
Surface.fill(( r, g, b )) ———— 填充颜色,背景的Surface,一般都是窗口下创建的对象
pygame.display.update() ———— 刷新窗口

例:蓝色背景的窗口

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((700, 500))

# 屏幕对象填充背景色
screen.fill( (  0,  0, 255) )

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    pygame.display.update()   #刷新

运行结果:
在这里插入图片描述

刷新窗口

pygame创建Surface对象后,需要对窗口进行刷新,否则对象将不可见。pygame有几个可以刷新窗口的方法。但常见的只有两种。
.
pygame.display.update() ———— 刷新窗口
Surface.display.flap( ) ———— 效替弹出。flap就是弹出的意思,除了正常的刷新功能,在双缓冲模式下,flip()可用来切换活动屏幕和缓冲区(这里不再做介绍)。

例:蓝色背景的窗口(新的刷新方式)

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((700, 500))

# 屏幕对象填充背景色
screen.fill( (  0,  0, 255) )

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    # 交替显示
	pygame.display.flip( )

运行结果:
在这里插入图片描述

第三节:事件的发生与铵钮状态

监听事件

游戏循环可以不断地监听用户的按键或控制操作,并做出反应。用户的每一个动作都可以称为一个事件,当这些动作发生时,Pygame库就会创建一个pygame.enent.Event对象来记录事件的发生。这便是程序的监听。
pygame.event.get() ———— 获取事件,返回是列表,监控并记录着用用户的操作过的事情

import pygame
from pygame.locals import *

pygame.init( )
screen = pygame.display.set_mode((400,400))

while True:
	# 获取所有事件,返回事件列表
    all_event = pygame.event.get()
    print(all_event)
    
    for e in all_event:
        if e.type == QUIT:
            exit()

运行结果:(手动按了一推按钮。。。)
在这里插入图片描述

常见的事件

在这里插入图片描述

**事件的触发属于哪种事件,可以使用 e.type 进行查看,实即上pygame早就定义了一些变量对这些事件进行了命名,还对它们进行了赋值。值与常量是等效的 **

例:退出也是一个操作事件,就是常量是Quit,对应值是12

import pygame
from pygame.locals import *

pygame.init( )
screen = pygame.display.set_mode((400,400))

while True:
    all_event = pygame.event.get()
    for e in all_event:
        print(e.type)
        if e.type == QUIT:  #或者写 if e.type == 12: 也可
            exit()

运行结果:
在这里插入图片描述

安全退出条件

基实我们已经接触了安全退出条件了,QUIT是pygame.locals的常量。有了它点击关闭按钮时就可以正常退出程序。pygame.event.get()可以返回一个列表,用于检测按钮的状态。而每一种可能发生的按钮状态类型,其实在pygame.locals中都有一个常量变量。e.type == QUIT就是判断是否发生了 QUIT这个退出按钮。除了exit(),还有 quit() 也可以安全退出程序.
【区别】
quit()调用的是pygame库的退出方法,终止pygame的使用。而exit()则是调用系统库的方法直接退出程序。

例:使用quit()

import pygame
from pygame.locals import *

pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
    all_event = pygame.event.get()
    for e in all_event:
        if e.type == QUIT:
            quit( )

按钮状态

**事件,可以描述用户到底执行了何种操作,监听可以记录所有用户的的操作和顺序,但具体的操作是无法再进行描述的。比如按钮的按下和弹起事件,具体按下了键盘上的哪一个按钮。pygame对此常常会进一步使用按钮状态来进行描述。
pygame.mouse.get_pressed( ) ———— 鼠标按钮检测,返回一个三元组对象
pygame.mouse.get_pos( ) ———— 鼠标坐标检测,返回一个元组对象,指的是窗口内的像素座标
pygame.key.get_pressed( ) ———— 键盘按钮检测,返回一个布尔值长元组。这个元组的元素就是键值,对应的就是按键是否按下。
**

例1:获取鼠标的按钮状态

import pygame
from pygame.locals import *

pygame.init( )
screen = pygame.display.set_mode((400,400))

while True:
    all_event = pygame.event.get()
    for e in all_event:
        if e.type == QUIT:
            exit()
        # 如果发生了鼠标按下事件
        elif e.type == MOUSEBUTTONDOWN:
            #获取鼠标的按钮状态
            pre = pygame.mouse.get_pressed()
            print( pre )

运行结果:(鼠标一堆操作后。。。)
在这里插入图片描述
例2:获取鼠标坐标位置

import pygame
from pygame.locals import *

pygame.init( )
screen = pygame.display.set_mode((400,400))

while True:
    all_event = pygame.event.get()
    for e in all_event:
        if e.type == QUIT:
            exit()
        # 如果发生了鼠标移动事件
        elif e.type == MOUSEMOTION:
            #获取鼠标的坐标位置
            pos = pygame.mouse.get_pos()
            print(pos)

运行结果:
在这里插入图片描述

例3:获取键盘按钮状态(这里按下了Esc键为例)

import pygame
from pygame.locals import *

pygame.init( )
screen = pygame.display.set_mode((400,400))

while True:
    all_event = pygame.event.get()
    for e in all_event:
        if e.type == QUIT:
            exit()
    # 获取所有键盘按钮状态
    keys = pygame.key.get_pressed()
    print(keys)
    print(len(keys))

在这里插入图片描述

常见的键盘常量

当我们按下并释放键盘按钮时,会触发pygame .KEYDOWN和 pygame .KEYUP事件,并形成一个列表。这两个事件都有一个 key属性,该属性系统都对它们设定了一个常量作为名字,代表键盘上的每个键,这叫键盘常数,键盘常数很多,以下是所有键盘常量的列表。
在这里插入图片描述
例:对keys的K_ESCAPE所代表的按键状态进行监听,如果发生了变化,立即打印出一句话“Esc键被按下了”

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((500, 500))
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        print("Esc键被按下了")
        print(keys)

运行结果:
在这里插入图片描述

小游戏01:变色的鼠标

import os, pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((255, 250))
pygame.display.set_caption("Alien Invasion")
# 创建字体对象,设置字体样式和大小
font = pygame.font.Font(None, 30)
# 设置文字内容和颜色
text = font.render('Cliked Me please!!!', True, (34, 252, 43))
# 初始化空坐标
x = 0
y = 0

while True:
    for e in pygame.event.get():
        if e.type == QUIT:
            exit()
        # 鼠标按下事件
        elif e.type == MOUSEBUTTONDOWN:
            # 检测鼠标按键,返回元组对象
            pressed_array = pygame.mouse.get_pressed()

            if pressed_array == (1, 0, 0):
                print("你按下了鼠标左键!")
            elif pressed_array == (0, 0, 1):
                print("你按下了鼠标右键!")
            elif pressed_array == (0, 1, 0):
                print("你按下了鼠标滚轮!")
            else:
                print("你滑动了鼠标的滚轮")
        elif e.type == MOUSEMOTION:
            # 获取鼠标在窗口处的坐标
            pos = pygame.mouse.get_pos()
            x = pos[0]
            y = pos[1]
            print(x, y)

    # 根据坐标改变红色和绿色

    screen.fill((x, y, 0))

    # 绘制文字
    screen.blit(text, (40, 100))
    # 把绘制的效果显示在屏幕上
    pygame.display.update()

运行结果:
在这里插入图片描述

第四节:绘制精灵

精灵的绘制

1、加载精灵

所谓“精灵”,这里其实指是就是图片的意思。其实我们所玩的游戏里面的角色都是一张张的图片。Pygame它能够从png、jpg、gif、bmp等图像文件中,通过pygame.image.load()的方法,将图像加载到Surface(表面)上。Image是图像,而load是加载的意思。加载图片需要在括号里传递图片字符串路径,它会返回一个图片Surface对象。
另外,在Pygame中,仅仅加载图片是无法在游戏窗口显示的,还需要把加载好的图片绘制出来并更新.这就要用到screen.blit()的方法
pygame.image.load(path)————加载图片,需要传递图片字符串路径,返回一个图片Surface对象。
screen.blit(imgName,(x,y)) ———— 传输(绘制)图片
pygame.display.update() ———— 画面更新

例:绘制当前目录下的images文件夹的三张图片
在这里插入图片描述 在这里插入图片描述

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((960, 720))
# 分别加载三张图片
db = pygame.image.load( 'images/地堡.png' )
zom = pygame.image.load( 'images/Zombie.png' )
me = pygame.image.load( 'images/me.png' )

while True:
    for event in pygame.event.get( ):
        if event.type == QUIT:
             exit()
    #分别绘制三张图片
    screen.blit(db, (0, 0))
    screen.blit(zom, (100, 300))
    screen.blit(me, (500, 100))
    # 刷新游戏
    pygame.display.update()

运行结果:
在这里插入图片描述

2、初始化位置

在Pygame中,角色往往都是会移动的、可操控的,对非固定的角色,位置坐标需要初始化,这样移动时可根据变量改变坐标的位置。

例:初始化人物坐标位置(修正上例)

import pygame
from pygame.lo
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值