// *************************************************************************** // PUCRS/FACIN // Curso de Especialização em Desenvolvimento de Jogos Digitais // Computação Gráfica 2D // Profs. // Isabel Harb Manssour / Márcio Sarroglia Pinho // *************************************************************************** #include #include #include #include #include using namespace std; #ifdef __APPLE__ #include #include #include #else #include #include #include #endif SDL_Surface* screen = NULL; #include "CSprite.h" CSprite *spriteCao = NULL; int currentFrame = 0; string BASE_DIR = "../../../bin/"; void Desenha(int w, int h) { //cout << "DESENHA: Largura: " << w << " - Altura: " << h << endl; glClearColor(0.59, 0.84, 0.91, 0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, h, 0, 1, -1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(0, 0, w, h); glEnable(GL_TEXTURE_2D); // isto é necessário quando se deseja desenhar com texturas glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); spriteCao->draw(); SDL_GL_SwapBuffers(); } void CarregaSprite() { string nome = BASE_DIR + "data/img/char9.png"; cout << "Carrega Sprite...."; spriteCao = new CSprite(); spriteCao->loadSprite(nome.c_str() , 128, 128, 0, 0, 0, 4, 4, 4, 6); spriteCao->setAnimRate(15); // taxa de animação em frames por segundo(troca dos frames dele) spriteCao->setScale(1); spriteCao->setPosition(0, 200); // sprite->setXspeed(0); // pixels por segundo cout << "FIM."<< endl; } int main( int argc, char* args[] ) { //Start SDL SDL_Init( SDL_INIT_EVERYTHING ); // Define o titulo da janela SDL_WM_SetCaption("Jogo Basico", "Jogo Basico - Minimizado"); // Request double-buffered OpenGL SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); // create a new window on screen int flags = SDL_OPENGL | SDL_RESIZABLE ;//SDL_HWSURFACE|SDL_GL_DOUBLEBUFFER | SDL_OPENGL | SDL_RESIZABLE ; screen = SDL_SetVideoMode(1024, 768, 32, flags); if ( !screen ) { printf("Impossivel inicializar a janela 640x480. Erro: %s\n", SDL_GetError()); return 1; } else { cout << "Janela Inicializada !" << endl; cout << "Largura: " << screen->w << " - Altura: " << screen->h << endl; } // Enable transparency through blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // enable automatic key repetition SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); CarregaSprite(); // main loop bool done = false; bool precisaRedesenhar = true; // SDL_GetTicks() tells how many milliseconds have past since an arbitrary point in the past. double lastTime = SDL_GetTicks(); double tickInterval = 300;//1000; while (!done) { // message processing loop SDL_Event event; while (SDL_PollEvent(&event)) { // check for messages switch (event.type) { // exit if the window is closed case SDL_QUIT: done = true; break; // check for keypresses case SDL_KEYDOWN: // exit if ESCAPE is pressed if (event.key.keysym.sym == SDLK_ESCAPE) { done = true; break; } else if (event.key.keysym.sym == SDLK_RIGHT) { spriteCao->setX(spriteCao->getX()+1); spriteCao->setMirror(false); precisaRedesenhar = true; } else if (event.key.keysym.sym == 276) { // LEFT ARROW spriteCao->setX(spriteCao->getX()-1); spriteCao->setMirror(true); precisaRedesenhar = true; } break; // SDL_APPACTIVE: When the application is either minimized/iconified // (gain=0) or restored ('gain'=1) this type of activation event occurs case SDL_APPACTIVE: if (event.active.gain==0) { precisaRedesenhar = true; } break; case SDL_VIDEORESIZE: cout << "Janela alterada !" << endl; SDL_Surface* screen = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, flags); precisaRedesenhar = true; break; } // end switch }// end of message processing // Verifica se já passou if (SDL_GetTicks()-lastTime>tickInterval) { //cout << "Diferenca de Tempo: " << SDL_GetTicks()-lastTime << " milisegundos." << endl; if (spriteCao) spriteCao->frameForward(); precisaRedesenhar = true; lastTime = SDL_GetTicks(); } // sprite->update(SDL_GetTicks()-lastTime); // lastTime = SDL_GetTicks(); if (precisaRedesenhar) { Desenha(screen->w, screen->h); precisaRedesenhar = false; } } //Quit SDL SDL_Quit(); return 0; }