📄 main.c
字号:
glVertex3f(127 - i *7,-23, 0.0);
glTexCoord2f(1.f, 0.f);
glVertex3f(127 - i * 7,-30, 0.0);
glEnd();
}
glDisable(GL_TEXTURE_2D);
// printf("%d\n",floors);
}
void drawman(void)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[man.animState]); // 显示不同贴图texture[var]
// glBindTexture(GL_TEXTURE_2D, textures[5]);
// glFrontFace(GL_CW);
// glNormal3f(0.f, 0.f, 1.f);
glFrontFace(GL_CW);
glBegin(GL_QUADS);
glNormal3f(0.f, 0.f, 1.f);
glTexCoord2f(0.f,0.f);
glVertex3f(man.x-man.MANWID /2.0, man.y-man.MANHEI /2.0, 0.0);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(man.x-man.MANWID /2.0, man.y+man.MANHEI /2.0, 0.0);
glTexCoord2f(1.f, 1.f);
glVertex3f(man.x+man.MANWID /2.0, man.y+man.MANHEI /2.0, 0.0);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(man.x+man.MANWID /2.0, man.y-man.MANHEI /2.0, 0.0);
glEnd();
// glRectf(man.x - man.MANWID/2.0, man.y - man.MANHEI/2.0, man.x + man.MANWID/2.0, man.y + man.MANHEI/2.0);
glDisable(GL_TEXTURE_2D);
}
void renderscene(void)
{
int i;
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity (); /* clear the matrix */
/*测试
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[man.animState]);
glFrontFace(GL_CW);
glNormal3f(0.f, 0.f, 1.f);
glRectf(-(140 - 10), 0, -(140 - 10 - 20),20);
*/
for(i = index_highest; i != index_lowest ; i = (i +1)%NUMOFBOARDS) // 从highest到lowest-1
drawboard(boards[i]);
drawman();
background(); //画背景
drawhealth();
drawfloors();
glutSwapBuffers();
}
void TimerFunction(int value)
{
// a+=x_step;
// b+=y_step;
static int n, t,f;
int i;
if(begin)
{
//更新板的数组,产生新板,去掉旧板,板的速度为1
for(i = index_highest; i != index_lowest ; i = (i +1)%NUMOFBOARDS) //每个板往上移
{
boards[i].y +=x_step;
if(boards[i].y > UPBOUND)
index_highest = (index_highest + 1)% NUMOFBOARDS; //消失最高的板
}
if(drawed) //产生下一个板的位置和类型
{
ranX = rand()%((DISWIDTH - BLENGTH - 2*EMPTYWID)*10)/10 - (WIDTH/2.0 - LEFTE - EMPTYWID - BLENGTH/2.0);
ranY = rand()%((MAXGAP - MINGAP)*10)/10 + MINGAP; //和上一个板的距离
ranType = rand()%(NUMOFTYPES);
drawed = 0;
}
if(index_lowest == ((index_highest +NUMOFBOARDS) -1)%NUMOFBOARDS) //满了
;
else //加一个
{
if(boards[((index_lowest +NUMOFBOARDS) -1)%NUMOFBOARDS].y + (HEIGHT/2 - 10) >=ranY)
{
boards[index_lowest].x = ranX;
boards[index_lowest].y = -(HEIGHT/2 - BOTTOM + BHEIGHT/2);
boards[index_lowest].type = ranType;
index_lowest = (index_lowest + 1) %NUMOFBOARDS;
drawed = 1;
}
}
//
if(man.y >= UPBOUND - man.MANHEI/2.0)//人碰到顶
{
man.hp -= 3;
man.state = 1;
man.ondown = 1;
man.animState = MANBEGIN;
man.vy = -1;
man.y +=man.vy;
}
if(man.state == 0) //在板上
{
if(man.x > boards[man.onboard].x - BLENGTH/2.0 - man.MANWID/2.0
&&man.x < boards[man.onboard].x + BLENGTH/2.0 + man.MANWID/2.0)
// if(man.x > boards[man.onboard].x - BLENGTH/2.0
// &&man.x < boards[man.onboard].x + BLENGTH/2.0 )
{
man.y = boards[man.onboard].y + BHEIGHT/2.0 + man.MANHEI/2.0;
if(man.walk == 0)
man.animState = MANBEGIN;
else if(man.walk == 1) //左走
{
++t;
if(t >= 3)//人物动画快慢调整
{
man.animState = (man.animState-(MANBEGIN + 1) + 1)%2 + MANBEGIN+1; //TODO:更换人物贴图
t = 0;
}
}
else if(man.walk == 2) //右走
{
++t;
if(t >= 3)// 人物动画快慢调整
{
man.animState = (man.animState -(MANBEGIN + 3)+ 1)%2 +MANBEGIN + 3;
t = 0;
}
// man.x += man.walkspeed;
// man.vx = man.walkspeed;
// man.walk = 0;
}
if(boards[man.onboard].type == 3) //滑下
{
++n;
if(n >= 10)
{
man.state = 1;
man.ondown = 1;
n = 0;
}
}
if(boards[man.onboard].type == 1&& man.hp <= 0) //带刺
{
man.state = 1;
man.ondown = 1;
}
}
else
{
man.state = 1;
}
}
else if (man.state == 1) //在空中
{
for(i = man.onboard; i != index_lowest ; i = (i +1)%NUMOFBOARDS)
{
if(man.x > boards[i].x - BLENGTH/2.0 - man.MANWID/2.0
&&man.x < boards[i].x + BLENGTH/2.0 + man.MANWID/2.0
&&man.y > boards[i].y - (MINGAP - BHEIGHT/2.0 - man.MANHEI/2.0)*0.7
&&man.y <= boards[i].y + BHEIGHT/2.0 + man.MANHEI/2.0)
break;
}
if( man.ondown || i == index_lowest ||man.hp <= 0)//没踩到
{
if(man.x <= -(WIDTH/2.0 - LEFTE - man.MANWID/2.0))
{
man.x = -(WIDTH/2.0 - LEFTE - man.MANWID /2.0);
man.vx *= -1;
}
else if(man.x >= (WIDTH/2.0 - RIGHTE - man.MANWID/2.0))
{
man.x = WIDTH/2.0 - RIGHTE - man.MANWID/2.0;
man.vx *= -1;
}
if(man.y < -(HEIGHT/2.0 - BOTTOM))
man.hp = 0;
man.x += man.vx;
man.y += man.vy;
if(man.y < boards[i].y - (MINGAP - BHEIGHT/2.0 - man.MANHEI/2.0))
man.ondown = 0;
if(man.hp <= 0)
{
man.vx = 0;
man.animState = MANBEGIN;
}
else
{
if(man.walk == 0)
man.vx *= 0.8;
else if(man.walk == 1)
{
man.vx = -man.walkspeed;
man.animState = MANBEGIN + 1;
// man.walk = 0;
}
else if(man.walk ==2)
{
man.vx = man.walkspeed;
man.animState = MANBEGIN + 3;
// man.walk = 0;
}
}
man.vy += -0.3; //加速度
}
else //踩到一块板
{
d++;
if(boards[i].type == 0) //普通板
{
man.state =0; //到板上
man.animState = MANBEGIN;
man.vx = 0;
man.vy = -0.5;
man.onboard = i;
man.y =boards[i].y + BHEIGHT/2.0 + man.MANHEI/2.0;
++man.hp;
if(man.hp >10)
man.hp = 10;
}
else if(boards[i].type ==1) //带刺
{
man.state =0; //到板上
man.animState = MANBEGIN;
man.vx = 0;
man.vy = -0.5;
man.onboard = i;
man.y =boards[i].y + BHEIGHT/2.0 + man.MANHEI/2.0;
//man.hp ++;//TODO:
man.hp -=3;
}
else if(boards[i].type ==2) //弹起
{
// man.state =0; //到板上
man.animState = MANBEGIN;
man.vx = 0;
man.vy = 4;
man.y += man.vy;
man.onboard = i;
// man.y =boards[i].y + BHEIGHT/2.0 + man.MANHEI/2.0;
++man.hp;
if(man.hp >10)
man.hp = 10;
}
else if(boards[i].type ==3) //滑下
{
man.state =0; //到板上
man.animState = MANBEGIN;
man.vx = 0;
man.vy = -0.5;
man.onboard = i;
man.y =boards[i].y + BHEIGHT/2.0 + man.MANHEI/2.0;
++man.hp;
if(man.hp >10)
man.hp = 10;
}
}
}
/////////计算层数//////////////
++f;
if(f >= HEIGHT/2.0 - BOTTOM + UPBOUND && man.hp > 0)
{
++floors;
f = 0;
}
glutPostRedisplay();
}
glutTimerFunc(30, TimerFunction, 1);
}
void KeyPressFunc(unsigned char key, int x, int y)
{
switch (key)
{
case 'b':
case 'B':
begin ^= 1;
break;
case 'r':
case 'R':
begin = 0;
ini();
break;
case 27 : /* ESC */
exit(0);
}
// Refresh the Window
glutPostRedisplay();
}
void SpecialKeys(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_LEFT:
man.walk = 1;
if(man.state == 0)
{
if(man.x <= -(WIDTH/2.0 - LEFTE - man.MANWID/2.0))
{
man.x = -(WIDTH/2.0 - LEFTE - man.MANWID/2.0);
}
else
man.x -= man.walkspeed;
man.vx = -man.walkspeed*0.6;
}
break;
case GLUT_KEY_RIGHT:
man.walk = 2;
if(man.state == 0)
{
if(man.x >= (WIDTH/2.0 - RIGHTE - man.MANWID/2.0))
{
man.x = WIDTH/2.0 - RIGHTE - man.MANWID/2.0;
}
else
man.x += man.walkspeed;
man.vx = man.walkspeed*0.6;
}
break;
case GLUT_KEY_UP:
break;
case GLUT_KEY_DOWN:
break;
case GLUT_KEY_F1:
break;
case GLUT_KEY_F2:
break;
case GLUT_KEY_F3:
break;
case GLUT_KEY_F4:
break;
default:
break;
}
// Refresh the Window
glutPostRedisplay();
}
void releaseKey(int key, int x, int y) {
switch (key)
{
case GLUT_KEY_LEFT:
man.walk = 0;
break;
case GLUT_KEY_RIGHT:
man.walk = 0;
break;
case GLUT_KEY_UP:
break;
case GLUT_KEY_DOWN:
break;
case GLUT_KEY_F1:
break;
case GLUT_KEY_F2:
break;
case GLUT_KEY_F3:
break;
case GLUT_KEY_F4:
break;
default:
break;
}
// Refresh the Window
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(400, 300);
// glutInitWindowPosition(500, 500);
glutCreateWindow("是男人就下一百层");
glutReshapeFunc(change_size);
glutDisplayFunc(renderscene);
glutTimerFunc(30,TimerFunction, 1);
setupRC();
glutKeyboardFunc(KeyPressFunc);
glutSpecialFunc(SpecialKeys);
glutSpecialUpFunc(releaseKey);
glutMainLoop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -