quinta-feira, 12 de maio de 2016

Prova 1 - Matemática Aplicada a Mídias


Curso de Sistemas e Mídias Digitais - UFC
Matemática para Multimídia l
Verificação Parcial l - Profs. Melo Jr, George Gomes e Clemilson Santos - 04/05/2016


Crie um jogo com as seguintes características:

  • Existe um personagem (círculo sobre triângulo e linhas que definem os membros superiores e inferiores) no lado esquerdo da tela, que pode ser deslocado, passo a passo, para a esquerda e para a direita através das respectivas setas do teclado;
  • Aproximadamente na mesma posição vertical do personagem, existe uma caixa (retângulo que, a cada meio segundo, torna-se horizontal ou vertical, simulando uma rotação) que repetidamente entra pela direita e sai pela esquerda da tela;
  • Quando a seta para cima é pressionada no teclado, o personagem salta a partir de sua posição atual, descrevendo um arco para a direita com altura pouco superior à maior dimensão da caixa;
  • Caso o personagem saia da tela pela direita, é indicada vitória na tela;
  • Caso o centro do personagem seja atingido pela caixa, é indicada derrota na tela.

Avaliação

  • Desenho e movimentação (personagem e caixa): 6,0 pontos
  • Indicação de vitória ou derrota: 4,0 pontos

Observações

  • A avaliação é pesquisada e possui duração total de 1:30h;
  • O jogo deve ser executado normalmente a 60 fps;
  • Ao fim da avaliação, deve ser fornecido aos professores o arquivo referente ao jogo desenvolvido.



void doll(float x, float y) {
  strokeWeight(2);
  stroke(0);
  line(x+5, y-10, x+18, y+5);
  line(x-5, y-10, x-18, y+5);
  line(x+5, y+10, x+5, y+25);
  line(x-5, y+10, x-5, y+25);
  fill(255, 0, 0);
  triangle(x, y-20, x-15, y+10, x+15, y+10);
  stroke(255, 100, 150);
  fill(255, 174, 201);
  ellipse(x, y-30, 25, 25);
  stroke(255);
  fill(255);
  ellipse(x, y, 3, 3);
}

float MRU(float d, float v, float t) {
  d += v * t;
  return(d);
}

float MRUV(float d, float v, float a, float t) {
  d += v * t + a * t * t / 2;
  return d;
}

float dollX = 25;
float dollY = 200;
float t;
void dollMovement() {
  if (keyPressed && !jump) {
    if (keyCode == RIGHT) {
      dollX += 5;
    } else if (keyCode == LEFT && dollX > 0) {
      dollX -= 5;
    } else if (keyCode == UP) {
      t = 0;
      jump = true;
    }
  }
  if (jump) {
    dollJump();
  }
  doll(dollX, dollY);
  if (dollX > 500) {
    t = 0;
    state = 1;
  }
}

boolean jump = false;
void dollJump() {
  t++;
  dollX = MRU(dollX, 5, t);
  dollY = MRUV(dollY, -25, 9.8, t);
  if (dollY > 200) {
    jump = false;
    dollY = 200;
  }
}

int caixaX = 550;
void moveCaixa() {
  caixaX -= 3;
  if (caixaX < -50) {
    caixaX = 550;
  }
  fill(185, 122, 87);
  stroke(127, 78, 52);
  if (int(frameCount/60)%2 == 0) {
    rect(caixaX-35, 155, 70, 90);
    if (dollX > caixaX-35 && dollX < caixaX+35 && dollY > 155 && dollY < 245) {
      t = 0;
      state = 2;
    }
  } else {
    rect(caixaX-45, 165, 90, 70);
    if (dollX > caixaX-45 && dollX < caixaX+45 && dollY > 165 && dollY < 235) {
      t = 0;
      state = 2;
    }
  }
}

void victoria() {
  rainbowRoad();
  fill(0);
  textSize(50);
  text("Venceu!", 150, 150);
  t++;
  if (t > 300) {
    reset();
  }
}

void derrota() {
  background(0);
  fill(255, 0, 0);
  textSize(50);
  text("Game Over", 120, 150);
  t++;
  if (t > 300) {
    reset();
  }
}

void reset() {
  jump = false;
  t = 0;
  dollX = 25;
  dollY = 200;
  caixaX = 550;
  state = 0;
}

void rainbowRoad() {
  colorMode(HSB, 2);
  strokeWeight(2);
  for (int i = 0; i<=height; i++) {
    stroke(-(sin(radians(frameCount+i))-1), 2, 2);
    line(0, i, width, i);
  }
  colorMode(RGB, 255);
}

void setup() {
  size(500, 300);
  frameRate(60);
  reset();
}

int state = 0;
void draw() {
  background(0, 127, 255);
  stroke(34,177,76);
  fill(181,230,29);
  rect(0,225,500,300);
  if (state == 0) {
    dollMovement();
    moveCaixa();
  } else if (state == 1) {
    victoria();
  } else if (state == 2) {
    derrota();
  }
}


Código está aqui do jeito que foi entregue apesar de posteriormente eu ter notado que a caixa "gira" a cada segundo, não a cada meio segundo, como é pedido.
Como eu não prestei atenção ao fato que seria o centro do personagem a colidir, eu acabei por colocar um ponto branco no que seria o centro dela, assemelhando-se a Touhou (note que só morre se encostar no ponto branco no meio da personagem)
Busquei o código de movimentação da caixa, da "rainbow road" e da máquina de estados da Navezinha
O pulo foi obviamente adaptado do Movimento Uniformemente Variado (a função usada lá não tinha a distância inicial, era considerada igual a 0)
E a colisão da caixa eu tirei do Botão apesar de ter em outros lugares também

Nenhum comentário:

Postar um comentário

Pode falar, eu não mordo... Pelo menos não através da internet