#include #include "Graphics.h" Graphics graphics; typedef struct tiro{ float pos_x; float pos_y; bool ativo; }Tiro; typedef struct nave{ Image imagemNormal; Image imagemTurbo; float pos_x; float pos_y; float velocidade; bool turbo; Tiro tiros[20]; int tiro_cont; bool atirar; int vidas; } Nave; typedef struct estrela{ float pos_x; float pos_y; float velocidade; } Estrela; typedef struct inimigo{ float pos_x; float pos_y; float velocidade; bool ativo; } Inimigo; Nave player; Inimigo inimigos[5]; Image ufo; Estrela estrelas[300]; int fatorVelocidadeEstrelas = 1; bool key_states[256]; bool CheckCollision(int px1, int py1, int pr1, int px2, int py2, int pr2) { int dx = px2 - px1; int dy = py2 - py1; float dist = sqrt((float)(dx * dx + dy * dy)); return dist < pr1 + pr2; } void ResetSpaceShip(){ player.pos_x = 100; player.pos_y = 300; player.velocidade = 200; player.turbo = false; player.tiro_cont = 0; player.atirar = true; } void MainLoop() { int x, y; for (x = 0; x < 300; x++) { estrelas[x].pos_x = estrelas[x].pos_x - ((fatorVelocidadeEstrelas * estrelas[x].velocidade) * graphics.GetElapsedTime()); if (estrelas[x].pos_x < -10) estrelas[x].pos_x = graphics.GetScreenWidth() + 10; graphics.SetColor(estrelas[x].velocidade, estrelas[x].velocidade, estrelas[x].velocidade); graphics.FillRectangle2D(estrelas[x].pos_x, estrelas[x].pos_y, estrelas[x].pos_x + 3, estrelas[x].pos_y + 3); } if (key_states[KEY_LEFT] == true) { if (player.pos_x + (player.imagemNormal.width / 3) > 0) player.pos_x = player.pos_x - (player.velocidade * graphics.GetElapsedTime()); } if (key_states[KEY_RIGHT] == true) { if (player.pos_x + player.imagemNormal.width < graphics.GetScreenWidth()) player.pos_x = player.pos_x + (player.velocidade * graphics.GetElapsedTime()); } if (key_states[KEY_UP] == true) { if (player.pos_y + (player.imagemNormal.height / 1.5) < graphics.GetScreenHeight()) player.pos_y = player.pos_y + (player.velocidade * graphics.GetElapsedTime()); } if (key_states[KEY_DOWN] == true) { if (player.pos_y + (player.imagemNormal.height / 3) > 0) player.pos_y = player.pos_y - (player.velocidade * graphics.GetElapsedTime()); } for (x = 0; x < 5; x++) { if (inimigos[x].ativo == true) { if ((CheckCollision(player.pos_x + (player.imagemNormal.width / 1.5), player.pos_y + (player.imagemNormal.height / 2), 32, inimigos[x].pos_x + (ufo.width / 2), inimigos[x].pos_y + (ufo.height / 2), 24) == true) && (player.vidas > 0)) { inimigos[x].ativo = false; player.vidas--; ResetSpaceShip(); fatorVelocidadeEstrelas = 1; } inimigos[x].pos_x = inimigos[x].pos_x - (fatorVelocidadeEstrelas * inimigos[x].velocidade * graphics.GetElapsedTime()); if (inimigos[x].pos_x < -100) { inimigos[x].pos_x = graphics.GetScreenWidth() + (rand() % 1200); inimigos[x].pos_y = rand() % graphics.GetScreenHeight(); } graphics.DrawImage2D(inimigos[x].pos_x, inimigos[x].pos_y, 64, 64, ufo); } } if (player.vidas > 0) { for (x = 0; x < 20; x++) { if (player.tiros[x].ativo == true) { if (player.tiros[x].pos_x < graphics.GetScreenWidth()) player.tiros[x].pos_x = player.tiros[x].pos_x + (700 * graphics.GetElapsedTime()); else player.tiros[x].ativo = false; for (y = 0; y < 5; y++) { if (inimigos[y].ativo == true) { if (CheckCollision(player.tiros[x].pos_x + 3, player.tiros[x].pos_y + 3 , 3, inimigos[y].pos_x + (ufo.width / 2), inimigos[y].pos_y + (ufo.height / 2), 24) == true) { inimigos[y].pos_x = graphics.GetScreenWidth() + (rand() % 1200); inimigos[y].pos_y = rand() % graphics.GetScreenHeight(); player.tiros[x].ativo = false; } } } graphics.SetColor(255, 0, 0); graphics.FillRectangle2D(player.tiros[x].pos_x, player.tiros[x].pos_y, player.tiros[x].pos_x + 6, player.tiros[x].pos_y + 3); } } if (player.turbo == true) graphics.DrawImage2D(player.pos_x, player.pos_y, 128, 128, player.imagemTurbo); else graphics.DrawImage2D(player.pos_x, player.pos_y, 128, 128, player.imagemNormal); } } void KeyboardInput(int key, int state, int x, int y) { if (state == KEY_STATE_DOWN) key_states[key] = true; else if (state == KEY_STATE_UP) key_states[key] = false; if (player.vidas > 0) { if (((key == KEY_LEFTSHIFT)||(key == KEY_RIGHTSHIFT))&&(state == KEY_STATE_DOWN)) { fatorVelocidadeEstrelas = 4; player.turbo = true; } else if (((key == KEY_LEFTSHIFT)||(key == KEY_RIGHTSHIFT))&&(state == KEY_STATE_UP)) { fatorVelocidadeEstrelas = 1; player.turbo = false; } if ((key == ' ')&&(state == KEY_STATE_DOWN)) { if (player.atirar == true) { player.tiros[player.tiro_cont].ativo = true; player.tiros[player.tiro_cont].pos_x = player.pos_x + player.imagemNormal.width; player.tiros[player.tiro_cont].pos_y = player.pos_y + (player.imagemNormal.height/2); player.tiro_cont = player.tiro_cont + 1; player.atirar = false; if (player.tiro_cont >= 20) player.tiro_cont = 0; } } if ((key == ' ')&&(state == KEY_STATE_UP)) player.atirar = true; } } void GeraEstrelas() { int x; for (x = 0; x < 300; x++) { estrelas[x].pos_x = rand() % graphics.GetScreenWidth(); estrelas[x].pos_y = rand() % graphics.GetScreenHeight(); estrelas[x].velocidade = 1 + rand() % 200; } } void GeraInimigos() { int x; for (x = 0; x < 5; x++) { inimigos[x].pos_x = graphics.GetScreenWidth() + (rand() % 1200); inimigos[x].pos_y = rand() % graphics.GetScreenHeight(); inimigos[x].velocidade = 200; inimigos[x].ativo = true; } } int main(void) { graphics.CreateMainWindow(800, 600, "Oficina de Engenharia da Computação"); graphics.SetBackgroundColor(0, 0, 0); player.imagemNormal.LoadPNGImage("Images/hero-ship.png"); player.imagemTurbo.LoadPNGImage("Images/hero-ship-boosted.png"); ufo.LoadPNGImage("Images/ufo.png"); ResetSpaceShip(); player.vidas = 3; GeraEstrelas(); GeraInimigos(); graphics.SetKeyboardInput(KeyboardInput); graphics.SetMainLoop(MainLoop); graphics.StartMainLoop(); return 0; }