见缝插针小游戏 (基于OPENGL)|计算机图形学

【Unity 14】Unity简单案例《见缝插针》开发源码 PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。 笔记内容均为 自己理解,不保证每个都对。 C#笔记未按照难度排列 第一步: 在建立项目工程时选择建立2D项目 第二步: 根据个人喜好,画出圆面, 修改Camera的背景颜色 第三步: 在组件窗口空白处 右键 创建UI - TEXT 调整UI大小,字体大小到合适的值,于合适的位置,例如: 第四步:... 阅读详情

见缝插针小游戏 (基于OPENGL)|计算机图形学

1.前言

最近开始学习图形学,试着用glut做了一个小游戏,也是之前见得蛮多的小游戏叫做见缝插针,基本上功能都实现了,可能还有些不足,之后有机会再改进,废话不多说,先上图

在这里插入图片描述

在这里插入图片描述

2.玩法

每次点击鼠标左键可以插入一针,每次插入完的针都会一直旋转,过程中要保证每插入一针,针与针不要碰撞,最后尽可能多的“见缝插针”
(听起来是不是很简单呢,确实也不难)

接下来就是代码部分,这里我直接把源码贴出来,还有一些里面的注意事项,以免你们拿到手不能直接运行

3.代码

#include<GL/glut.h>
#include<stdio.h>
#include <windows.h> 
#include<math.h>

#define MAX_CHAR  128									// ASCII字符总共只有0到127,一共128种字符 
#define PI        acos(-1.0)							// cos (pi)=-1 求一个反余弦就得到PI
#define SPEED     (PI/360)								// 针的旋转速度
#define NEEDLE_L  180									// 针的长度

void Init();
void Reshape(int w, int h);
void myDisplay();
void myIdle(void);
void MouseHit(int button, int state, int x, int y);
void DrawString(const char* str);
void DrawFrame(int number);
void Move(int number, int x, int y);
void Rotate(double* R, int num);
bool Pin(double* R, int num);

double radian[25] = { 0 };								//储存针的弧度
int Needle_N = 0;										//针的个数
int n = 40;												//多边形边数,n越大,越趋近圆
int win;												//窗口返回值

int main(int argc,char*argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(480, 640);
	win=glutCreateWindow("Game Demo 左键点击开始"); //基于圆的碰撞检测做出来的游戏
	

	Init();
	glutDisplayFunc(myDisplay);
	glutIdleFunc(myIdle);
	glutReshapeFunc(Reshape);
	glutMouseFunc(MouseHit);
	glutMainLoop();
	return 0;
}

//初始化
void Init()
{
	glClearColor(189.0/255.0, 188.0/255.0, 187.0/ 255.0,0.0);
}

//调整窗口函数
void Reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();//初始化变换矩阵
	gluOrtho2D(0, (double)w, 0, (double)h);//左下角(0,0),右上角(640,480)
}

//绘制函数
void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	DrawFrame(1);
	Move(Needle_N, 240, 80);						
	Move(Needle_N + 1, 240, 40);
	Move(Needle_N + 2, 240, 0);
	Rotate(radian, Needle_N);
	glutSwapBuffers();
}

//动画函数
void myIdle(void)
{
	myDisplay();
	Sleep(10);//控制旋转快慢
}

//鼠标响应
void MouseHit(int button, int state, int x, int y)
{	

	if (button== GLUT_LEFT_BUTTON&&state==GLUT_DOWN)//controlMouseHit==true
	{
		if (Pin(radian, Needle_N))
		{
			Needle_N++;
		}
		else
		{
			glutIdleFunc(NULL);
			HWND hwnd = GetActiveWindow();
			if (MessageBox(hwnd, "游戏结束。\n重来一局吗?", "询问", MB_YESNO | MB_ICONQUESTION) == IDYES)
			{
				Needle_N = 0;
				glutIdleFunc(myIdle);//重启动画
			}
			else
			{
				glutDestroyWindow(win);//摧毁窗口,但是loop其实仍在继续
			}
				
		}
	}
	
}

