📄 tutorial_21.htm
字号:
glLoadIdentity();
glTranslatef(490+(loop1*40.0f),40.0f,0.0f); <font color="#ffffaa">// 移动到屏幕右上角</font>
glRotatef(-player.spin,0.0f,0.0f,1.0f); <font color="#ffffaa">// 旋转绘制的生命图标</font>
glColor3f(0.0f,1.0f,0.0f); <font color="#ffffaa">// 绘制玩家生命</font>
glBegin(GL_LINES); <font color="#ffffaa">// 绘制玩家图标</font>
glVertex2d(-5,-5);
glVertex2d( 5, 5);
glVertex2d( 5,-5);
glVertex2d(-5, 5);
glEnd();
glRotatef(-player.spin*0.5f,0.0f,0.0f,1.0f);
glColor3f(0.0f,0.75f,0.0f);
glBegin(GL_LINES);
glVertex2d(-7, 0);
glVertex2d( 7, 0);
glVertex2d( 0,-7);
glVertex2d( 0, 7);
glEnd();
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_21_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_21_files/l.png"><img src="Tutorial_21_files/l.png"></td>
<td valign="top" width="100%">下面我们来绘制网格,我们设置变量filled为TRUE,这告诉程序填充网格。
<p>接着我们把线的宽度设置为2,并把线的颜色设置为蓝色,接着我们检测线断是否被走过,如果走过我们设置颜色为白色。</p>
<p></p></td><td background="Tutorial_21_files/r.png"><img src="Tutorial_21_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_21_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> filled=TRUE; <font color="#ffffaa">// 在测试前,把填充变量设置为TRUE</font>
glLineWidth(2.0f); <font color="#ffffaa">// 设置线宽为2.0f</font>
glDisable(GL_LINE_SMOOTH); <font color="#ffffaa">// 禁用反走样</font>
glLoadIdentity();
for (loop1=0; loop1<11; loop1++) <font color="#ffffaa">// 循环11根线</font>
{
for (loop2=0; loop2<11; loop2++) <font color="#ffffaa">// 循环每根线的线段</font>
{
glColor3f(0.0f,0.5f,1.0f); <font color="#ffffaa">// 设置线为蓝色</font>
if (hline[loop1][loop2]) <font color="#ffffaa">// 是否走过?</font>
{
glColor3f(1.0f,1.0f,1.0f); <font color="#ffffaa">// 是,设线为白色</font>
}
if (loop1<10) <font color="#ffffaa">// 绘制水平线</font>
{
if (!hline[loop1][loop2]) <font color="#ffffaa">// 如果当前线段没有走过,则不填充</font>
{
filled=FALSE;
}
glBegin(GL_LINES); <font color="#ffffaa">// 绘制当前的线段</font>
glVertex2d(20+(loop1*60),70+(loop2*40));
glVertex2d(80+(loop1*60),70+(loop2*40));
glEnd();
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_21_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_21_files/l.png"><img src="Tutorial_21_files/l.png"></td>
<td valign="top" width="100%"> 下面的代码绘制垂直的线段</td>
<td background="Tutorial_21_files/r.png"><img src="Tutorial_21_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_21_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> glColor3f(0.0f,0.5f,1.0f); <font color="#ffffaa">// <font color="#aaffaa" size="3"><font color="#ffffaa">设置线为蓝色</font></font></font>
if (vline[loop1][loop2]) <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">是否走过</font></font>
{
glColor3f(1.0f,1.0f,1.0f); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">是,设线为白色</font></font>
}
if (loop2<10) <font color="#ffffaa">// 绘制垂直线</font>
{
if (!vline[loop1][loop2]) <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">如果当前线段没有走过,则不填充</font></font>
{
filled=FALSE;
}
glBegin(GL_LINES); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">绘制当前的线段</font></font>
glVertex2d(20+(loop1*60),70+(loop2*40));
glVertex2d(20+(loop1*60),110+(loop2*40));
glEnd();
}
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_21_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_21_files/l.png"><img src="Tutorial_21_files/l.png"></td>
<td valign="top" width="100%">接下来我们检测长方形的四个边是否都被走过,如果被走过我们就绘制一个带纹理的四边形。 <p>我们用下图来解释这个检测过程</p>
<br> <br> <center>
<img src="Tutorial_21_files/lesson21-1.jpg">
</center>
<br>
如果对于垂直线vline的相邻两个边都被走过,并且水平线hline的相邻两个边也被走过,那么我们就可以绘制这个四边形了。我们可以使用循环检测每一个四边形,代码如下:</td>
<td background="Tutorial_21_files/r.png"><img src="Tutorial_21_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_21_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> glEnable(GL_TEXTURE_2D); <font color="#ffffaa">// 使用纹理映射</font>
glColor3f(1.0f,1.0f,1.0f); <font color="#ffffaa">// 设置为白色</font>
glBindTexture(GL_TEXTURE_2D, texture[1]); <font color="#ffffaa">// 绑定纹理</font>
if ((loop1<10) && (loop2<10)) <font color="#ffffaa">// 绘制走过的四边形</font>
{
<font color="#ffffaa">// 这个四边形是否被走过?</font>
if (hline[loop1][loop2] && hline[loop1][loop2+1] && vline[loop1][loop2] && vline[loop1+1][loop2])
{
glBegin(GL_QUADS); <font color="#ffffaa">// 是,则绘制它</font>
glTexCoord2f(float(loop1/10.0f)+0.1f,1.0f-(float(loop2/10.0f)));
glVertex2d(20+(loop1*60)+59,(70+loop2*40+1));
glTexCoord2f(float(loop1/10.0f),1.0f-(float(loop2/10.0f)));
glVertex2d(20+(loop1*60)+1,(70+loop2*40+1));
glTexCoord2f(float(loop1/10.0f),1.0f-(float(loop2/10.0f)+0.1f));
glVertex2d(20+(loop1*60)+1,(70+loop2*40)+39);
glTexCoord2f(float(loop1/10.0f)+0.1f,1.0f-(float(loop2/10.0f)+0.1f));
glVertex2d(20+(loop1*60)+59,(70+loop2*40)+39);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
}
}
glLineWidth(1.0f);
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_21_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_21_files/l.png"><img src="Tutorial_21_files/l.png"></td>
<td valign="top" width="100%">下面的代码用来设置是否启用直线反走样</td>
<td background="Tutorial_21_files/r.png"><img src="Tutorial_21_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_21_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> if (anti) <font color="#ffffaa">// 是否启用反走样?</font>
{
glEnable(GL_LINE_SMOOTH);
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_21_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_21_files/l.png"><img src="Tutorial_21_files/l.png"></td>
<td valign="top" width="100%">为了使游戏变得简单些,我添加了一个时间停止器,当你吃掉它时,可以让追击的你的敌人停下来。
<p>下面的代码用来绘制一个时间停止器。</p></td><td background="Tutorial_21_files/r.png"><img src="Tutorial_21_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_21_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> if (hourglass.fx==1)
{
glLoadIdentity();
glTranslatef(20.0f+(hourglass.x*60),70.0f+(hourglass.y*40),0.0f);
glRotatef(hourglass.spin,0.0f,0.0f,1.0f);
glColor3ub(rand()%255,rand()%255,rand()%255); </pre>
</font><font color="#aaffaa" size="3">
<pre> glBegin(GL_LINES);
glVertex2d(-5,-5);
glVertex2d( 5, 5);
glVertex2d( 5,-5);
glVertex2d(-5, 5);
glVertex2d(-5, 5);
glVertex2d( 5, 5);
glVertex2d(-5,-5);
glVertex2d( 5,-5);
glEnd();
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_21_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_21_files/l.png"><img src="Tutorial_21_files/l.png"></td>
<td valign="top" width="100%">接下来绘制我们玩家</td>
<td background="Tutorial_21_files/r.png"><img src="Tutorial_21_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_21_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_21_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_21_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> glLoadIdentity();
glTranslatef(player.fx+20.0f,player.fy+70.0f,0.0f); <font color="#ffffaa">// 设置玩家的位置</font>
glRotatef(player.spin,0.0f,0.0f,1.0f); <font color="#ffffaa">// 旋转动画</font>
glColor3f(0.0f,1.0f,0.0f);
glBegin(GL_LINES);
glVertex2d(-5,-5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -