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

2年前未命名247
学习 Python 之 Pygame 开发魂斗罗(一) _DiMinisH 已于2023-02-24 10:12:02修改 1438 收藏 19 分类专栏: Python 文章标签: python pygame 学习 于2023-02-23 23:58:36首次发布 Python 专栏收录该内容 20 篇文章 2 订阅 订阅专栏

学习 Python 之 Pygame 开发魂斗罗(一) Pygame回忆Pygame1. 使用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()初始化展示模块Nonepygame.display.set_mode(size = (0, 0))初始化窗口(窗口就是一个Surface对象)Surfacepygame.display.set_caption(title, icontitle = None)设置窗口标题和图标Nonepygame.Surface.fill(color, rect = None)用纯色填充表面Surface对象Nonepygame.Color(b, g, r)创建用于颜色表示的Pygame对象Colorpygame.display.update()更新屏幕Nonepygame.event.get()获取事件队列Eventlistpygame.image.load(filename)从文件加载图片(图片跟窗口一样,也是Surface对象)Surfacepygame.Surface.get_rect()获取Surface对象的rect属性Rectpygame.Surface.blit(source, dest, area = None)在一个Surface对象上显示另一个Surface对象Rectpygame.font.init()初始化字体模块Nonepygame.font.SysFont(name, size, bold = False, italic = False)从系统字体创建字体对象Fontpygame.font.render(text, antialias, color, background = None)创建一个带有指定字体的Surface对象Surfacepygame.mixer.init()初始化混合器模块Nonepygame.mixer.Sound(filename)从文件创建声音对象Soundpygame.mixer.Sound.play(loops = 0, maxtime = 0)播放音乐,loops参数控制播放次数,播放次数为loops + 1次。默认为0,表示声音不会重复,只播放一次。如果loops为-1,声音将无限循环Channelpygame.mixer.Sound.stop()声音停止播放Nonepygame.mixer.Sound.set_volume(value)设置音量Nonepygame.transform.flip(surface, flip_x, flip_y)图片翻转Surfacepygame.transform.scale(surface, size)将图片(Surface对象)调整为大小为(width, height)的新图片Surfacepygame.time.Clock()用于帮助跟踪时间以及控制游戏帧速率的类Clockpygame.time.Clock.tick(framerate = 0)设置游戏运行的帧率millisecondspygame.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.pos print('鼠标按下, 鼠标位置({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 sys def getWindowEvent(): for event in pygame.event.get(): # 点击窗口右上角的关闭触发的事件 if event.type == pygame.QUIT: sys.exit() # 鼠标按下事件 elif event.type == pygame.MOUSEBUTTONDOWN: x, y = event.pos print('鼠标按下, 鼠标位置({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 pygame 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) # 初始化展示模块 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 = 60 while 1: # 设置帧率 clock.tick(fps) r = clock.get_fps() caption = 'Contra - {:.2f}'.format(r) pygame.display.set_caption(caption) # 更新窗口 pygame.display.update()

看看结果,可以看到窗口上有帧率显示了,60表示 1秒窗口要刷新60次

标签: [db:标签TAG]

相关文章

行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)

行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)...

刚来的00后太卷了,上班还没2年,跳到我们公司起薪25k....

刚来的00后太卷了,上班还没2年,跳到我们公司起薪25k.......

【MySQL】深入学习B+索引的使用

【MySQL】深入学习B+索引的使用...

2023编程语言趋势

2023编程语言趋势...

让ChatGPT介绍一下ChatGPT

让ChatGPT介绍一下ChatGPT...

【Spring】IOC,你真的懂了吗?

【Spring】IOC,你真的懂了吗?...