//显示文本函数
void DrawString(const char* str) 
{
	static int isFirstCall = 1;
	static GLuint lists;

	if (isFirstCall) { // 如果是第一次调用,执行初始化 
						// 为每一个ASCII字符产生一个显示列表 
		isFirstCall = 0;

		// 申请MAX_CHAR个连续的显示列表编号 
		lists = glGenLists(MAX_CHAR);

		// 把每个字符的绘制命令都装到对应的显示列表中 
		wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
	}
	// 调用每个字符对应的显示列表,绘制每个字符 
	for (; *str != '\0'; ++str)
		glCallList(lists + *str);
}

//图案绘制
void DrawFrame(int number)
{
	char str[25];
	int i;
	_itoa_s(number, str, 10);
	glColor3f(70 / 255.0, 70 / 255.0, 69 / 255.0);
	// 绘制多边形,n足够大就会变成圆形 //也可以换成八对称画法
	glBegin(GL_POLYGON);
	for (i = 0; i < n; ++i)
		glVertex2f(240 + 50 * cos(2 * PI / n * i), 400 + 50 * sin(2 * PI / n * i));
	glEnd();

	glColor3f(1.0, 1.0, 1.0);
	glRasterPos2f(240,400);
	DrawString(str);
}

//
void Move(int number, int x, int y)
{
	char str[25];
	int i;
	_itoa_s(number, str, 10);
	glColor3f(70 / 255.0, 70 / 255.0, 69 / 255.0);
	glBegin(GL_POLYGON);
	for (i = 0; i < n; ++i)
		glVertex2f(x + 20 * cos(2 * PI / n * i), y + 20 * sin(2 * PI / n * i));
	glEnd();
	
	glColor3f(1.0, 1.0, 1.0);
	glRasterPos2f(x,y);
	DrawString(str);
}

//旋转函数
void Rotate(double* R, int num)
{
	int X_NEEDLE;
	int Y_NEEDLE;
	
	for (int i = 0; i < num; i++)
	{
		R[i] = R[i] + SPEED;
		//循环一圈后。-2PI
		if (R[i] > 2 * PI)
		{
			R[i] = R[i] - 2 * PI;
		}
		X_NEEDLE = int(NEEDLE_L * cos(R[i]) + 240);
		Y_NEEDLE = int(400-NEEDLE_L * sin(R[i]));

		glColor3f(70 / 255.0, 70 / 255.0, 69 / 255.0);
		glLineWidth(3);
		glEnable(GL_LINE_STIPPLE);
		glBegin(GL_LINES);
		glVertex2s(X_NEEDLE, Y_NEEDLE);
		glVertex2s(240, 400);
		glEnd();

		Move(i, X_NEEDLE, Y_NEEDLE);
		DrawFrame(1);
	}
}

//碰撞检测
bool Pin(double* R, int num)
{
	int X_NEEDLE;
	int Y_NEEDLE;

	bool T = true;
	R[num] = PI / 2;
	X_NEEDLE = int(NEEDLE_L * cos(R[num]) + 240);
	Y_NEEDLE = int(400-NEEDLE_L * sin(R[num]));

	glColor3f(70 / 255.0, 70 / 255.0, 69 / 255.0);
	glLineWidth(3);
	glEnable(GL_LINE_STIPPLE);
	glBegin(GL_LINES);
	glVertex2s(X_NEEDLE, Y_NEEDLE);
	glVertex2s(240, 350);
	glEnd();
	Move(num, X_NEEDLE, Y_NEEDLE);
	glutSwapBuffers();
	for (int i = 0; i < num; i++)
	{
		if (fabs(R[num] - R[i]) < (PI / 15))
		{
			T = false;
			break;								// 不需要再次进行比较了,循环跳出
		}
	}
	return T;									// 如果失败返回false;
}

注意事项

