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

📄 scenemanager.cpp

📁 This code was developed by my techer. :D
💻 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 + -