Commit bd40e1a3 authored by Bruno Freitas Tissei's avatar Bruno Freitas Tissei
Browse files

Adicionado comentarios - 1

parent e8cbbbb0
0
\ No newline at end of file
150
\ No newline at end of file
/* Projeto destinado a disciplina de Oficina de Computacao
*
* Autores: Bruno Freitas Tissei e Ivo de Souza Bueno Junior
* Disciplina: Oficina de Computacao
* Entrega: 17/12/2015 */
#include "entity.h"
// desenha terra na tela
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
void renderDirt(int i, int j, int offx, int offy) {
int k, l;
for (k = 0; k < 3; k++)
for (l = 0; l < 6; l++)
// adiciona detalhes na cor da textura
if ((k == 0 && (l == 2 || l == 4)) ||
(k == 1 && (l == 3 || l == 5)) ||
(k == 2 && (l == 0 || l == 4))) {
......@@ -17,10 +27,14 @@ void renderDirt(int i, int j, int offx, int offy) {
}
}
// desenha pedra na tela
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
void renderBould(int i, int j, int offx, int offy) {
int k, l;
for (k = 0; k < 3; k++)
for (l = 0; l < 6; l++)
// adiciona detalhes na cor da textura
if (!((k == 0 || k == 2) && (l == 0 || l == 5))) {
if (k == 0 && (l == 3 || l == 4)) {
attron(COLOR_PAIR(8));
......@@ -34,6 +48,10 @@ void renderBould(int i, int j, int offx, int offy) {
}
}
// desenha diamante na tela
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
// time = tempo para executar a animacao da textura
void renderDiamonds(int i, int j, int offx, int offy, int time) {
if (time < 10)
renderChar(diamond, i, j, offx, offy, 7);
......
#include "firefly.h"
// trata logica de movimentacao e comportamento do vagalume
// *m = mapa
// *first = primeiro elemento da lista encadeada de vagalumes
// *dead = jogador morto
// done = jogador completou o level
void updateFirefly(map *m, firefly *first, int *dead, int done) {
firefly *aux = first->next;
int i, j, k, l;
// percorre a lista encadeada de vagalumes
while (aux != NULL) {
i = aux->x;
j = aux->y;
if (!aux->dead) {
// caso o jogador nao terminou a fase, verifica as bordas do vagalume
// para tratar colisao (morte do jogador)
if (!done) {
for (k = -1; k <= 1; k++) {
for (l = -1; l <= 1; l++) {
......@@ -18,7 +26,11 @@ void updateFirefly(map *m, firefly *first, int *dead, int done) {
}
}
}
// trata comportamento de cada direcao do vagalume
// ordem de prioridade de movimento:
// esquerda > frente > direita > tras
switch (aux->dir) {
// movimento atual: cima
case(8):
if (m->grid[i-1][j] == '0') {
m->grid[i-1][j] = 'M';
......@@ -42,6 +54,7 @@ void updateFirefly(map *m, firefly *first, int *dead, int done) {
aux->y++;
}
break;
// movimento atual: esquerda
case(4):
if (m->grid[i][j+1] == '0'){
m->grid[i][j+1] = 'M';
......@@ -65,6 +78,7 @@ void updateFirefly(map *m, firefly *first, int *dead, int done) {
aux->x++;
}
break;
// movimento atual: direita
case(6):
if (m->grid[i][j-1] == '0'){
m->grid[i][j-1] = 'M';
......@@ -88,6 +102,7 @@ void updateFirefly(map *m, firefly *first, int *dead, int done) {
aux->x--;
}
break;
// movimento atual: baixo
case(2):
if (m->grid[i+1][j] == '0'){
m->grid[i+1][j] = 'M';
......@@ -117,10 +132,15 @@ void updateFirefly(map *m, firefly *first, int *dead, int done) {
}
}
// desenha vagalume na tela
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
// b1, b2, b3 = cores
void renderFirefly(int i, int j, int offx, int offy, int b1, int b2, int b3) {
int k, l;
for (k = 0; k < 3; k++)
for (l = 0; l < 6; l++) {
// adiciona detalhes na cor da textura
if (k == 0 || k == 2 || l == 0 || l == 5) {
attron(COLOR_PAIR(b1));
mvprintw(3*j+k+offy, 6*i+l+offx, "%c", empty[k][l]);
......
#include "game.h"
// o level
map level;
// o menu
menu me;
// opcao retornada pelo menu
int menuaction = 0;
int load = true;
int loadMenu = false;
// variaveis para cuidar da transicao entre o menu e o jogo
int load = false;
int loadMenu = true;
// loop principal do jogo
// ismenu = estah no menu
// running = estah rodando
void run(int ismenu, int running) {
// variaveis para tratar o tempo de atualizacao
double last_time, current_time, delta = FPS;
int sleep_time, action = 0, s = 0;
int sleep_time, clock = 0;
// entrada do jogador
int action = 0;
// carrega scores
me.highscore = fopen("./data/highscore.txt", "r");
fscanf(me.highscore, "%d", &me.high);
me.lastscore = fopen("./data/lastscore.txt", "r");
......@@ -18,27 +29,45 @@ void run(int ismenu, int running) {
fclose(me.highscore);
fclose(me.lastscore);
// obtem tempo antes de comecar jogo
last_time = getTime() / NANO;
// carrega sprite do menu
readFileMenu(&me);
while (running) {
// obtem tempo atual
current_time = getTime() / NANO;
// verifica se estah na hora de atualizar o jogo
if (current_time >= last_time) {
// limita atualizacao a 30 fps
last_time += delta;
// verifica se desenha menu ou level
if (ismenu)
renderMenu(&me);
else {
// verifica se estah na hora de carregar o level
if (load) {
// carrega o level
readFileMap(&level, menuaction, 0);
load = false;
}
render(s);
render(clock);
}
// atualiza o jogo
update(action, &ismenu);
// guarda a entrada do teclado
action = getInput();
s = (s + 1) % 30;
// conta o tempo que serah utilizado como relogio em varias funcoes dentro do renderMap
clock = (clock + 1) % 30;
} else {
// define tempo de paralizacao
sleep_time = (int) ((last_time - current_time));
// paraliza o jogo durante o tempo necessario para limitar o jogo a 30 fps
if (sleep_time > 0)
usleep(sleep_time);
}
......@@ -46,6 +75,7 @@ void run(int ismenu, int running) {
}
int getInput() {
// recebe entrada do teclado
int input = getch();
if (input != ERR) {
switch (input) {
......@@ -57,8 +87,10 @@ int getInput() {
return 6;
case KEY_LEFT:
return 4;
// enter
case 10:
return 1;
// esc
case 27:
return 9;
default:
......@@ -68,20 +100,30 @@ int getInput() {
return 0;
}
// atualiza o jogo
// action = entrada do teclado
// *ismenu = estah no menu?
void update(int action, int *ismenu) {
if (*ismenu) {
// atualiza o menu e recebe entrada
menuaction = updateMenu(&me, action, &loadMenu);
// carrega o jogo caso o jogador pressione enter no menu
if (menuaction != -1) {
load = true;
*ismenu = false;
me.last = 0;
}
} else
// atualiza level
updateMap(&level, action, ismenu, &loadMenu);
}
// desenha level na tela
// time = relogio
void render(int time) {
// apaga tela antiga
erase();
// desenha tela nova
renderMap(&level, time);
refresh();
}
/* Projeto destinado a disciplina de Oficina de Computacao
*
* Autores: Bruno Freitas Tissei e Ivo de Souza Bueno Junior
* Disciplina: Oficina de Computacao
* Entrega: 17/12/2015 */
#include "main.h"
// inicio do programa
int main() {
startCurses();
run(true, true);
......@@ -7,16 +14,23 @@ int main() {
return 0;
}
// inicia ncurses
void startCurses() {
// inicia tela
initscr();
// possibilita uso de cores
start_color();
cbreak();
// retira espera por entrada durante execucao do programa
nodelay(stdscr, true);
// desabilita repeticao da entrada
noecho();
// ativa o teclado para a tela atual
keypad(stdscr, true);
// esconde cursor
curs_set(0);
}
// finaliza ncurses
void endCurses() {
endwin();
}
/* Projeto destinado a disciplina de Oficina de Computacao
*
* Autores: Bruno Freitas Tissei e Ivo de Souza Bueno Junior
* Disciplina: Oficina de Computacao
* Entrega: 17/12/2015 */
#ifndef _MAIN_H
#define _MAIN_H
#include "utils.h"
......
#ifndef _MAPS_H
#define _MAPS_H
#include <math.h>
#include "utils.h"
#include "entity.h"
......
#include "physics.h"
// trata fisica do jogo
// *m = mapa
// in = posicao sendo avaliada na matriz sprite
// i, j = posicao na matriz sprite
// offx, offy = deslocamento para o centro
// time = relogio
// falltime = limita tempo de queda
// waittime = trata a animacao da explosao
// *dead = jogador morto?
void updatePhysics(map *m, char in, int i, int j, int offx, int offy, int time, int falltime, int waittime, int *dead) {
// testa o tipo do elemento da matriz sprite
switch (in) {
// pedra caindo para baixo
case('f'):
renderBould(i, j, offx, offy);
// se estiver na hora de cair...
if (falltime == 6) {
// se a posicao abaixo estiver vazia, continua caindo
if (m->grid[i][j+1] == '0') {
m->grid[i][j+1] = 'f';
m->grid[i][j] = '0';
// se a posicao abaixo for o jogador, mata o jogador
} else if (m->grid[i][j+1] == '5') {
m->grid[i][j+1] = '0';
m->grid[i][j] = '0';
*dead = true;
// caso contrario encerra a queda
} else
m->grid[i][j] = '6';
}
break;
// diamante caindo para baixo
case('h'):
renderDiamonds(i, j, offx, offy, time);
// se estiver na hora de cair...
if (falltime == 6) {
// se a posicao abaixo estiver vazia, continua caindo
if (m->grid[i][j+1] == '0') {
m->grid[i][j+1] = 'h';
m->grid[i][j] = '0';
// se a posicao abaixo for o jogador, mata o jogador
} else if (m->grid[i][j+1] == '5') {
m->grid[i][j+1] = '0';
m->grid[i][j] = '0';
*dead = true;
// caso contrario encerra a queda
} else
m->grid[i][j] = '7';
}
break;
// explosao
case('x'):
// trata a animacao da explosao
if(waittime < 7)
renderChar(explosion, i, j, offx, offy, 9);
else if(waittime < 14)
......@@ -39,36 +60,48 @@ void updatePhysics(map *m, char in, int i, int j, int offx, int offy, int time,
else
renderChar(explosion3, i, j, offx, offy, 9);
break;
// pedra caindo para a direita
case('r'):
renderBould(i, j, offx, offy);
// se estiver na hora de cair...
if (falltime == 6) {
// se a posicao abaixo estiver vazia, caia pra baixo
if (m->grid[i+1][j] == '0') {
m->grid[i+1][j] = 'f';
m->grid[i][j] = '0';
}
}
break;
// pedra caindo para a esquerda
case('l'):
renderBould(i, j, offx, offy);
// se estiver na hora de cair...
if (falltime == 6) {
// se a posicao abaixo estiver vazia, caia pra baixo
if (m->grid[i-1][j] == '0') {
m->grid[i-1][j] = 'f';
m->grid[i][j] = '0';
}
}
break;
// diamante caindo para a direita
case('R'):
renderDiamonds(i, j, offx, offy, time);
// se estiver na hora de cair...
if (falltime == 6) {
// se a posicao abaixo estiver vazia, caia pra baixo
if (m->grid[i+1][j] == '0') {
m->grid[i+1][j] = 'h';
m->grid[i][j] = '0';
}
}
break;
// diamante caindo para a esquerda
case('L'):
renderDiamonds(i, j, offx, offy, time);
// se estiver na hora de cair...
if (falltime == 6) {
// se a posicao abaixo estiver vazia, caia pra baixo
if (m->grid[i-1][j] == '0') {
m->grid[i-1][j] = 'h';
m->grid[i][j] = '0';
......
#include "rockford.h"
// trata logica de movimentacao e comportamento do jogador
// *player = jogador
// *m = mapa
// action = entrada do teclado
// done = jogador completou o level
// delay = tempo para atrasar empurrao da pedra
void updateRockford(rockford *player, map *m, int action, int done, int delay) {
// para cima
if (action == 8) {
char up = m->grid[player->y][player->x-1];
// se o destino estiver vazio ou for terra
if (up == '0' || up == '2' || (done && up == '4')) {
// anda para o destino e esvazia posicao anterior
m->grid[player->y][player->x--] = '0';
m->grid[player->y][player->x] = '5';
// se o destino for um diamante
} else if (up == '7') {
// anda para o destino, esvazia posicao anterior e pega o diamante
m->grid[player->y][player->x--] = '0';
m->grid[player->y][player->x] = '5';
player->diamonds++;
// aumenta a pontuacao de acordo com o numero definido no mapa atual
player->score += m->score;
}
// para direita
} else if (action == 6) {
char right = m->grid[player->y+1][player->x];
// se o destino estiver vazio ou for terra
if (right == '0' || right == '2' || (done && right == '4')) {
// anda para o destino e esvazia posicao anterior
m->grid[player->y++][player->x] = '0';
m->grid[player->y][player->x] = '5';
// se o destino for um diamante
} else if (right == '7') {
// anda para o destino, esvazia posicao anterior e pega o diamante
m->grid[player->y++][player->x] = '0';
m->grid[player->y][player->x] = '5';
player->diamonds++;
// aumenta a pontuacao de acordo com o numero definido no mapa atual
player->score += m->score;
// se o destino for uma pedra e estiver na hora de empurrar...
} else if (right == '6' && m->grid[player->y+2][player->x] == '0' && !(delay % 10)) {
// anda para o destino, esvazia posicao anterior e movimenta a pedra
m->grid[player->y++][player->x] = '0';
m->grid[player->y][player->x] = '5';
m->grid[player->y+1][player->x] = '6';
}
// para esquerda
} else if (action == 4) {
char left = m->grid[player->y-1][player->x];
// se o destino estiver vazio ou for terra
if (left == '0' || left == '2' || (done && left == '4')) {
// anda para o destino e esvazia posicao anterior
m->grid[player->y--][player->x] = '0';
m->grid[player->y][player->x] = '5';
// se o destino for um diamante
} else if (left == '7') {
// anda para o destino, esvazia posicao anterior e pega o diamante
m->grid[player->y--][player->x] = '0';
m->grid[player->y][player->x] = '5';
player->diamonds++;
// aumenta a pontuacao de acordo com o numero definido no mapa atual
player->score += m->score;
// se o destino for uma pedra e estiver na hora de empurrar...
} else if (left == '6' && m->grid[player->y-2][player->x] == '0' && !(delay % 10)) {
// anda para o destino, esvazia posicao anterior e movimenta a pedra
m->grid[player->y--][player->x] = '0';
m->grid[player->y][player->x] = '5';
m->grid[player->y-1][player->x] = '6';
}
// para baixo
} else if (action == 2) {
char down = m->grid[player->y][player->x+1];
// se o destino estiver vazio ou for terra
if (down == '0' || down == '2' || (done && down == '4')) {
// anda para o destino e esvazia posicao anterior
m->grid[player->y][player->x++] = '0';
m->grid[player->y][player->x] = '5';
// se o destino for um diamante
} else if (down == '7') {
// anda para o destino, esvazia posicao anterior e pega o diamante
m->grid[player->y][player->x++] = '0';
m->grid[player->y][player->x] = '5';
player->diamonds++;
// aumenta a pontuacao de acordo com o numero definido no mapa atual
player->score += m->score;
}
}
}
// desenha jogador na tela
// *player = jogador
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
void renderRockford(rockford *player, int i, int j, int offx, int offy) {
int k, l;
for (k = 0; k < 3; k++)
for (l = 0; l < 6; l++) {
// trata a textura do jogador
attron(COLOR_PAIR((k == 0 || k == 1) ? 6 + k : 12));
// trata a textura de acordo com a direcao
if (player->dir == 0 || player->dir == 5)
mvprintw(3*j+k+offy, 6*i+l+offx, "%c", rockf[k][l]);
else if (player->dir == 6 || player->dir == 8)
......
#include "time.h"
// obtem o tempo atual da maquina em nanosegundos
double getTime() {
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
......
#include "utils.h"
// texturas de objetos do jogo
char steel[3][6] = {" @ @ ", " ", " @ @ "};
char steel2[3][6] = {" ", " @ @ ", " "};
char dirt[3][6] = {"-_-_-_", "_-_-_-", "-_-_-_"};
char wall[3][6] = {"|_|_|_", "_|_|_|", "|_|_|_"};
char wall2[3][6] = {"_|_|_|", "|_|_|_", "_|_|_|"};
char ext[3][6] = {" @ @ ", " ", " @ @ "};
char rockf[3][6] = {" (**) ", " /EE\\ ", " II "};
char rockfr[3][6] = {" ( *} ", " EE\\ ", " /; "};
......@@ -19,6 +19,7 @@ char explosion[3][6] = {" ", " ## ", " "};
char explosion2[3][6] = {"\\\\||//", "--##--", "//||\\\\"};
char explosion3[3][6] = {"#%$@%@", "#@ ##", "&@*@*#"};
// texturas dos numeros, letras e simbolos
char empty[3][6] = {" ", " ", " "};
char one[3][6] = {" ", " -| ", " _|_ "};
char two[3][6] = {" __ ", " __] ", " |__ "};
......@@ -53,6 +54,11 @@ char SL[3][6] = {" ", " /___ ", " \\ "};
char SR[3][6] = {" ", " ___\\ ", " / "};
char DOTS[3][6] = {" ", " . ", " . "};
// desenha textura na tela
// mat[3][6] = textura
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
// color = cor
void renderChar(char mat[3][6], int i, int j, int offx, int offy, int color) {
int k, l;
attron(COLOR_PAIR(color));
......@@ -62,53 +68,75 @@ void renderChar(char mat[3][6], int i, int j, int offx, int offy, int color) {
attroff(COLOR_PAIR(color));
}
// desenha HUB na tela
// number = numero a ser desenhado
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
void renderHUB(char number, int i, int j, int offx, int offy) {
int color = (i == 3 || i == 4 || i == 12 || i == 13) ? 2 : 11;
switch(number) {
// 0
case('A'):
renderChar(zero, i, j, offx, offy, color);
break;
// 1
case('B'):
renderChar(one, i, j, offx, offy, color);
break;
// 2
case('C'):
renderChar(two, i, j, offx, offy, color);
break;
// 3
case('D'):
renderChar(three, i, j, offx, offy, color);
break;
// 4
case('E'):
renderChar(four, i, j, offx, offy, color);
break;
// 5
case('F'):
renderChar(five, i, j, offx, offy, color);
break;
// 6
case('G'):
renderChar(six, i, j, offx, offy, color);
break;
// 7
case('H'):
renderChar(seven, i, j, offx, offy, color);
break;
// 8
case('I'):
renderChar(eight, i, j, offx, offy, color);
break;
// 9
case('J'):
renderChar(nine, i, j, offx, offy, color);
break;
// simbolo de diamante
case('K'):
renderChar(symbol, i, j, offx, offy, color);
break;
}
}
// desenha letra ou simbolo na tela
// letter = letra a ser desenhado
// i, j = posicao na matriz
// offx, offy = deslocamento para o centro
void renderLetter(char letter, int i, int j, int offx, int offy) {
switch(letter) {
// espaco vazio de cor 1
case('@'):