⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_32.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      <p>texid 能是从0到4的数. 0 表示是蓝面材质, 1 是水桶材质, 2 是靶子的材质 , 3 是 可乐的材质 和 4 是 花瓶 材质. 
        最近在调入材质的代码, 你将看到先前5种材质来自目标图片. </p>
      <p>x 和 y 两者都用来记屏模上物体的位置. x 表示物体在 x-轴, y 表示物体在 y-轴. </p>
      <p>物体在z-轴上的旋转是记在变量spin. 在以后的代码, 我们将加或减spin基数在旅行的方向上. </p>
      <p>最后, distance 保存我们物体到屏幕的距离. 距离是极端重要的变量, 我们将用他来计算屏幕的左右两边, 而且在对象关闭之前排序物体,画出物体的距离. 
      </p>
      <p><br>
      </p></td><td background="Tutorial_32_files/r.png"><img src="Tutorial_32_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>struct objects {
	GLuint	rot;								<font color="#ffffaa">// 旋转 (0-不转, 1-顺时针转, 2-逆时针转)</font>
	bool	hit;								<font color="#ffffaa">// 物体碰撞?</font>
	GLuint	frame;								<font color="#ffffaa">// 当前爆炸效果的动画帧</font>
	GLuint	dir;								<font color="#ffffaa">// 物体的方向 (0-左, 1-右, 2-上, 3-下)</font>
	GLuint	texid;								<font color="#ffffaa">// 物体材质 ID</font>
	GLfloat	x;								<font color="#ffffaa">// 物体 X 位置</font>
	GLfloat y;								<font color="#ffffaa">// 物体 Y 位置</font>
	GLfloat	spin;								<font color="#ffffaa">// 物体旋转</font>
	GLfloat	distance;							<font color="#ffffaa">	// 物体距离</font>
};
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_32_files/l.png"><img src="Tutorial_32_files/l.png"></td>
    <td valign="top" width="100%">解释下面的代码没有真正的结果. 我们在这课调入TGA图代替bitmaps图片. 下面的用来表示TGA图片数据的结构是尽可能好的 
      . 若你需要详细的解释下面的代码,请读关于调入TGA 文件的课程. </td>
    <td background="Tutorial_32_files/r.png"><img src="Tutorial_32_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>typedef struct									<font color="#ffffaa">// 新建一个结构</font>
{
	GLubyte	*imageData;							<font color="#ffffaa">// 图片数据 (最大 32 位)</font>
	GLuint	bpp;								<font color="#ffffaa">// 图片颜色深度 每象素</font>
	GLuint	width;								<font color="#ffffaa">// 图片宽度</font>
	GLuint	height;								<font color="#ffffaa">// 图片高度</font>
	GLuint	texID;								<font color="#ffffaa">// 贴图材质 ID 用来选择一个材质</font>
} TextureImage;									<font color="#ffffaa">// 结构 名称</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_32_files/l.png"><img src="Tutorial_32_files/l.png"></td>
    <td valign="top" width="100%">紧接下面的代码为们10个材质和个30物体留出空间. 若你打算在游戏里加更多物体,得增加这个变量到你想到的数</td>
    <td background="Tutorial_32_files/r.png"><img src="Tutorial_32_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>TextureImage textures[10];							<font color="#ffffaa">// 定义10个材质</font>

objects	object[30];							<font color="#ffffaa">// 定义 30 个物体</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_32_files/l.png"><img src="Tutorial_32_files/l.png"></td>
    <td valign="top" width="100%">我不想限制每个物体的大小. 我想瓶子(vase)比can高, 我想水桶bucket比瓶子宽. 去改变一切是简单的, 
      我建了一个结构存物体的宽和高. 
      <p>我然后在最后一行代码中设每个物体的宽高. 得到这个coke cans的宽, 我将检查size[3].w. 蓝面是 0, 水桶是 1, 和靶子是 
        2, 等. 宽度表现在 w. 使有意义? </p>
      <p><br>
      </p></td><td background="Tutorial_32_files/r.png"><img src="Tutorial_32_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>struct dimensions {								<font color="#ffffaa">// 物体维数</font>
	GLfloat	w;								<font color="#ffffaa">// 物体宽</font>
	GLfloat h;								<font color="#ffffaa">// 物体高</font>
};

<font color="#ffffaa">// 每个物体的大小: 蓝面, 水桶, 靶子, 可乐, 瓶子</font>
dimensions size[5] = { {1.0f,1.0f}, {1.0f,1.0f}, {1.0f,1.0f}, {0.5f,1.0f}, {0.75f,1.5f} };
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_32_files/l.png"><img src="Tutorial_32_files/l.png"></td>
    <td valign="top" width="100%">下面是大段代码是调入我们 TGA 图片和转换他为材质. 这是同我在第25课所用的一样的代码,你可回去看一看. 
      <p>我用TGA 图片的原因是他们是有alpha 通道的. 这个alpha 通道告诉 OpenGL 哪一部分图是透明的,哪一部分是白底. alpha 
        通道是被建立在图片处理程序, 并保存在.TGA图片里面. OpenGL 调入图片, 能用alpha 通道设置图片中每个象素透明的数量. </p>
      <p></p></td><td background="Tutorial_32_files/r.png"><img src="Tutorial_32_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_32_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_32_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_32_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
</font><pre><font color="#aaffaa" size="3">bool LoadTGA(TextureImage *texture, char *filename)					<font color="#ffffaa">// 调入一个TGA 文件到内存</font>
{
	GLubyte		TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};			<font color="#ffffaa">// (未)压缩的 TGA 头</font>
	GLubyte		TGAcompare[12];						<font color="#ffffaa">// 用来比较 TGA 头</font>
	GLubyte		header[6];						<font color="#ffffaa">// 首先 6 个有用的字节</font>
	GLuint		bytesPerPixel;						<font color="#ffffaa">// 每象素字节数在 TGA 文件使用</font>
	GLuint		imageSize;						<font color="#ffffaa">// 用来图片大小的存储</font>
	GLuint		temp;							<font color="#ffffaa">// 临时变量</font>
	GLuint		type=GL_RGBA;						<font color="#ffffaa">// 设置默认的 GL 模式 为 RBGA </font>

	FILE *file = fopen(filename, "rb");						<font color="#ffffaa">// 打开 TGA 文件</font>

	if(	file==NULL ||							<font color="#ffffaa">// 文件是否已存在 ?</font>
		fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||	<font color="#ffffaa">// 是否读出12个字节?</font>
		memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 ||			<font color="#ffffaa">// 文件头是不是我们想要的 ?</font>
		fread(header,1,sizeof(header),file)!=sizeof(header))		<font color="#ffffaa">	// 若正确则读下 6 个 Bytes</font>
	{
		if (file == NULL)						<font color="#ffffaa">	// 文件是否已存在 ? </font>
			return FALSE;						<font color="#ffffaa">// 返回错误</font>
		else								<font color="#ffffaa">// 否则</font>
		{
			fclose(file);						<font color="#ffffaa">// 若有任何错误, 关掉文件</font>
			return FALSE;						<font color="#ffffaa">// 返回错误</font>
		}
	}

	texture-&gt;width  = header[1] * 256 + header[0];				<font color="#ffffaa">// 定义 TGA 宽</font>
	texture-&gt;height = header[3] * 256 + header[2];				<font color="#ffffaa">// 定义 TGA 高</font>

 	if(	texture-&gt;width	&lt;=0 ||						<font color="#ffffaa">// 若 宽&lt;=0</font>
		texture-&gt;height	&lt;=0 ||						<font color="#ffffaa">// 若 高&lt;=0</font>
		(header[4]!=24 &amp;&amp; header[4]!=32))					<font color="#ffffaa">// 若 TGA 是 24 or 32 位?</font>
	{
		fclose(file);							<font color="#ffffaa">// 若有任何错误, 关掉文件</font>
		return FALSE;							<font color="#ffffaa">// 返回错误</font>
	}

	texture-&gt;bpp	= header[4];						<font color="#ffffaa">// 取 TGA 的位每象素 (24 或 32)</font>
	bytesPerPixel	= texture-&gt;bpp/8;						<font color="#ffffaa">// 除以 8 得到字节每象素</font>
	imageSize		= texture-&gt;width*texture-&gt;height*bytesPerPixel;		<font color="#ffffaa">// 计算 所需内存为 TGA 数据</font>

	texture-&gt;imageData=(GLubyte *)malloc(imageSize);				<font color="#ffffaa">// 分配 内存 为 TGA 数据</font>

	if(	texture-&gt;imageData==NULL ||						<font color="#ffffaa">// 这个内存是否存在?</font>
		fread(texture-&gt;imageData, 1, imageSize, file)!=imageSize)		<font color="#ffffaa">// 图片大小与保留内存的大小想等 ?</font>
	{
		if(texture-&gt;imageData!=NULL)					<font color="#ffffaa">// 图片数据的调入</font>
			free(texture-&gt;imageData);				<font color="#ffffaa">	// 若成功, 释放图象数据</font>

		fclose(file);							<font color="#ffffaa">// 关掉文件</font>
		return FALSE;							<font color="#ffffaa">// 返回错误</font>
	}

	for(GLuint i=0; i&lt;int(imageSize); i+=bytesPerPixel)			<font color="#ffffaa">	// 在图象数据里循环</font>
	{									<font color="#ffffaa">// 交换第1和第3 Bytes (’红’red 和 ’蓝’blue)</font>
		temp=texture-&gt;imageData[i];					<font color="#ffffaa">	// 临时存储 图象的 ’i’</font>
		texture-&gt;imageData[i] = texture-&gt;imageData[i + 2];		<font color="#ffffaa">	// 设 第1 Byte 得到变量 第3 Byte</font>
		texture-&gt;imageData[i + 2] = temp;					<font color="#ffffaa">// 设第3 Byte 得到变量 ’temp’ (第1 Byte 变量)</font>
	}

	fclose (file);								<font color="#ffffaa">// 关掉文件</font>

	<font color="#ffffaa">// 建立一个贴图材质从以上数据</font>
	glGenTextures(1, &amp;texture[0].texID);						<font color="#ffffaa">// 生成 OpenGL 材质 ID</font>

	glBindTexture(GL_TEXTURE_2D, texture[0].texID);				<font color="#ffffaa">// 绑定我们的材质</font>
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);	<font color="#ffffaa">	// 线过滤器</font>
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);		<font color="#ffffaa">// 线过滤器</font>

	if (texture[0].bpp==24)							<font color="#ffffaa">// 若 TGA 是24 位的</font>
	{
		type=GL_RGB;							<font color="#ffffaa">// 设 ’type’ 为 GL_RGB</font>
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -