100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 15. python从入门到精通——Pygame游戏编程

15. python从入门到精通——Pygame游戏编程

时间:2018-12-29 15:14:08

相关推荐

15. python从入门到精通——Pygame游戏编程

目录

游戏的原理

安装Pygame

Pygame常用模块

Pygame的基本使用

实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向

实现步骤:

运行效果:

小球图片:

python代码:

开发Flappy Bird游戏

游戏简介:

运行效果:

图片素材

游戏分析

以面向对象的思维方式来分析一下这个游戏可以归纳为两个对象

小鸟:

管道:

碰撞检测:

实现步骤

python代码

游戏的原理

窗口:游戏中也有窗口的概念,游戏中的角色都需要再窗口中显示

资源:是指游戏中的背景、角色、声音等

坐标:在Pygame中有横轴和纵轴。例如在植物大战僵尸中不断修改僵尸的坐标可以实现动画效果

注意:Pygame中坐标0,0在创建窗口的左上角,向右则X坐标越大;向下则Y坐标越大

运行流程:在python中程序是由上至下执行的,执行完就结束了游戏窗口随之关闭。为了能够让窗口一直显示需要设置一个死循环,可以用while True 语句实现。当执行地一边的时候在窗口中添加背景图片、角色,第二遍同样添加背景图片但是每次循环更新角色坐标。当频率到至少24次每秒我们肉眼就只会感觉到画面和角色是一直存在的从而实现了动画效果

安装Pygame

Pygame:是python中的模块,专用于二D游戏开发,要使用它需要先安装它

安装命令:pip install pygame

如果超时:pip install -i /simple/ --trusted-host pygame

Pygame常用模块

Pygame官网

优势:Pygame做游戏开发的优势在于不需要过多考虑与底层开发相关的内容,而可 以把工作重心放在游戏逻辑上。

1. 常用模块:

2. display模块的常用方法

3. Surface对象的常用方法

示例:创建窗口流程,也是大部分创建Pygame的流程

import sys # 导入sys模块import pygame # 导入pygame模块pygame.init() # 初始化pygame,检查游戏需要的一些硬件调用接口、系统功能接口是否有问题size = width, height = 640, 480 # 设置窗口大小screen = pygame.display.set_mode(size) # 显示窗口但是执行完程序就会关闭窗口while True:# 获取所有的事件,例如点击窗口的时间、按下键盘的事件。由于事件的类型很多,程序不知道发生了哪一类事件所以需要不断的循环判断for event in pygame.event.get():if event.type == pygame.QUIT: # 如果点击关闭窗口,则退出pygame.quit() # 退出pygamesys.exit() #推出系统

Pygame的基本使用

实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向

实现步骤:

创建窗口→添加小球→移动小球→检测碰撞

运行效果:

小球图片:

python代码:

# -*- coding:utf-8 -*-import sys # 导入sys模块import pygame # 导入pygame模块pygame.init() # 初始化pygamesize = width, height = 640, 480 # 设置窗口,这是一个数组screen = pygame.display.set_mode(size) # 显示窗口color = (0, 0, 0) # 设置颜色ball = pygame.image.load("ball.png") # 加载图片ballrect = ball.get_rect() # 根据图片大小获取矩形区域speed = [5, 5] # 设置移动的X轴、Y轴距离clock = pygame.time.Clock() # 创建时钟对象# 执行死循环,确保窗口一直显示while True:clock.tick(240) # 每秒执行60次# 检查事件for event in pygame.event.get():if event.type == pygame.QUIT: # 如果点击关闭窗口,则退出pygame.quit() # 退出pygamesys.exit()ballrect = ballrect.move(speed) # 通过再次赋值移动小球# 碰到左右边缘if ballrect.left < 0 or ballrect.right > width:speed[0] = -speed[0] #如果碰到边距则反方向移动# 碰到上下边缘if ballrect.top < 0 or ballrect.bottom > height:speed[1] = -speed[1]screen.fill(color) # 填充颜色screen.blit(ball, ballrect) # 此函数是将图片推送到窗口上,第一个参数为图片第二个参数为图片位置pygame.display.flip() # 更新全部显示

开发Flappy Bird游戏

游戏简介:

当点击屏幕的时候小鸟就往上飞,再次点击小鸟再次往上飞,当不点击时小鸟会以更快速度降落。我们需要控制小鸟

我们需要控制小鸟通过各种各样的管道,当我们穿过一组管道时就会得一分,如果在飞行过程中碰到了管道那么小鸟状态变为灰色掉在地上,游戏结束并且显示一个总的分数

运行效果:

图片素材

游戏分析

以面向对象的思维方式来分析一下这个游戏可以归纳为两个对象

小鸟:

属性:

小鸟的生命状态

活着:颜色为黄色

死亡:颜色为灰色

坐标位置

X轴坐标

Y轴坐标(变化)

是否跳跃

上升高度

坠落高度

方法

跳跃

坠落

管道:

方法:向左移动

碰撞检测:

