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

📄 glbox.cc

📁 这是基于QT编写的一个linux下的贪吃蛇游戏。
💻 CC
字号:
#include "GLBox.h" 
#include <iostream> 
#include <qmessagebox.h> 
#include <qstring.h> 
using std::cout; 
using std::endl; 

GLBox::GLBox( QWidget *parent, const char *name ) { 
setGeometry( 0, 0, 640, 400 ); 
setCaption( "NeHe's OpenGL Framework by alin" ); 
// snake.grow(); 
timer = new QTimer( this ); 
connect( timer, SIGNAL( timeout() ), this, SLOT( timerDone() ) ); 
timer->start( 500 ); 
} 

GLBox::~GLBox() { 

} 

void GLBox::initializeGL() { 
glClearColor( 0.0, 0.0, 0.0, 0.0 ); 
glShadeModel( GL_FLAT ); 
glEnable( GL_DEPTH_TEST ); 
glEnable( GL_CULL_FACE ); 
foods.init( 2, 10, -10, 10, -10 ); 
snake.grow(); 
snake.grow(); 
snake.grow(); 
snake.grow(); 
snake.grow(); 
snake.grow(); 
snake.grow(); 
} 

void GLBox::paintGL() 
{ 
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 
glMatrixMode( GL_MODELVIEW ); 
glLoadIdentity(); 
glTranslatef( 0.0, -1.0, -5.0 ); 
Body *temp = snake.getSnakeTail(); 
while ( temp != NULL ) { 
glColor3f( 0.8f, 0.8f, 0.8f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glEnd(); 
glColor3f( 0.8f, 0.8f, 0.8f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glEnd(); 
glColor3f( 1.0f, 1.0f, 1.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glEnd(); 
glColor3f( 1.0f, 1.0f, 1.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glEnd(); 
glColor3f( 0.9f, 0.0f, 0.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 - 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glEnd(); 
glColor3f( 0.9f, 0.0f, 0.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 + 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.1f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glVertex3f( (GLfloat)(temp->pos.x)/5 + 0.08f, 0.0f, -( (GLfloat)(temp->pos.y)/5 - 0.08f ) ); 
glEnd(); 
temp = temp->next; 
} 

for ( int i = 0; i != 2; ++i ) { 
cout << foods.getX( i ) << ", " << foods.getY( i ) << endl; 
glColor3f( 0.8f, 0.8f, 0.8f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glEnd(); 
glColor3f( 0.8f, 0.8f, 0.8f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glEnd(); 
glColor3f( 1.0f, 1.0f, 1.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glEnd(); 
glColor3f( 1.0f, 1.0f, 1.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glEnd(); 
glColor3f( 0.9f, 0.0f, 0.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 - 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glEnd(); 
glColor3f( 0.9f, 0.0f, 0.0f ); 
glBegin( GL_QUADS ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 + 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.1f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glVertex3f( (GLfloat)( foods.getX(i) ) / 5 + 0.08f, 0.0f, -( (GLfloat)( foods.getY(i) ) / 5 - 0.08f ) ); 
glEnd(); 
} 
/*glBegin( GL_QUADS ); 
glVertex2f( -1.0f, -1.0f ); 
glVertex2f( 1.0f, -1.0f ); 
glVertex2f( 1.0f, 1.0f ); 
glVertex2f( -1.0f, 1.0f ); 
glEnd();*/ 

} 

void GLBox::resizeGL( int width, int height ) { 
glViewport( 0, 0, (GLint)width, (GLint)height ); 
glMatrixMode( GL_PROJECTION ); 
glLoadIdentity(); 
gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 ); 
glMatrixMode( GL_MODELVIEW ); 
glLoadIdentity(); 
} 

void GLBox::keyPressEvent( QKeyEvent *e ) { 
switch( e->key() ) { 
case Qt::Key_Up : 
snake.turn( "up" ); 
break; 
case Qt::Key_Down : 
snake.turn( "down" ); 
break; 
case Qt::Key_Left : 
snake.turn( "left" ); 
break; 
case Qt::Key_Right : 
snake.turn( "right" ); 
break; 
case Qt::Key_F1 : 
snake.grow(); 
break; 
} 
} 

void GLBox::timerDone() { 

Body *temp = snake.getSnakeHead(); 

for ( int i = 0; i != 2; ++i ) { 
if ( temp->pos.x == foods.getX( i ) && temp->pos.y == foods.getY( i ) ) { 
snake.grow(); 
foods.init( 2, 10, -10, 10, -10 ); 
break; 
} 
} 
snake.move(); 

if ( snake.biteSelf() ) { 
timer->stop(); 
QString title = "友情提示"; 
QString text = "恭喜,你挂了。"; 
QMessageBox::information( this, QString::fromUtf8( title , title.length() ), QString::fromUtf8( text, text.length() ) ); 
} 
if ( snake.length() > 10 ) { 
timer->start( 400 ); 
} 
else if ( snake.length() > 15 ) { 
timer->start( 300 ); 
} 
else if ( snake.length() > 20 ) { 
timer->start( 200 ); 
} 
else if ( snake.length() > 20 ) { 
timer->start( 100 ); 
} 
this->update(); 
} 

⌨️ 快捷键说明

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