📄 tutorial_32.htm
字号:
<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->width = header[1] * 256 + header[0]; <font color="#ffffaa">// 定义 TGA 宽</font>
texture->height = header[3] * 256 + header[2]; <font color="#ffffaa">// 定义 TGA 高</font>
if( texture->width <=0 || <font color="#ffffaa">// 若 宽<=0</font>
texture->height <=0 || <font color="#ffffaa">// 若 高<=0</font>
(header[4]!=24 && header[4]!=32)) <font color="#ffffaa">// 若 TGA 是 24 or 32 位?</font>
{
fclose(file); <font color="#ffffaa">// 若有任何错误, 关掉文件</font>
return FALSE; <font color="#ffffaa">// 返回错误</font>
}
texture->bpp = header[4]; <font color="#ffffaa">// 取 TGA 的位每象素 (24 或 32)</font>
bytesPerPixel = texture->bpp/8; <font color="#ffffaa">// 除以 8 得到字节每象素</font>
imageSize = texture->width*texture->height*bytesPerPixel; <font color="#ffffaa">// 计算 所需内存为 TGA 数据</font>
texture->imageData=(GLubyte *)malloc(imageSize); <font color="#ffffaa">// 分配 内存 为 TGA 数据</font>
if( texture->imageData==NULL || <font color="#ffffaa">// 这个内存是否存在?</font>
fread(texture->imageData, 1, imageSize, file)!=imageSize) <font color="#ffffaa">// 图片大小与保留内存的大小想等 ?</font>
{
if(texture->imageData!=NULL) <font color="#ffffaa">// 图片数据的调入</font>
free(texture->imageData); <font color="#ffffaa"> // 若成功, 释放图象数据</font>
fclose(file); <font color="#ffffaa">// 关掉文件</font>
return FALSE; <font color="#ffffaa">// 返回错误</font>
}
for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) <font color="#ffffaa"> // 在图象数据里循环</font>
{ <font color="#ffffaa">// 交换第1和第3 Bytes (’红’red 和 ’蓝’blue)</font>
temp=texture->imageData[i]; <font color="#ffffaa"> // 临时存储 图象的 ’i’</font>
texture->imageData[i] = texture->imageData[i + 2]; <font color="#ffffaa"> // 设 第1 Byte 得到变量 第3 Byte</font>
texture->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, &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 + -