利用OpenGL设计贪吃蛇游戏

2023-10-26

利用OpenGL设计贪吃蛇游戏

任务介绍

  • 贪吃蛇游戏:玩家控制贪吃蛇在游戏区域里驰骋,避免碰到自己或障碍物,尽可能地吃更多的食物以生长!

游戏玩法

  • WASD控制蛇的移动
  • 游戏开始,会在地图空闲位置刷新一个食物,蛇触碰到食物后食物消失,食物会重新刷新,分数增加,蛇会增加一个单位的长度
  • 当蛇触碰到自己,则游戏失败
  • 当蛇接触到地图边界,蛇会在地图另一端重新进入地图

开发环境

  • OpenGL3
  • GLFW
  • IMGUI

游戏实现

贪吃蛇游戏的框架搭建

主程序

对GLFW进行初始化,创建游戏对象,创建GUI,对用户的输入进行传递。主要是在一个 while 循环中,进行对游戏对象的更新与渲染。

//渲染
while (!glfwWindowShouldClose(window))
{
   
	// 开启深度测试
	glEnable(GL_DEPTH_TEST);
	// 清空深度缓存
	glClear(GL_DEPTH_BUFFER_BIT);
	//处理用户输入
	processInput(window);

	// Start the Dear ImGui frame
	ImGui_ImplOpenGL3_NewFrame();
	ImGui_ImplGlfw_NewFrame();
	ImGui::NewFrame();

	// 计算每一次渲染相差的时间
	GLfloat currentFrame = glfwGetTime();
	deltaTime = currentFrame - lastFrame;
	lastFrame = currentFrame;

	std::string score = "Score : " + std::to_string(Snake.score);
	const char *scorechar = score.c_str();
	// 创建gui
	ImGui::Begin("Gluttonous Snake");

	// 显示分数或者游戏结束
	if (Snake.State == GAME_WIN)
	{
   
		ImGui::Text("Game Over!!!!!!");
		ImGui::Text(scorechar);
	}
	else
	{
   
		ImGui::Text(scorechar);
	}
	ImGui::End();

	// Rendering
	ImGui::Render();

	// 游戏处理用户输入
	Snake.ProcessInput(deltaTime);

	// 更新游戏的状态
	Snake.Update(deltaTime);

	//设置清空屏幕所用的颜色
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	//清除颜色缓冲
	glClear(GL_COLOR_BUFFER_BIT);

	// 渲染游戏
	Snake.Render((float)glfwGetTime());

	//渲染gui
	ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
	//交换颜色缓冲
	glfwSwapBuffers(window);
	//检查IO事件
	glfwPollEvents();
}
游戏类

维护游戏状态,提供更新状态的接口供主程序调用,进行碰撞检测等

// 游戏的状态
enum GameState {
   
	GAME_ACTIVE,
	GAME_MENU,
	GAME_WIN
};

class Game
{
   
public:
	// 游戏状态
	GameState              State;
	GLuint                 Width, Height;
	// 游戏分数
	int score;

	Game(GLuint width, GLuint height);
	~Game();
	// 初始化游戏加载shader等
	void Init();

	void ProcessInput(GLfloat dt);
	void Update(GLfloat dt);
	void Render(float rotateRad);
	void ProcessMouseMovement(float xoffset, float yoffset, bool constrainPitch);

	// 键盘状态
	bool pressW;
	bool pressS;
	bool pressA;
	bool pressD;
	void ResetPress();

	// 移动蛇
	void MoveTheSnack();

	// 碰撞检测
	void DoCollisions();
};
游戏对象类

维护游戏对象的状态,在本次游戏中就是蛇头与蛇身、以及生成的食物

class GameObject
{
   
public:
	// 状态
	glm::vec3   Position, Size;
	GLfloat     Rotation;

	GameObject();
	// 设置位置
	void setPosition(glm::vec3 pos);
private:
	GLuint gameobjectVAO;
	
};
工具类

