// *************************************************************************** // 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 #include "CImage.h" #include "CSprite.h" #include "CLayerHandler.h" CImage *Img1 = NULL; //CLayer *layerCao= NULL; //CLayer *layerFundo = NULL; CLayerHandler *layers = NULL; CSprite *spriteCao = NULL; int currentFrame = 0; 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); // Posiciona a imagem centralizada na janela Img1->setPosition((w/2)-(Img1->getWidth()/2),(h/2)-(Img1->getHeight()/2)); layers->draw(); SDL_GL_SwapBuffers(); } void CarregaImagem() { cout << "Carrega Imagem...."; Img1 = new CImage(); string nomeArq; nomeArq = "../../../bin/data/img/fundo.png"; nomeArq = "../../../bin/data/maps/tmw_desert_spacing.png"; if (Img1->loadImage(nomeArq.c_str())) { cout << "Imagem carregada ! " << "Largura: " << Img1->getWidth() << " Altura: " << Img1->getHeight()<< endl; } else { cout << "Nao encontrou imagem " << endl; delete Img1; Img1 = NULL; } cout << "FIM."<< endl; } void CarregaSprite() { cout << "Carrega Sprite...."; spriteCao = new CSprite(); spriteCao->loadSprite("../../../bin/data/img/char9.png", 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, Img1->getHeight()-160); // sprite->setXspeed(0); // pixels por segundo cout << "FIM."<< endl; } void MontaLayer() { cout << "Monta Layers...."; layers = new CLayerHandler(5); layers->add(spriteCao,0); cout << "Sprite CAO adicionado no Layer." << endl; layers->add(Img1,1); cout << "Imagem de fundo adicionada no Layer." << 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 ; SDL_Surface* screen = SDL_SetVideoMode(728, 454, 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); CarregaImagem(); CarregaSprite(); MontaLayer(); // 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; 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; }