quinta-feira, 27 de março de 2014

Simulação e MRU

O tema dessa aula foi simulação em tempo real. Após explicações sobre o tema e alguns testes com simulação com Processing, foi proposta a seguinte atividade:

Símular um Movimento Retílineo Uniforme, e mostrar na tela as variáveis relacionadas ao processo. Abaixo está o código comentado.



//Declaração de Variáveis
int relogio;
int intervalo=100;
float d;
float v=10;
float t=0;

void setup(){
  relogio=millis();
  size(800,800);
  
  
}

void draw(){
  if (millis() > relogio+intervalo){
    relogio=millis();

    moveBolaMRU();
    t=t + 0.1;
  }  
  
  
}//fimDraw

void moveBolaMRU(){
  //função do movimento retilíneo uniforme
  //onde a distância é igual a velocidade vezes o tempo
  d = v * t;
 
  background(255);
  desenhaGrade();
  mostraInfo();

  ellipse(d, 400, 25, 25);
}

void desenhaGrade(){
  
  //utilizando uma laço de repetição a cada
  //"100m" é desenhada uma linha
  for(int i = 0; i<=width; i+=100){
    line(i, 0, i, height);
  }
  
}//fimDesenhaGrade


void mostraInfo(){
  //função que mostra as variáveis na tela
  textSize(15);
  fill(0);
  text("Distância:" + d  , 5, 20); 
  text("Velocidade:" + v   , 5, 40); 
  text("Tempo: "+ t , 5, 60); 

}



domingo, 16 de março de 2014

Laços de Repetição e Funções

Após explicações básicas sobre funções matemáticas e uma revisão de laços de repetição foram propostas a seguintes tarefas :


Tabuleiro de Xadrez

Usando  laços de repetição, a tarefa era criar um tabuleiro de xadrez. Eis o código comentado



void setup(){
  size(400,400);
  background(255);
 
}


boolean preencherPrimeira = false;

void draw(){ 
       for(int vertical=0;vertical<8;vertical++){
          for(int horizontal=0;horizontal<8;horizontal++){
              
             //testar se a primeira linha deve ser preenchida            
             if(preencherPrimeira==true){
                   if(horizontal%2==0){//preenche casas pares
                     fill(0);
                     }else{
                       noFill();
                     }
             }else if (preencherPrimeira==false){
                     if(horizontal%2==1){//preenche casas impares
                      fill(0);
                     }else{
                       noFill();
                     } 
               }
             
             //o centro dos retângulos ´é desenhado em função 
            //das variaveis horizontal e vertical usadas nos laços
             rect(horizontal*50, vertical*50, 50, 50);
             

          }//fimFor
           //sempre que uma linha horizontal é completa 
           //o valor é invertido
           preencherPrimeira =! preencherPrimeira; 
     
    }//fimFor
}//fimDraw


Efeito Halftone

A segunda tarefa segue o mesmo princípio, a diferença é que nesse caso seriam usados círculos e o diametro das elipses seria calculado em função da distância do centro do círculo ao centro da tela.

void setup(){
  size(400,400);
  background(0);
  fill(255);
  noStroke();
}



void draw(){
  
  background(0);
  for (int j=0; j<=400; j+=20){
      for (int i = 0; i <= 400 ; i+=20){
          //a função dist() calcula a distancia entre
          //o centro do circulo e centro da tela
          float d = dist(i, j, 200,200);
          //a posição X e Y do circulo varia em
          //função das variveis usadas nos laços
          ellipse(i, j, d/6 , d/6); 
          //o valor 6 usado para calcular o diametro
          //foi encontrado através de testes.  
      }  
  }
}

quarta-feira, 12 de março de 2014

Pong singleplayer

Após duas aulas, onde foram apresentados a base para a criação do jogo, como movimentação da bola e paddle e como testar a colisão, usando Bounding Boxes, a atividade proposta foi unir os dois e criar um Pong para um jogador.