管理着色器、纹理的加载,本次游戏中没有用到纹理于是只有着色器的加载

class ResourceManager
{
   
public:
	// Resource storage
	static std::map<std::string, Shader*>    Shaders;

	// Loads (and generates) a shader program from file loading vertex, fragment (and geometry) shader's source code. If gShaderFile is not nullptr, it also loads a geometry shader
	static Shader *  LoadShader(const GLchar *vShaderFile, const GLchar *fShaderFile, const GLchar *gShaderFile, std::string name);
	// Retrieves a stored sader
	static Shader *  GetShader(std::string name);

	// Properly de-allocates all loaded resources
	static void      Clear();
private:
	// Private constructor, that is we do not want any actual resource manager objects. Its members and functions should be publicly available (static).
	ResourceManager() {
    }
	// Loads and generates a shader from file
	static Shader  *  loadShaderFromFile(const GLchar *vShaderFile, const GLchar *fShaderFile, const GLchar *gShaderFile = nullptr);
};
着色器类

用于对单个的着色器进行初始化,并修改里面的值

class Shader
{
   
public:
	// State
	GLuint ID;
	// Constructor
	Shader() {
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用OpenGL设计贪吃蛇游戏 的相关文章

  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • 使用 Opengl 绘制立方体 3D

    我想使用 OpenGL 绘制 3D 立方体这是我的代码如何纠正错误 float ver 8 3 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 我的绘图存在坐标/glortho 问题

    I have made a bit of a change to my code in the last couple of hours as everything was messy with my grid so I made it i
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • OpenGL 3.1 中已弃用 glLineStipple

    glLineStipple在最新的 OpenGL API 中已被弃用 它被替换成什么 如果不更换 怎样才能达到类似的效果呢 我当然不想使用兼容性配置文件 抱歉 它还没有被任何东西取代 我想到的第一个模拟它的想法是几何着色器 您向几何着色器提
  • 如何使用边缘和内部镶嵌因子完成三角形面片镶嵌?

    I am just learning tessellation and i came across with below example for triangle patch tessellation but i am not sure h
  • 致命错误 gl.h 包含在 glew.h 之前

    include
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这

随机推荐

  • JavaDay08

    定义一个方法 根据成绩 返回对应的等级 package com bjpowernode demo01 exercise import java util Scanner 定义一个方法 根据成绩 返回对应的等级 public class De
  • Kruskal算法

    Kruskal算法 Kruskal算法是一种用来查找最小生成树的算法 由Joseph Kruskal在1956年发表 用来解决同样问题的还有Prim算法和Boruvka算法等 三种算法都是贪心算法的应用 和Boruvka算法不同的地方是 K
  • 网管实战(6):忘记交换机密码的处理(HUAWEI S5735)

    今天拿到一台华为S5735的交换机 有密码进不去 网上找资料进入了 记录下来以备后查 利用交换机的BootROM提供了清除Console口密码的功能 在用户使用Console口登录的时候跳过密码检查 进入交换机后修改Console口密码 然
  • String类常见构造方法大全(Java)

    目录 字符串 String 1 字符串的拼接与反转 2 金额转换 字符串 StringBuilder 字符串 StringJoiner 综合练习 字符串 String 构造方法摘要 字符串的内容是不会发生改变的 他的对象在创建后不能被更改
  • sql server 备份还原(相关文章很凌乱)

    1 首先安装Microsoft SQL Server Management Studio 下载 SQL Server Management Studio SSMS SQL Server Management Studio SSMS Micr
  • 反编译--jadx的下载使用与配置

    下载与安装 git clone https github com skylot jadx git cd jadx gradlew dist 找到 jadx gui bat文件双击安装即可
  • 基于综合指标的冬小麦长势无人机遥感监测

    用于描述作物长势的指标 苗情 作物密度 叶面积指数 LAI 生物量 干物质量 光合色素含量 目前有关小麦长势监测的研究 多数是以LAI 叶片叶绿素含量 氮素含量 水分含量 生物量单个指标反映小麦长势 本文尝试将LAI 叶片叶绿素含量 氮素含
  • nvm安装与使用

    一 介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具 方便切换不同版本的Node js 二 使用 nvm 的使用非常的简单 跟 npm 的使用方法类似 2 1 下载安装 首先先下载 n
  • 6.7行为型---中介者模式

    在现实生活中 常常会出现好多对象之间存在复杂的交互关系 这种交互关系常常是 网状结构 它要求每个对象都必须知道它需要交互的对象 例如 每个人必须记住他 她 所有朋友的电话 而且 朋友中如果有人的电话修改了 他 她 必须告诉其他所有的朋友修改
  • float和double的范围和精度

    float与double的范围和精度 1 范围 float和double的范围是由指数的位数来决定的 float的指数位有8位 而double的指数位有11位 分布如下 float 1bit 符号位 8bits 指数位 23bits 尾数位
  • MySQL --- 常用函数 - 字符串函数

    函数 MySQL 函数会对传递进来的参数进行处理 并返回一个处理结果 也就是返回一个值 MySQL 包含了大量并且丰富的函数 咱们讲解几十个常用的 剩下的比较罕见的函数我们可以到 MySQL 参考手册 查询 字符串函数 函数 作用 UPPE
  • STM32 Keil:warning: #223-D: function "LED_Init" declared implicitly

    include stm32f10x h include led h int main LED Init while 1 GPIO SetBits GPIOD GPIO Pin 6 运行时警告 warning 223 D function L
  • 【Android】dumpsys activity package $packagename

    具体作用后续跟进检讨补全
  • 线性代数的本质(一)

    文章目录 向量空间 向量及其性质 基与维数 向量的坐标运算 线性代数的本质 3blue1brown 高中数学A版选修4 2 矩阵与变换 线性代数及其应用 第五版 高等代数简明教程 蓝以中 向量空间 In the beginning Gran
  • 机器学习第五课--广告点击率预测项目以及特征选择的介绍

    这个项目的主要的目的是通过给定的广告信息和用户信息来预测一个广告被点击与否 如果广告有很大概率被点击就展示广告 如果概率低 就不展示 因为如果广告没有被点击 对双方 广告主 平台 来讲都没有好处 所以预测这个概率非常重要 也是此项目的目标
  • Description Resource Path Location Type Java compiler level does not match the version of the instal

    解决办法 在项目上右键Properties Project Facets 在打开的Project Facets页面中的Java下拉列表中 选择相应版本 有可能是java1 6 改成java6之类的
  • 【Python】平面多边形Wachspress坐标、中值坐标的计算及其等高线

    平面多边形Wachspress坐标 中值坐标的计算及其等高线 代码仅供参考 复杂度极高 暂时无优化 1 Wachspress坐标等高线绘制 1 1 程序 计算有向面积 def dir acr point1 point2 point3 res
  • Unity3d——ParticleSystem粒子光环

    记录一下学习的过程 首先是Inspector视窗中Particle System的属性 可以通过修改属性来改变粒子的效果 基本属性 Duration 发射器发送粒子持续的时间 比如设置为5 就是5秒后不再发送新的粒子 Looping 循环发
  • 1140: 小数点后第n位 多实例java

    import java util Scanner public class oj1 public static void main String args Scanner input new Scanner System in int t
  • 利用OpenGL设计贪吃蛇游戏

    利用OpenGL设计贪吃蛇游戏 文章目录 利用OpenGL设计贪吃蛇游戏 任务介绍 游戏玩法 开发环境 游戏实现 贪吃蛇游戏的框架搭建 主程序 游戏类 游戏对象类 工具类 着色器类 摄像机类 精灵渲染类 场景 蛇 食物的渲染 场景 蛇 食物