Pygame简单入门教程(绘制Rect、控制移动、碰撞检测、Github项目源代码)

embedded/2024/9/25 23:25:25/
github-gist">

Pygame简明教程

引言:本教程中的源码已上传个人Github: GItHub链接
视频教程推荐:YouTube教程–有点过于简单了
官方文档推荐:虽然写的一般,但还是推荐!

Navigator~

  • Pygame简明教程
  • 安装pygame
    • 一、代码框架
    • 二、案件输入
    • 三、绘制方块
      • 3.1 绘制
      • 3.2 移动
    • 四、碰撞
      • 4.1 检测方法
      • 5.2 敌人和碰撞
        • 5.2.1 敌人or朋友?
        • 5.2.2 测试碰撞

pygame_6">安装pygame

cmd中安装即可

pip3 install pygame

一、代码框架

main.py

python">import sysimport pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率if __name__ == "__main__":while running:for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = Falsepygame.quit()sys.exit()# 退出游戏辣!

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

二、案件输入

需要修改的代码:

python">
if __name__ == "__main__":while running:for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = False############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:print("你按下了 \/ 哦!")if keys[pygame.K_UP]:print("你按下了 /\ 哦!")if keys[pygame.K_LEFT]:print("你按下了 < 哦!")if keys[pygame.K_RIGHT]:print("你按下了 > 哦!")######################################pygame.quit()sys.exit()# 退出游戏辣!

修改结束,完整代码如下:

main.py

python">import sysimport pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率if __name__ == "__main__":while running:for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = False############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:print("你按下了 \/ 哦!")if keys[pygame.K_UP]:print("你按下了 /\ 哦!")if keys[pygame.K_LEFT]:print("你按下了 < 哦!")if keys[pygame.K_RIGHT]:print("你按下了 > 哦!")######################################pygame.quit()sys.exit()# 退出游戏辣!

三、绘制方块

3.1 绘制

我们使用该方法来进行绘制方块对象:

python">pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

下文会出现碰撞箱,是为了便于使用后文中定义的碰撞检测方法。

定义Player类:

python">
class Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2self.width = 100self.height = 200self.hit_box = (self.x, self.y, self.width, self.height)self.color = pygame.Color("Blue")   # 颜色def update(self):self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制################### 创建一个方块对象
player = Player()
###################

main.py

python">import sysimport pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率class Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2self.width = 100self.height = 200self.hit_box = (self.x, self.y, self.width, self.height)self.color = pygame.Color("Blue")   # 颜色def update(self):self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制################### 创建一个方块对象
player = Player()
###################if __name__ == "__main__":while running:screen.fill(pygame.Color("White"))for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = False############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:print("你按下了 \/ 哦!")if keys[pygame.K_UP]:print("你按下了 /\ 哦!")if keys[pygame.K_LEFT]:print("你按下了 < 哦!")if keys[pygame.K_RIGHT]:print("你按下了 > 哦!")######################################player.update()pygame.display.update()pygame.quit()sys.exit()# 退出游戏辣!

3.2 移动

我们可以再加点猛料,让player可以动起来:

Player类中作如下修改:

python">class Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2self.width = 100self.height = 200self.hit_box = (self.x, self.y, self.width, self.height)self.color = pygame.Color("Blue")   # 颜色self.velocity = 10def left(self):self.x -= self.velocitydef right(self):self.x += self.velocitydef up(self):self.y -= self.velocitydef down(self):self.y += self.velocitydef update(self):self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

按键部分也进行修改:

python">############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:player.down()if keys[pygame.K_UP]:player.up()if keys[pygame.K_LEFT]:player.left()if keys[pygame.K_RIGHT]:player.right()######################################

完整代码如下:

main.py

python">import sysimport pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率class Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2self.width = 100self.height = 200self.hit_box = (self.x, self.y, self.width, self.height)self.color = pygame.Color("Blue")   # 颜色self.velocity = 10def left(self):self.x -= self.velocitydef right(self):self.x += self.velocitydef up(self):self.y -= self.velocitydef down(self):self.y += self.velocitydef update(self):self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制################### 创建一个方块对象
player = Player()
###################if __name__ == "__main__":while running:screen.fill(pygame.Color("White"))for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = False############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:player.down()if keys[pygame.K_UP]:player.up()if keys[pygame.K_LEFT]:player.left()if keys[pygame.K_RIGHT]:player.right()######################################player.update()pygame.display.update()pygame.quit()sys.exit()# 退出游戏辣!

由于动态不便于演示,这里省略。

四、碰撞

4.1 检测方法

pygame中对于碰撞检测的实现手段还是挺多的,可以使用Sprite精灵来统一管理,也可以自己手搓。
这里写后者~

检测两个矩形是否重叠即可判断是否碰撞,只要检测其中一个矩形的四个顶点是否在另一个矩形内部即可。

为了表示四个点,抽象出一个顶点类:

Point

python">class Point(object):def __init__(self, x, y):self.x = xself.y = y

这里定一个一个CollisionController类来统一检测所有碰撞

CollisionController

python">
class CollisionController():def RectCollide(hitbox1, hitbox2):'''检测四个点是否在另一个矩形体内即可box1 = (x, y, width, height)0  1   2     3:param hitbox1::param hitbox2::return:'''p1 = Point(hitbox1[0], hitbox1[1])p2 = Point(hitbox1[0] + hitbox1[2], hitbox1[1])p3 = Point(hitbox1[0], hitbox1[1] + hitbox1[3])p4 = Point(hitbox1[0] + hitbox1[2], hitbox1[1] + hitbox1[3])points = [p1, p2, p3, p4]for p in points:if (p.x >= hitbox2[0]and p.x <= hitbox2[0] + hitbox2[2]and p.y >= hitbox2[1]and p.y <= hitbox2[1] + hitbox2[3]):return Truereturn False

需要检测的时候直接调用CollisionController.RectCollide()即可,参数中传入两个矩形碰撞箱。
下文将教你写一个敌人来运用这个函数。

5.2 敌人和碰撞

5.2.1 敌人or朋友?

定义一个敌人:

python">class Enemy(Player):pass

哈哈哈,直接继承玩家类就行了,多好!人生苦短我用Python, 懒得复写我用继承,游戏开发不能没有面向对象!!

别忘记生成对象,并且在主函数中加入更新的方法:

main.py

python">import sysimport pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率class Point(object):def __init__(self, x, y):self.x = xself.y = y
class CollisionController():def RectCollide(hitbox1, hitbox2):'''检测四个点是否在另一个矩形体内即可box1 = (x, y, width, height)0  1   2     3:param hitbox1::param hitbox2::return:'''p1 = Point(hitbox1[0], hitbox1[1])p2 = Point(hitbox1[0] + hitbox1[2], hitbox1[1])p3 = Point(hitbox1[0], hitbox1[1] + hitbox1[3])p4 = Point(hitbox1[0] + hitbox1[2], hitbox1[1] + hitbox1[3])points = [p1, p2, p3, p4]for p in points:if (p.x >= hitbox2[0]and p.x <= hitbox2[0] + hitbox2[2]and p.y >= hitbox2[1]and p.y <= hitbox2[1] + hitbox2[3]):return Truereturn Falseclass Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2self.width = 100self.height = 200self.hit_box = (self.x, self.y, self.width, self.height)self.color = pygame.Color("Blue")   # 颜色self.velocity = 10def left(self):self.x -= self.velocitydef right(self):self.x += self.velocitydef up(self):self.y -= self.velocitydef down(self):self.y += self.velocitydef update(self):self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制
class Enemy(Player):pass################### 创建一个方块对象
player = Player()
enemy = Enemy()
###################if __name__ == "__main__":while running:screen.fill(pygame.Color("White"))  # 填充一个背景色for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = False############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:player.down()if keys[pygame.K_UP]:player.up()if keys[pygame.K_LEFT]:player.left()if keys[pygame.K_RIGHT]:player.right()####################################### ****************** 更新对象 *******************enemy.update()player.update()# ****************** ------ *******************pygame.display.update() # 更新画面pygame.quit()sys.exit()# 退出游戏辣!

运行发现多了一个小伙伴~在这里插入图片描述

5.2.2 测试碰撞
python">import sysimport pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率class Point(object):def __init__(self, x, y):self.x = xself.y = yclass Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2self.width = 100self.height = 200self.hit_box = (self.x, self.y, self.width, self.height)self.color = pygame.Color("Blue")   # 颜色self.velocity = 10def left(self):self.x -= self.velocitydef right(self):self.x += self.velocitydef up(self):self.y -= self.velocitydef down(self):self.y += self.velocitydef update(self):self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制
class Enemy(Player):passclass CollisionController():def RectCollide(hitbox1, hitbox2):'''检测四个点是否在另一个矩形体内即可box1 = (x, y, width, height)0  1   2     3:param hitbox1::param hitbox2::return:'''p1 = Point(hitbox1[0], hitbox1[1])p2 = Point(hitbox1[0] + hitbox1[2], hitbox1[1])p3 = Point(hitbox1[0], hitbox1[1] + hitbox1[3])p4 = Point(hitbox1[0] + hitbox1[2], hitbox1[1] + hitbox1[3])points = [p1, p2, p3, p4]for p in points:if (p.x >= hitbox2[0]and p.x <= hitbox2[0] + hitbox2[2]and p.y >= hitbox2[1]and p.y <= hitbox2[1] + hitbox2[3]):return Truereturn False# def obj_collided(self, object1, object2):#     if self.RectCollide(object1.hit_box, object2.hit_box):#         return True#     else:#         return False################### 创建一个方块对象
player = Player()
enemy = Enemy()
###################if __name__ == "__main__":while running:screen.fill(pygame.Color("White"))  # 填充一个背景色for event in pygame.event.get():if event.type == pygame.QUIT: # 检测是否点击右上角窗口小xrunning = False############ 获取输入 ##################keys = pygame.key.get_pressed()if keys[pygame.K_DOWN]:player.down()if keys[pygame.K_UP]:player.up()if keys[pygame.K_LEFT]:player.left()if keys[pygame.K_RIGHT]:player.right()####################################### $$$$$$$$$$$$$$$ 碰撞检测 $$$$$$$$$$$$$$$$$$$if CollisionController.RectCollide(player.hit_box, enemy.hit_box):print("哎呀,创了一下咧!")# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$# ****************** 更新对象 *******************enemy.update()player.update()# ****************** ------ *******************pygame.display.update() # 更新画面pygame.quit()sys.exit()# 退出游戏辣!

可以看到,现在每次撞一下都会被聪明的计算机给发现。在这里插入图片描述


http://www.ppmy.cn/embedded/38550.html

相关文章

Raft共识算法笔记,MIT6.824,

处理leader和follow的一个重要思路是多数投票&#xff0c;确保系统中存在奇数个服务器&#xff08;例如3台&#xff09;。进行任何操作都需要来自多数服务器的同意&#xff0c;例如3台服务器中的2台。如果没有多数同意&#xff0c;系统会等待。为什么多数投票有助于避免脑裂问题…

git 入门教程

1.首先点击创建仓库 然后会出现一下内容&#xff0c;不要急着关掉&#xff0c;他能告诉你如何创建仓库 //git 全局设置 git config --global user.name "你的名字" git config --global user.email "你的邮箱"//创建 git 仓库 git init //初始化 git comm…

流畅的python-学习笔记_序列修改+散列+切片

vector第一版 reprlib.repr用于选取有限长度较长变量 vector第二版切片 注意切片还有indices属性&#xff0c;它可以入参一个序列长度&#xff0c;根据此序列长度&#xff0c;转化不规矩的start stop stride&#xff0c; vector第三版动态存取属性 obj.attra时&#xff0c;先…

SQL优化详解

目录 插入数据 insert的优化&#xff08;少量数据&#xff09; 批量插入 手动事务提交 主键顺序插入 插入大量数据 主键优化 数据组织方式&#xff1a; 页分裂&#xff1a; 主键顺序插入的方式&#xff1a; 主键乱序插入&#xff1a; 页合并&#xff1a; 主键设计…

【网络编程】Servlet | Maven | 创建程序的七个步骤 | 部署方式 | 访问出错

文章目录 Servlet一、创建一个Servlet程序1.创建项目2.引入依赖3.创建目录4.编写代码5.打包程序6.部署程序7.验证程序对内容进行修改 二、更方便的部署方式插件&#xff08;plugin&#xff09;出现乱码 三、访问出错1.出现4042.出现4053.出现5004.出现空白页面5.无法发访问此网…

详解Go语言Map

Map的声明 使用make()函数定义Map map_name : make(map[KeyType]valueType,initialCapacity)KeyType是键的类型&#xff0c;ValueType是值的类型&#xff0c;initialCapacity是可选参数&#xff0c;用于指定map的初始容量。 使用map关键字定义Map m : map[string]int {&quo…

邦注科技 模具保护器 CCD电子眼 专业工业视觉检测设备

模具保护器是一种用于保护模具的设备&#xff0c;可以在塑料压铸和冲床等加工过程中起到保护模具的作用。以下是关于模具保护器在保护塑料压铸和冲床模具方面的应用&#xff1a; 塑料压铸模具保护器&#xff1a; 防止碰撞&#xff1a;在塑料压铸过程中&#xff0c;模具可能会…

Pytorch入门—Tensors张量的学习

Tensors张量的学习 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。在PyTorch中&#xff0c;我们使用张量来编码模型的输入和输出&#xff0c;以及模型的参数。 张量类似于NumPy的ndarrays&#xff0c;只是张量可以在GPU或其他硬件加速器上运行。事实上&#xf…