学习 Python 之 Pygame 开发魂斗罗(一)
创始人
2024-05-26 20:55:52
0

学习 Python 之 Pygame 开发魂斗罗(一)

  • Pygame
    • 回忆Pygame
      • 1. 使用pygame创建窗口
      • 2. 设置窗口背景颜色
      • 3. 获取窗口中的事件
      • 4. 在窗口中展示图片
        • (1). pygame中的直角坐标系
        • (2). 展示图片
        • (3). 给部分区域设置颜色
      • 5. 在窗口中显示文字
      • 6. 播放音乐
      • 7. 图片翻转与缩放
      • 8. 设置游戏帧率

Pygame

回忆Pygame

在之前的学习中,咱们使用Pygame开发出了坦克大战,这次再使用Pygame开发魂斗罗,如果有想学习开发坦克大战的小伙伴,可以看看下面的博客

学习 Python 之 Pygame 开坦克大战(一)

学习 Python 之 Pygame 开坦克大战(二)

学习 Python 之 Pygame 开坦克大战(三)

学习 Python 之 Pygame 开坦克大战(四)

学习 Python 之 Pygame 开坦克大战(五)

下面再回顾一下Pygame创建窗口、播放音乐等操作

Pygame的官方文档

函数名称作用返回值
pygame.display.init()初始化展示模块None
pygame.display.set_mode(size = (0, 0))初始化窗口(窗口就是一个Surface对象)Surface
pygame.display.set_caption(title, icontitle = None)设置窗口标题和图标None
pygame.Surface.fill(color, rect = None)用纯色填充表面Surface对象None
pygame.Color(b, g, r)创建用于颜色表示的Pygame对象Color
pygame.display.update()更新屏幕None
pygame.event.get()获取事件队列Eventlist
pygame.image.load(filename)从文件加载图片(图片跟窗口一样,也是Surface对象)Surface
pygame.Surface.get_rect()获取Surface对象的rect属性Rect
pygame.Surface.blit(source, dest, area = None)在一个Surface对象上显示另一个Surface对象Rect
pygame.font.init()初始化字体模块None
pygame.font.SysFont(name, size, bold = False, italic = False)从系统字体创建字体对象Font
pygame.font.render(text, antialias, color, background = None)创建一个带有指定字体的Surface对象Surface
pygame.mixer.init()初始化混合器模块None
pygame.mixer.Sound(filename)从文件创建声音对象Sound
pygame.mixer.Sound.play(loops = 0, maxtime = 0)播放音乐,loops参数控制播放次数,播放次数为loops + 1次。默认为0,表示声音不会重复,只播放一次。如果loops为-1,声音将无限循环Channel
pygame.mixer.Sound.stop()声音停止播放None
pygame.mixer.Sound.set_volume(value)设置音量None
pygame.transform.flip(surface, flip_x, flip_y)图片翻转Surface
pygame.transform.scale(surface, size)将图片(Surface对象)调整为大小为(width, height)的新图片Surface
pygame.time.Clock()用于帮助跟踪时间以及控制游戏帧速率的类Clock
pygame.time.Clock.tick(framerate = 0)设置游戏运行的帧率milliseconds
pygame.time.Clockget_fps()计算游戏的帧速率(以帧每秒为单位)float

1. 使用pygame创建窗口

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')

创建结果

在这里插入图片描述

窗口一闪而过

2. 设置窗口背景颜色

# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)# 更新窗口
pygame.display.update()

完整代码

import pygame
import time# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)# 更新窗口
pygame.display.update()# 让程序休眠200秒,方便观察窗口的变化
time.sleep(200)

在这里插入图片描述
不要忘记更新窗口,否则不会显示颜色的

实际上,颜色可以不用使用 pygame.Color(blue, green, red) 来创建,直接使用元组的方式

WHITE = (255, 255, 255)

这样的方式传入

window.fill(WHITE)

也是可以生效的,为了方便直接用红绿蓝序列即可

3. 获取窗口中的事件

def getWindowEvent():for event in pygame.event.get():# 点击窗口右上角的关闭触发的事件if event.type == pygame.QUIT:sys.exit()# 鼠标按下事件elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint('鼠标按下, 鼠标位置({x}, {y})'.format(x = x, y = y))# 鼠标抬起事件elif event.type == pygame.MOUSEBUTTONUP:print('鼠标抬起')# 键盘按键按下事件elif event.type == pygame.KEYDOWN:print('键盘按键按下')# 具体键盘事件触发if event.key == pygame.K_j:print('按下键盘 j 键')# 键盘按键抬起事件elif event.type == pygame.KEYUP:print('键盘按键抬起')

完整代码

import pygame
import sysdef getWindowEvent():for event in pygame.event.get():# 点击窗口右上角的关闭触发的事件if event.type == pygame.QUIT:sys.exit()# 鼠标按下事件elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint('鼠标按下, 鼠标位置({x}, {y})'.format(x = x, y = y))# 鼠标抬起事件elif event.type == pygame.MOUSEBUTTONUP:print('鼠标抬起')# 键盘按键按下事件elif event.type == pygame.KEYDOWN:print('键盘按键按下')# 具体键盘事件触发if event.key == pygame.K_j:print('按下键盘 j 键')# 键盘按键抬起事件elif event.type == pygame.KEYUP:print('键盘按键抬起')# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)while 1:# 获取键盘事件getWindowEvent()# 更新窗口pygame.display.update()

