📄 glbox.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 + -