关于七巧板中某些需要提一嘴的技术实现

关于七巧板中某些需要提一嘴的技术实现

  • :本篇只提及技术实现思路,不涉及完整源码

判断鼠标点击是否能取到某个图形

  • 这个东西还是班里的算法大佬给的我思路:“你取到鼠标当前点,和三角形的三个边拼成三角形去计算面积,如果你的鼠标在三角形内,则这三个三角形面积和等于原三角形,否则这三个三角形面积和要大于原三角形。”,我当场直呼内行,大佬就是大佬。(另外一个大佬跟我讲用海伦公式可以很容易算出三角形面积)
  • 所以接下来我首先实现了海伦公式封装了一个函数。
  • 接着我得取到鼠标点击位置,这个在Openglio回调部分提到怎么做OpenGL入手(io回调)
  • 然后具体图形具体实现判断方式,拿三角形来说就是上面的判断方法。其他图形也类似。

图形动态颜色

  • 因为刚入手OpenGL,操作还很生疏,可能有更高端的操作能实现动态更改图形渲染颜色,但我不会,所以我就在c++中用了本办法+动态编译其shader进行了动态颜色的实现。
  • 我先搓了一个字符串作为片元着色器的代码。然后每次颜色改变我给这个字符串重新赋值,赋值代码如下:
fragmentShaderSource = "#version 330 core\n"
		"out vec4 color;\n"
		"void main()\n"
		"{\n"
		"color = vec4(" + Convert(color[0]) + "," + Convert(color[1]) + "," + Convert(color[2]) + "," + Convert(color[3]) + ");\n"
		"}\n\0";
  • 说白了就是要拼接代码,把颜色属性给拼进去。然后是如何用这个string对象去编译shader。这部分由于编译API只接受const glchar* const* 对象,所以直接.c_str()是不行的。这边我定义了一个新的char对象,为其动态分配好相当于string长度加一的内存(因为string不会把最后的’\0’算长度,所以为了把这玩意一起加上去,长度要加一)。接着把string中的内容考进去就行。用这个新的char对象编译shader就可以了,代码如下
void Graph::CreateFragmentShader()
{
	fragmentShaderSource = "#version 330 core\n"
		"out vec4 color;\n"
		"void main()\n"
		"{\n"
		"color = vec4(" + Convert(color[0]) + "," + Convert(color[1]) + "," + Convert(color[2]) + "," + Convert(color[3]) + ");\n"
		"}\n\0";
	char* ShaderSource = (char*)malloc((fragmentShaderSource.length() + 1) * sizeof(char));
	int i = 0;
	for (; i < fragmentShaderSource.length(); i++)
	{
		ShaderSource[i] = fragmentShaderSource[i];
	}
	ShaderSource[i] = '\0';

	fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	//把片元着色器源码绑定给刚刚实例化的对象
	//第一个参数是着色器对象,第二个参数是源码有几个字符串,第三个参数是源码,第四个暂时设置为空
	glShaderSource(fragmentShader, 1, &ShaderSource, NULL);
	//动态编译他
	glCompileShader(fragmentShader);
	//定义一个整形来检测编译是否成功
	GLint success;
	//错误日志的存储区
	GLchar infoLog[512];
	//检查编译是否成功,将结果给success
	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
	//编译失败就打印日志
	if (!success)
	{
		glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
		std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
	}
}
七巧板游戏可以通过计算机图形学实现。下面是一个简单的实现过程: 1. 设计游戏界面:使用图形库(如OpenGL)创建一个窗口,绘制游戏背景和七巧板的初始位置。 2. 加载七巧板模型:将七巧板的模型文件加载到程序。可以使用3D建模软件(如Blender)创建模型并导出为OBJ格式。 3. 实现拖拽功能:通过鼠标交互实现七巧板的拖拽功能。当用户点击鼠标左键时,程序会检测鼠标所在的位置是否在七巧板上,并记录下鼠标与七巧板的相对位置。当用户移动鼠标时,程序会根据鼠标位置计算出七巧板的新位置,并重新绘制它。 4. 实现旋转功能:通过鼠标交互实现七巧板的旋转功能。当用户点击鼠标右键时,程序会记录下鼠标与七巧板的相对位置,并维持这个相对位置不变。当用户移动鼠标时,程序会根据鼠标移动的距离计算出旋转角度,并将七巧板绕着相对位置进行旋转。 5. 实现碰撞检测:不允许七巧板之间重叠或超出游戏界面。因此需要实现碰撞检测功能。当七巧板移动或旋转时,程序会检测它与其他七巧板或游戏界面的碰撞情况,并进行相应的处理。 6. 实现游戏结束检测:当所有七巧板都被合到游戏界面合法的位置时,游戏结束。 以上是七巧板游戏的基本实现过程,具体实现方法还需根据具体的图形库和编程语言进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值