📄 scenemanager.cpp
字号:
#include "sceneManager.h"
#include "interfaces/rendereable.h"
#include "objects/origin.h"
#include <iostream>
SceneManager* SceneManager::instance = 0;
const float SceneManager::ROT_SPEED = 2.f;
SceneManager::SceneManager()
{
//inicializando SDL y OpenGL
if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
{
fprintf(stderr, "No se puede inicializar SDL: %s\n",SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
//se habilita double buffer con OpengGL
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
//definiendo el modo de video
this->screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL /*| SDL_FULLSCREEN*/ ); // descomentar para definir FULL SCREEN
if (screen == NULL) {
printf("No se puede definir el \"video mode\": %s\n", SDL_GetError());
exit(1);
}
//habilito el z-buffer
glEnable (GL_DEPTH_TEST);
//defino el color con el que se va a limpiar el frame-buffer
glClearColor( .5f, .5f, .5f, .0f );
//defino el tipo y caracter韘ticas de la proyecci髇
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum(-.1f,.1f,-.075f,.075f,.1f,1000.f);
//vuelvo al modo GL_MODELVIEW
glMatrixMode( GL_MODELVIEW );
this->running = true;
rotSpeedWorld = rotSpeedXModel = rotSpeedYModel = 0.f;
rotWorld = rotXModel = rotYModel = 0.f;
this->origin = new Origin();
}
SceneManager::~SceneManager()
{
delete this->origin;
list<Rendereable*>::iterator it;
for( it = this->objectsList.begin(); it != this->objectsList.end(); ++it )
{
Rendereable* object = (*it);
delete object;
}
this->objectsList.clear();
}
SceneManager* SceneManager::getInstance()
{
if( SceneManager::instance == 0 )
{
SceneManager::instance = new SceneManager();
}
return SceneManager::instance;
}
void SceneManager::render()
{
// glClearColor( 0.5f, 0.5f, 0.5f, 0.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.f,0.f,-10.f,0.f,0.f,0.f,0.f,1.f,0.f);
glRotatef( this->rotWorld, 0.f, 1.f, 0.f );
this->origin->draw();
list<Rendereable*>::iterator it;
for( it = this->objectsList.begin(); it != this->objectsList.end(); ++it )
{
glPushMatrix();
(*it)->setRot( this->rotXModel, this->rotYModel, 0 );
(*it)->draw();
glPopMatrix();
}
glFlush();
//it's show time B-)
SDL_GL_SwapBuffers();
}
void SceneManager::update( float elapsedTime )
{
this->rotWorld += this->rotSpeedWorld*elapsedTime;
this->rotXModel += this->rotSpeedXModel*elapsedTime;
this->rotYModel += this->rotSpeedYModel*elapsedTime;
}
void SceneManager::freeSurface()
{
if( this->screen )
{
SDL_FreeSurface( this->screen );
}
}
void SceneManager::handleEvent(SDL_Event* sdlEvent)
{
switch(sdlEvent->type)
{
case SDL_KEYDOWN:
this->handleKeyDown(&sdlEvent->key);
break;
case SDL_KEYUP:
this->handleKeyUp(&sdlEvent->key);
break;
case SDL_QUIT:
this->running = false;
break;
}
}
bool SceneManager::isRunning()
{
return this->running;
}
void SceneManager::handleKeyDown(SDL_KeyboardEvent* sdlKeyEvent)
{
switch(sdlKeyEvent->keysym.sym)
{
case SDLK_ESCAPE:
this->running = false;
break;
case SDLK_UP:
this->rotSpeedYModel += SceneManager::ROT_SPEED;
break;
case SDLK_DOWN:
this->rotSpeedYModel -= SceneManager::ROT_SPEED;
break;
case SDLK_LEFT:
this->rotSpeedXModel -= SceneManager::ROT_SPEED;
break;
case SDLK_RIGHT:
this->rotSpeedXModel += SceneManager::ROT_SPEED;
break;
//////////////////frustum parameters
case SDLK_s:
this->rotSpeedWorld -= SceneManager::ROT_SPEED;
break;
case SDLK_f:
this->rotSpeedWorld += SceneManager::ROT_SPEED;
break;
}
}
void SceneManager::handleKeyUp(SDL_KeyboardEvent* sdlKeyEvent)
{
switch(sdlKeyEvent->keysym.sym)
{
case SDLK_ESCAPE:
exit (0);
break;
case SDLK_UP:
this->rotSpeedYModel -= SceneManager::ROT_SPEED;
break;
case SDLK_DOWN:
this->rotSpeedYModel += SceneManager::ROT_SPEED;
break;
case SDLK_LEFT:
this->rotSpeedXModel += SceneManager::ROT_SPEED;
break;
case SDLK_RIGHT:
this->rotSpeedXModel -= SceneManager::ROT_SPEED;
break;
case SDLK_s:
this->rotSpeedWorld += SceneManager::ROT_SPEED;
break;
case SDLK_f:
this->rotSpeedWorld -= SceneManager::ROT_SPEED;
break;
}
}
void SceneManager::addObject( Rendereable* object )
{
this->objectsList.push_back( object );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -