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

Pygame简明教程

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

Navigator~

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

安装pygame

cmd中安装即可

pip3 install pygame

一、代码框架

main.py

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()# 退出游戏辣!

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

二、案件输入

需要修改的代码:


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

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 绘制

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

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

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

定义Player类:


class Player(object):def __init__(self):self.x = WIDTH // 2self.y = HEIGHT // 2### 4.2 敌人和碰撞
#### 4.2.1 敌人or朋友?
定义一个敌人:
```pythonself.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

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类中作如下修改:

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)  # 更新绘制

按键部分也进行修改:

############ 获取输入 ##################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

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

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

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

CollisionController


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()即可,参数中传入两个矩形碰撞箱。
下文将教你写一个敌人来运用这个函数。

4.2 敌人和碰撞

4.2.1 敌人or朋友?

定义一个敌人:

class Enemy(Player):pass

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

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

main.py

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 测试碰撞
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.rhkb.cn/news/326025.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目之车辆管理系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的车辆管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 车辆管理系统的主要使用者分…

day-35 被围绕的区域

思路 很明显&#xff0c;只有与边界上的O连接的O才不会X覆盖 解题方法 检测边界上的字符&#xff0c;如果是O则向周围探测&#xff0c;访问与之连接的不会被覆盖的X。边界探测结束后&#xff0c;没有访问过的O皆会被X覆盖 Code class Solution {public int dir[][]{{0,1},{0…

用webui.sh安装报错No module named ‘importlib.metadata‘

安装sdweb报错&#xff0c;出现No module named importlib.metadata&#xff1a; glibc version is 2.35 Cannot locate TCMalloc. Do you have tcmalloc or google-perftool installed on your system? (improves CPU memory usage) Traceback (most recent call last):File…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout 文章编号&…

力扣32. 最长有效括号

Problem: 32. 最长有效括号 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建一个栈&#xff0c;并将-1先添加到栈中&#xff08;添加-1到栈中只是为了方便接下来的操作&#xff09;&#xff0c;定义int变量len用于记录每一个子有效括号的长度&#xff0c;ma…

ctfshow SSRF 351-358

做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时&#xff0c;它会尝试获取该 URL 指向的资源的内容&#xff0c;并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件&#xff0c;它包含的内容取决于该 PHP 文件…

vue3+ant design实现表格数据导出Excel

提示:实现表格数据导出Excel 文章目录 前言 一、安装ant design? 二、引用ant design 1.搭建框架 2.获取表格数据 三、封装导出表格的代码 四、导出 1.获取导出地址 2.在下载导出事件中添加导出代码 五、全部代码 前言 今天终于有时间来更新文章了,最近公司项目比较紧…

遨游 JavaScript 对象星际:探索面向对象编程的深邃世界

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;面向对象编程&#x1f517;1 什么是对象&#x1f517;2 什么是…

数智结合,智慧合同让法务管理发挥内在价值

在当今这个信息化、数字化飞速发展的时代&#xff0c;数据已成为企业重要的战略资源。法务管理作为企业内部控制和风险防范的重要环节&#xff0c;其重要性不言而喻。然而&#xff0c;传统的法务管理模式往往存在效率低下、信息孤岛、反应迟缓等问题。在这样的背景下&#xff0…

神卓互联内网穿透之快速创建https类型通道【最新】

神卓互联最近上线了V9.0内网穿透通信传输模式&#xff0c;相比与之前的V8.0在速度和延迟方面确实提升了很多&#xff0c;控制台也进行了改版升级&#xff0c;这里是对升级后的控制台创建https通道方法进行记录&#xff1a; 登录神卓互联控制台 选择【内网穿透】-【映射管理】…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表遍历

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表遍历 1、 for i in range(5):Flyer[i].step(Dev.x -Flyer[i].x) Dev.step(Item.y - Dev.y)2、 for i in range(7):Flyer[i].step(Dev.y - Flyer[i].y) Dev.step(Item[2].x - Dev.x)3、 for i in range(5):Flyer[i].…

软件技术主要学什么课程

软件技术专业主要学习的课程和内容有编程语言、数据结构与算法、数据库技术等&#xff0c;以下是上大学网( www.sdaxue.com)整理的软件技术主要学什么课程&#xff0c;供大家参考&#xff01; 编程语言&#xff1a;掌握一种或多种编程语言&#xff0c;如C#、Java、Python、C等&…

AI绘画神级Stable Diffusion入门教程|快速入门SD绘画原理与安装

什么是Stable Diffusion&#xff0c;什么是炼丹师&#xff1f;根据市场研究机构预测&#xff0c;到2025年全球AI绘画市场规模将达到100亿美元&#xff0c;其中Stable Diffusion&#xff08;简称SD&#xff09;作为一种先进的图像生成技术之一&#xff0c;市场份额也在不断增长&…

QT+MYSQL数据库处理

1、打印Qt支持的数据库驱动&#xff0c;看是否有MYSQL数据库驱动 qDebug() << QSqlDatabase::drivers(); 有打印结果可知&#xff0c;没有MYSQL数据库的驱动 2、下载MYSQL数据库驱动&#xff0c;查看下面的文章配置&#xff0c;亲测&#xff0c;可以成功 Qt6 配置MySQL…

【Linux】centos7安装软件(rpm、yum、编译安装),补充:查找命令的相关文件路径,yum安装mysql

【Linux】技术上&#xff0c;Linux是内核。而术语上&#xff0c;我们通常说的Linux是完整的操作系统&#xff0c;其实称为"Linux发行版"&#xff0c;是将Linux内核和应用系统打包&#xff0c;由不同的发行家族发行了不同版本。Linux发行版众多&#xff0c;主要有RedH…

VScode通过ssh远程连接服务器被拒绝:permission denied, please try again

使用场景&#xff1a; 使用windows系统下的vscode远程连接服务器的linux系统&#xff0c;终端提示permission denied, please try again,但是使用cmd是可以远程登录的。 解决办法&#xff1a; 前提条件windows端的vscode安装了ssh远程连接的相关插件Remote - SSH&#xff0c;…

Spring Boot:让微服务开发像搭积木一样简单!

带你一探 Spring Boot 的自动配置和 Starter POMs 的神奇之处&#xff0c;展示如何通过几个简单的步骤就能让你的微服务应用在云端翱翔&#xff01; 文章目录 1. 引言1.1 简述Spring框架的起源与重要性1.2 阐述文章目的&#xff1a;深入解析Spring核心功能与应用实践2. 背景介绍…

Java面试之分布式篇

分布式锁的实现方案 &#xff08;1&#xff09;用数据库实现分布式锁比较简单&#xff0c;就是创建一张锁表&#xff0c;数据库对字段作唯一性约束。加锁的时候&#xff0c;在锁表中增加一条记录即可&#xff1b;释放锁的时候删除锁记录就行。如果有并发请求同时提交到数据库&…

String,StringBuilder,StringBuffer

String&#xff0c;StringBuffer&#xff0c;StringBuilder String类 概念:String是不可变类&#xff0c;即一旦一个String对象被创建&#xff0c;包含在这个对象中的字符序列是不可改变的&#xff0c;直至该对象被销毁&#xff0c;并且String类是final类&#xff0c;不能有子…

251 基于matlab的动态粒子群算法

基于matlab的动态粒子群算法。普通粒子群算法无法感知外界环境的变化&#xff0c;在外界环境发生改变时无法实时进行响应&#xff0c;因而缺乏动态环境寻优能力。在普通粒子群算法基本上通过增加敏感粒子得到一种动态粒子群算法&#xff0c;该算法通过实时计算敏感粒子的适应度…