小鸟碰到上下管道

小鸟碰到上下边界

实现步骤

搭建主框架

创建小鸟类

创建管道类

计算得分

碰撞检测

python代码

import pygameimport sysimport randomclass Bird(object):"""定义一个鸟类"""def __init__(self):"""定义初始化方法"""# 鸟的矩形有四个参数:前两个是小鸟矩形左上角的坐标点,后两个是矩形的长宽self.birdRect = pygame.Rect(65, 50, 50, 50)# 定义鸟的3种状态图片列表:向上飞、向下坠、死亡self.birdStatus = [pygame.image.load("assets/1.png"),pygame.image.load("assets/2.png"),pygame.image.load("assets/dead.png")]self.status = 0 # 默认飞行状态self.birdX = 120 # 鸟所在X轴坐标,即是向右飞行的速度self.birdY = 350 # 鸟所在Y轴坐标,即上下飞行高度self.jump = False # 默认情况小鸟自动降落self.jumpSpeed = 10 # 跳跃高度self.gravity = 5 # 重力self.dead = False # 默认小鸟生命状态为活着def birdUpdate(self):if self.jump:# 小鸟跳跃self.jumpSpeed -= 1 # 速度递减,上升越来越慢self.birdY -= self.jumpSpeed # 鸟Y轴坐标减小,小鸟上升else:# 小鸟坠落self.gravity += 0.2 # 重力递增,下降越来越快self.birdY += self.gravity # 鸟Y轴坐标增加,小鸟下降self.birdRect[1] = self.birdY # 更改Y轴位置class Pipeline(object):"""定义一个管道类"""def __init__(self):"""定义初始化方法"""self.wallx = 400; # 管道所在X轴坐标,最右边位置self.pineUp = pygame.image.load("assets/top.png") #加载上管道图片self.pineDown = pygame.image.load("assets/bottom.png") #加载管道图片def updatePipeline(self):""""管道移动方法"""self.wallx -= 5 # 管道X轴坐标递减,即管道向左移动# 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道if self.wallx < -80: #管道宽度为94,当管道快移除屏幕时重置管道位置global score #设置得分加1并声明为全局变量score += 1self.wallx = 400def createMap():"""定义创建地图的方法"""screen.fill((255, 255, 255)) # 填充颜色screen.blit(background, (0, 0)) # 填入到背景# 显示管道#因为管道长度为495几乎占满屏幕了,为了让管道小一点设置为屏幕外的上下方screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300)); # 上管道坐标位置screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500)); # 下管道坐标位置Pipeline.updatePipeline() # 管道移动# 显示小鸟if Bird.dead: # 撞管道状态Bird.status = 2elif Bird.jump: # 起飞状态Bird.status = 1screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 设置小鸟的坐标Bird.birdUpdate() # 鸟移动# 显示分数#font.render()用于显示字体有三个参数:字符串、是否平滑、颜色screen.blit(font.render(str(score), -1, (255, 255, 255)), (200, 50)) # 设置颜色及坐标位置pygame.display.update() # 更新显示def checkDead():# 上方管子的矩形位置upRect = pygame.Rect(Pipeline.wallx, -300,Pipeline.pineUp.get_width() - 10,Pipeline.pineUp.get_height())# 下方管子的矩形位置downRect = pygame.Rect(Pipeline.wallx, 500,Pipeline.pineDown.get_width() - 10,Pipeline.pineDown.get_height())# 检测小鸟与上下方管子是否碰撞if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):Bird.dead = True# 检测小鸟是否飞出上下边界if not 0 < Bird.birdRect[1] < height:Bird.dead = Truereturn Trueelse:return Falsedef getResutl():final_text1 = "Game Over"final_text2 = "Your final score is: " + str(score)ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 设置第一行文字颜色ft2_font = pygame.font.SysFont("Arial", 50) # 设置第二行文字字体ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置第二行文字颜色screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 设置第二行文字显示位置pygame.display.flip() # 更新整个待显示的Surface对象到屏幕上if __name__ == '__main__':"""主程序"""pygame.init() # 初始化pygamepygame.font.init() # 初始化字体font = pygame.font.SysFont("Arial", 50) # 设置字体和大小size = width, height = 400, 680 # 设置窗口screen = pygame.display.set_mode(size) # 显示窗口clock = pygame.time.Clock() # 设置时钟Pipeline = Pipeline() # 实例化管道类Bird = Bird() # 实例化鸟类score = 0while True:clock.tick(60) # 每秒执行60次# 轮询事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 如果触发键盘和鼠标事件并且小鸟状态不是死亡则Bird.jump值为True并且初始化跳跃跟坠落速度if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:Bird.jump = True # 跳跃Bird.gravity = 5 # 重力Bird.jumpSpeed = 10 # 跳跃速度background = pygame.image.load("assets/background.png") # 加载背景图片if checkDead(): # 检测小鸟生命状态getResutl() # 如果小鸟死亡,显示游戏总分数else:createMap() # 创建地图

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。