运行后按下鼠标左键,键盘s键,键盘w键

结果

鼠标按下, 鼠标位置(355, 170)
鼠标抬起
键盘按键按下
键盘按键抬起
键盘按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
W按键按下
键盘按键抬起

系统的事件都具有一组成员属性。下面是事件类型及其特定属性的列表图(图片来源链接)
在这里插入图片描述
在 学习 Python 之 Pygame 开坦克大战(一)中,我们使用的是另一种形式,这两种差别不大,大家仔细对比一下

在上面的结果中,“W按键按下”打印的次数与窗口的帧率有关系,在下面我们会说到

4. 在窗口中展示图片

(1). pygame中的直角坐标系

在这里插入图片描述

(2). 展示图片

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')# 设置图片路径
path = '../Image/Map/第一关BG.png'
# 加载图片
image = pygame.image.load(path)
# 获取直角坐标
rect = image.get_rect()
# 设置图片的位置,在(0,0)处加载图片
rect.left = 0
rect.top = 0
# 在窗口显示
window.blit(image, rect)while 1:# 更新窗口pygame.display.update()

在这里插入图片描述

(3). 给部分区域设置颜色

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)# 给部分区域设置颜色
rect = pygame.Rect(200, 200, 200, 300)
REGION_COLOR = pygame.Color(50, 50, 150)
window.fill(REGION_COLOR, rect)while 1:# 更新窗口pygame.display.update()

在这里插入图片描述

5. 在窗口中显示文字

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')# 设置文字内容
text = 'Hello Pygame'# 初始化字体
pygame.font.init()
# 设置文字字体和大小
fontSize = 16
font = pygame.font.SysFont('georgia', fontSize)
# 加载文字并设置颜色
fontColor = pygame.Color(255, 255, 255)
fontObject = font.render(text, True, fontColor)
# 设置展示位置
position = (50, 50)
# 展示文字
window.blit(fontObject, position)while 1:# 更新窗口pygame.display.update()

运行结果

在这里插入图片描述

6. 播放音乐

import pygame# 初始化混合器模块
pygame.mixer.init()
# 加载音乐
sound = pygame.mixer.Sound('./star.wav')
# 播放音乐
sound.play()

7. 图片翻转与缩放

import time
import pygamedef enlarge(image: pygame.Surface, scale):"""缩放图片:param image: 要缩放的图片:param scale: 图片缩放尺寸:return: 缩放后的图片"""# 获取图片大小rect = image.get_rect()# 长宽扩大 scale 倍largeSize = (int(rect.width * scale), int(rect.height * scale))# 对图片缩放large = pygame.transform.scale(origin, largeSize)return largedef flip(image: pygame.Surface, h, v):"""图片翻转:param image: 要翻转的图片:param h: 是否水平翻转:param v: 是否上下翻转:return: 翻转后的图片"""return pygame.transform.flip(image, h, v)# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')# 加载原图
origin = pygame.image.load('../Image/Map/第一关BG.png')
# 显示原图
rect = origin.get_rect()
rect.x = 0
rect.y = 0
window.blit(origin, rect)# 更新窗口
pygame.display.update()
time.sleep(2)# 图片缩放2.5倍
large = enlarge(origin, 2.5)
# 显示原图
rect = large.get_rect()
rect.x = 0
rect.y = 0
window.blit(large, rect)# 更新窗口
pygame.display.update()
time.sleep(2)# 图片翻转
img = flip(large, True, False)
# 显示原图
rect = img.get_rect()
rect.x = 0
rect.y = 0
window.blit(img, rect)# 更新窗口
pygame.display.update()
time.sleep(2)

先看看原图
在这里插入图片描述

放大2.5倍的图

在这里插入图片描述
翻转图片,这里是左右翻转,图片的最后是BOSS关,翻转过来就先显示BOSS关卡啦

水平翻转大家可以自己试一试

在这里插入图片描述
自己封装的图片缩放函数

def enlarge(image: pygame.Surface, scale):"""缩放图片:param image: 要缩放的图片:param scale: 图片缩放尺寸:return: 缩放后的图片"""# 获取图片大小rect = image.get_rect()# 长宽扩大 scale 倍largeSize = (int(rect.width * scale), int(rect.height * scale))# 对图片缩放large = pygame.transform.scale(origin, largeSize)return large

自己封装的图片翻转函数

def flip(image: pygame.Surface, h, v):"""图片翻转:param image: 要翻转的图片:param h: 是否水平翻转:param v: 是否上下翻转:return: 翻转后的图片"""return pygame.transform.flip(image, h, v)

8. 设置游戏帧率

创建一个对象来帮助跟踪时间,并设置帧率

clock = pygame.time.Clock()
fps = 60

在循环中设置帧率,并把帧率显示在标题上

while 1:# 设置帧率clock.tick(fps)r = clock.get_fps()caption = 'Contra - {:.2f}'.format(r)pygame.display.set_caption(caption)# 更新窗口pygame.display.update()

完整代码

import pygame# 初始化展示模块
pygame.display.init()# 设置窗口大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Contra')clock = pygame.time.Clock()
fps = 60while 1:# 设置帧率clock.tick(fps)r = clock.get_fps()caption = 'Contra - {:.2f}'.format(r)pygame.display.set_caption(caption)# 更新窗口pygame.display.update()

看看结果,可以看到窗口上有帧率显示了,60表示 1秒窗口要刷新60次
在这里插入图片描述

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...