Foram implementados até o momento:

  • O básico proposto pelos professores;
  • Pontuação e High Score;
  • Aumento da velocidade em 20% a cada 5 rebatidas;
  • Reiniciar o jogo pressionando a tecla 'R';


já que boa parte do código está comentado, acredito que essas observações sejam suficientes


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//-----Variáveis Paddle------
int largPaddle = 15;
int altPaddle = 90;

int posPaddleX = 0;
int posYPaddle = mouseY;

int rebateu = 0;

//-----Variáveis Bola-----
int posBolaX = 760;
int posBolaY = 300;

int diamLargBola = 20;
int diamAltBola = 20;

float dirX = 5;
float dirY = 5;
//----Variáveis de jogo-----
int highScore = 0;
PFont fontePont;
boolean saiu = false;

void setup() {
  size(800, 600);
  fontePont = createFont("Arial", 16, true);
  noCursor();
}//fim setup

void draw() {
  background(0);
  
  fill(#47C714);
  textFont(fontePont,25);                 
  text(rebateu,700, 50);
  
  textFont(fontePont,20);                 
  text("HighScore: " + highScore,600, 580);

  criarPaddle();

  if (!saiu)
    criarBola();
  
}//fimDraw


void criarPaddle() {
  //criação e posicionamento paddle esquerdo
  fill(255); 
  noStroke();
  rect(posPaddleX, mouseY, largPaddle, altPaddle);
}

void criarBola() {
  //criação, posicionamento e colisões da bola
  fill(#47C714);
  noStroke();
  ellipse(posBolaX, posBolaY, diamLargBola, diamAltBola);

  //movimentação bola
  posBolaX+=dirX;
  posBolaY+=dirY;

  //colisão da bola com o lado superior 
  if (posBolaY <= 10) {
    dirY = -dirY;
  }
  //colisão da bola com o lado inferior
  if (posBolaY >= 590) {
    dirY = -dirY;
  }

  //colisão da bola com o lado direito 
  if (posBolaX >= 790) {
    dirX = -dirX;
  } 

  //colisão da bola com o paddle
  if (posBolaX - diamLargBola/2  == posPaddleX + largPaddle ) {     
    if ((posBolaY >= mouseY ) && (posBolaY <= mouseY + altPaddle)) {
      rebateu++;
      println("rebatida", rebateu);
      
      //incrementa a velocidade da bola em 20% a cada 5 colisões com o paddle
      if (rebateu%5==0) { 
        dirX = -dirX*1.2;
        println(dirX);
      }
      else {
        dirX = -dirX;
      }//fim incremento
      //colisão com o lado esquerdo
    }else if (posBolaX<posPaddleX) {
      println("saiu");
      saiu = true;      //variavel saiu recebe valor true, fazendo a função criarBola parar
          if (rebateu > highScore)
              highScore = rebateu;
      
    }
  }
  
}//fimCriarBola

void keyPressed() {//reiniciar o jogo pressionando a tecla R
  println(keyCode);
  if (keyCode==82) {
    saiu = false;
    posBolaX = 760;
    rebateu = 0;
    dirX = 5;
  }
}

quarta-feira, 5 de março de 2014

Paddle para Pong

A tarefa de implementar o Paddle foi um tanto um simples, apenas usei as informações das últimas aulas para desenhar elementos. A única diferença foi o uso de variáveis para composição das formas ao invés de valores literais, isso facilita muito a edição e teste de partes do código, além de ter sido mais fácil utilizá-las dessa forma nos teste de colisão com a bola.

Este foi o resultado

int largPaddle = 10;
int altPaddle = 70;

int posXPaddle = 10;

int posYPaddle = mouseY;

void setup(){

  size(800,600);
  
}//fim setup


void draw(){

  background(0);

  fill(255); 
  rect(posXPaddle,  mouseY, largPaddle, altPaddle);
    
}//fimDraw