1、我这是在vs下写的代码,由于OPENGL他文字显示没有直接的api我就写了一个,里面用到了itoa函数(这里我用这个函数把数字转换字符串)
_itoa_s(number, str, 10);(这是vs的要求itoa写法,虽然我可以在预处理器加宏定义可以不按照他这个来写,但是我偷懒2333 )
所以如果你用的不是vs或者vs没有这样的语法要求,你可以把_itoa_s改成itoa

2、如果你发现点击后旋转速度太快,可以在myIdle函数里更改sleep,以及更改宏定义SPEED

3一定要先配置好glut!!!! 不然你不能opengl画图

4 结尾

我这次没有细讲每个函数有什么用,不过应该标注的比较清楚了,然后就是如果有什么问题,欢迎大家提问,我都会尽力回答的,因为我也是刚接触opengl不久 谢谢大家看我的博客

C++ 使用 openGL 实现吃豆人游戏 一、游戏须知 1.1 实验内容 本节实验主要通过 C++ 和 openGL 库来实现了一个吃豆人的小游戏。主要的课程内容涉 及到 C++ 相关的序 列容器 vector 、deque 和迭代器,以及 openGL 相关的窗口初始化与绘图功能。 1.2 知识点 C++ 编程基础 C++ 模板库使用 openGl 库使用 1.3 实验环境 xfce 终端 ubuntu16.04... 阅读详情

相关推荐

opengl小游戏

使用opengl写点小游戏。原理和实现在b站上传了视频,仅在这里放出源码 Game类声明 #pragma once #include<GL/glut.h> #include"SOIL.h" #include<string> #include<random> #include<ctime> #include<list> #pragma comment(lib, "SOIL.lib") GLuint CreateTexture(const c

s1279574281的博客 3574

见缝插针小游戏开发

####一、主要逻辑 ​ 首先根据配置表设置好游戏数据(比如大球的旋转速度、旋转方向、默认已经插上的针数及间隔角度,小球的数量等按需设置即可),开始游戏后大球不停的旋转,点击屏幕从下方发射“大头针”,并计算好移动距离,这样可以不需要检测针尖和大球的碰撞,当“大头针”移动到指定位置时修改它的父节点为大球,关键来了,这里因为大球一直在旋转,为了让“大头针”始终垂直的插上大球,这里要正确设置小球的旋转角度,大头针的目标坐标为大球的底部,根据大球的半径和角度可以求得具体x、y。如果大头针和大头针相碰了则游戏失败,如

随风的博客 2079

C++ 游戏开发(二)见缝插针小游戏

 见缝插针游戏的规则非常简单,给定一个旋转圆盘,每次按动按键,即可在圆盘上射入一根针,当两个针发生碰撞即挑战失败。胜利条件可以设置射出指定根数后胜利,也可以设置不限根数,以更多的根数作为挑战目标。 画布的设置涉及长宽,颜色设置。 圆盘绘制 绘制线条 实现旋转  旋转的实现改变的变量是角度。设置一个变量,代表角度,另设一变量代表角度的改变量,设置延时函数调整旋转时间。 多根针的实现  前文可知,对于针这一个对象,我们主要改变的是针对应的角度。对于n根针的绘制,就需要同时求n个角度。使用数组存储角度。  此

CCC_B的博客 1511

opengl 3D平衡球小游戏

一、开发环境说明 操作系统:windows 开发软件:Visual Studio 2017 编程语言:基于控制台下的opengl 用到的库: glut opengl环境配置可参照上一篇博客:控制台+OPENGL配置说明[GLUT篇] 二、内容说明 1 、功能介绍 实现游戏开始、游戏结束画面; 实现按键交互功能; 实现纹理贴图; 加载3DS模型功能 实现游戏逻辑:控制木板的倾斜,来移动小球...

热带宇林 3040

用Scratch实现《见缝插针》游戏项目

在Scratch中实现《见缝插针》游戏项目,首先需要创建游戏背景、线团、红针、开始游戏按钮以及通关与游戏结束等素材。

weixin_47284818的博客 2203

OpenGL开发3D推箱子游戏(glut版本,windows平台)

OpenGL开发3D推箱子游戏(glut版本,windows平台) OpenGL开发3D推箱子游戏(glut版本,windows平台) OpenGL开发3D推箱子游戏(glut版本,windows平台) OpenGL开发3D推箱子游戏(glut版本,windows平台) OpenGL开发3D推箱子游戏(glut版本,windows平台)

Unity|小游戏复刻|见缝插针3代码(C#)

与目标发生碰撞,则游戏结束。游戏结束时,会有一个动画效果,然后重新加载当前场景。这是一个简单的游戏,玩家通过点击鼠标让钉子(

ChoSeitaku的博客 1242

windows 小飞机游戏 opengl

windows 小飞机游戏 opengl 是opengl 实现的一个小游戏

Unity制作“见缝插针”小游戏

控制小球旋转 using System.Collections; using System.Collections.Generic; using UnityEngine; public class RotateSelf : MonoBehaviour { //每秒旋转90度 public float speed = 90; // Update is called on...

xiaokunzhang的博客 5989

✨从零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 镜像并上传 Docker Hub

构建一个带 GPU 支持的深度学习开发镜像;使用 PyTorch 2.5.1(CUDA 12.4)环境;发布并托管 Docker 镜像至 Docker Hub;验证 GPU 环境正常运行!🎉 这将极大提升你的项目部署效率,尤其是在多人协作或跨平台部署场景中。

用大模型重构生活:猫奴程序员的AI智能日常记录 1581

干法刻蚀工艺进阶:如何通过调节DC自偏压优化刻蚀速率和各向异性

本文深入探讨了干法刻蚀工艺中DC自偏压的精细调控艺术。DC自偏压是影响刻蚀速率和各向异性的关键因素,文章通过实战案例,详细分析了如何通过调节射频功率、频率、腔室压力及气体成分等参数,间接而有效地控制DC自偏压,从而优化高深宽比硅沟槽等复杂结构的刻蚀效果,实现工艺性能的精准提升。

weixin_28308325的博客 334

C++练手小游戏4——见缝插针

概述 实现效果和涉及的知识 文件结构 具体代码

IHTY_NUI的博客 1471

告别OFDM卡顿:用MATLAB手把手仿真AFDM波形,搞定高铁、无人机通信的时变信道难题

本文详细介绍了如何使用MATLAB仿真AFDM波形,解决高铁和无人机通信中的时变信道难题。通过仿射变换技术,AFDM在多普勒频移严重的场景下表现优异,显著提升通信质量。文章包含参数配置、波形生成、性能对比等实战内容,适合通信工程师和研究人员参考。

weixin_27014595的博客 319

Windows下的指北针(指南针)--OpenGL版 Compass

使用微软支持的OpenGL库,画图形,指定旋转角度,实现指北针的效果。需要搭配微软的Sensor的类来实现。 编译器:VS2010 具体代码内容如下,需要自己将代码调通,没有上传整个项目: http://git.oschina.net/tody_guo/OpenGLCompass /****************************************************

Tody Guo的专栏 2661

告别CMake依赖!在Visual Studio 2022中直接配置VTK 9.4开发环境(附完整项目示例)

本文详细介绍了如何在Visual Studio 2022中直接配置VTK 9.4开发环境,无需依赖CMake。通过图文教程和完整项目示例,帮助C++开发者快速集成VTK库,简化开发流程,提升工作效率。特别适合科学可视化任务的开发者。

weixin_26804345的博客 416

风力发电机并网模型建立及仿真验证

传统能源日益匮乏,环境污染日趋严重,全球向安全、可靠和环保的可持续能源体系转型迫在眉睫,风电迎来了重要的发展契机。近年来,全球风电迅猛发展,我国已成为世界风电新增装机容量第一的国家。然而,随着风电规模的不断增大,风电场接入对系统影响不容忽视。随着变速恒频风力发电系统优越的性能突出和大容量电力电子技术的成熟,风速随机性引起的功率波动及故障情况下的动态响应,对电能质量,系统电压、频率的稳定性产生的影响需要深入研究。因而,本文结合实际项目,针对变速恒频风力发电系统建模,端口动态特性及对电网电能质量、运行稳定性的影

毕业设计区博客 1643

OpenGL推箱子小游戏

我们直接将整个程序运行起来,进入到游戏当中。游戏UI时使用ImGui这个轻量化的GUI框架来实现的。整个界面有开始界面,暂停界面,过关界面,通关界面游戏开始界面暂停界面过关界面通关界面游戏规则推箱子这个游戏相信大家以前或多或少都玩过,这里还是简单介绍一下,玩家控制角色,将箱子推动到指定位置,就算成功,角色不能拉动箱子,墙壁也是无法被推动的。游戏设计介绍角色:粉色的方块(玩家),绿色的方块(箱子),橙色的方块(目的地),蓝色的方块(空地,可以在上面进行移动),白色方块(墙壁)。

qq_45651072的博客 1212

workbench拓扑优化教程_拓扑优化实例-轮毂的优化

拓扑优化实例-轮毂的优化ANSYS Workbench的新版本集成了topology optimization模块,为用户的拓扑优化提供的很好的应用。通过拓扑优化topology optimization模块的使用可以对拓扑有较好的理解,该模块拓扑优化可以简单概括为一句话:如何在合适的位置去除确定的材料使用量,而相应的刚度变化影响最小。本例以汽车轮毂为例,来确定轮毂的辐条形状。1.建立模型DM中可...

weixin_39581739的博客 3044

OPENGL小游戏

game

Constantinapole的博客 413

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 472

K8s(二十一):在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

🔴 K8s(二十一):在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3万+

OpenGL 游戏开发: 熟悉练习【《OpenGL超级宝典》第二章】

学习了《OpenGL超级宝典》第二章后,编写了我们的第一个OpenGL程序,也真正开始了OpenGL之旅。 下面来让我们一起重新练习熟悉一下第二章的3个例子吧! 1. "Triangle" 第一个三角形 通过这个例子我们熟悉了OpenGL的一些流程,如初始化、窗口的创建、窗口的标题、图形的渲染等。 具体的例子代码我就不复制贴出了哈~,下面我只贴出我对此例子做的一些学习扩展: // +++++++++++++++++++++++++++++++++++++++ // 《OpenGL 超级宝..

南雨兮 1156

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OpenGL中的freeglut和glew的作用和区别

这两个库都是用于让OpenGL程序编写更简单,下载链接:freeglut和glew 一,为什么需要freeglut和glew OpenGL官方文档中提到: Before you can actually use OpenGL in a program, you must first initialize it. Because OpenGL is platform-independent...

你可知外面的世界多大 8154

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”...

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历。(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ------------------------------------------...

dgsfor的博客 966

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Unity知识速递】第7期 Unity 6.6 深度解析:WebGPU 正式版与 WebAssembly64,Web 游戏的内存革命

如何启用 Wasm64?需要注意的是,Wasm64 需要浏览器支持 Memory64 提案,目前主流浏览器的最新版本都已支持。一句话总结: Unity 6.6 用 WebGPU 转正、Wasm64 16GB 内存和渐进式加载三连击,将 Web 游戏的体验天花板又往上推了一大截——Web 平台不再是"妥协版",正在成为真正的一等公民。Unity 6.6 新增了 WebAssembly64(Wasm64) 构建选项,这可能是本次更新中对 Web 游戏开发者影响最大的一项升级。

crystal_WJT的博客 435
上一篇: 使用vim显示多行指定字符的删除(真的太好用了)|小知识
下一篇: 吸血鬼数字| JAVA
LLLLQZ
博客等级 码龄7年 308粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值