Jump to content
serlands

Ajuda com processing

Recommended Posts

serlands

Ola a todos!

Preciso de ajuda em processing, estou a fazer um jogo simples, trabalho final de uma cadeira. Tenho o jogo praticamente terminado, faltam apenas dois pormenores, um contador numerico de objectos, apesar de ja ter um contador visual a cada objecto, o que preciso mesmo é de subtitui-lo por numeros. E por fim preciso de ter um fim, ou seja, quando um objecto cair no chao o jogo acaba. Alguem me consegue dar uma ajuda por favor?

              Obrigado

Share this post


Link to post
Share on other sites
serlands

Aqui vao os 4 sketchs que tenho ate agora:  1º ( JogoZama)




int pingoX, pingoY, raio;

// Declaração de variável do tipo PImage
PImage img;

// Declaração dos objectos do jogo
ApanhaPingos apanhaPingos;
Temporizador temporizador;
Pingo[] pingos;

int totalPingos = 0;

void setup(){
  size(600,450);
   // Criar uma instância PIMage a partir de ficheiro
  img = loadImage("background.jpg");

  smooth();
  apanhaPingos = new ApanhaPingos(50);
  pingos = new Pingo[1000];
  temporizador = new Temporizador(300);
  temporizador.inicia();
  
  raio=(int)random(15)+15;
  pingoX=(int) random(raio, width-raio);
  pingoY=(int) random(raio, height-raio);
}

void draw(){
  background(0);
    image(img,0,0,600,450);
  apanhaPingos.localizacao(mouseX, mouseY);
  apanhaPingos.visualiza();
  //Verifica temporizador
  if (temporizador.terminou()){
    //Inicializa 1 pingo
    pingos[totalPingos] = new Pingo();
    //Incrementa totalPingos
    totalPingos++;
    //Se atingirmos o fim do array
    if (totalPingos >= pingos.length){
      totalPingos = 0; //Recomeça
    }
    temporizador.inicia();
  }
  //Mover e visualizar os pingos
  for(int i=0; i < totalPingos; i++){
    pingos[i].cair();
    pingos[i].visualiza();
    if(apanhaPingos.intersecta(pingos[i])){
      pingos[i].apanhado();
      
       
       
       
        if(sqrt(sq(mouseX-pingoX)+sq(mouseY-pingoY))<raio)
  {
    fill(255,0,0);
  }
  else
  {
    fill(229,46,205);
  }
  ellipse(pingoX, pingoY, raio*3, raio*3);

    }
  }
}
  

2º  Class (ApanhaPingos)


class ApanhaPingos{
  float r; //raio
  float x, y; //localização
  color cor; // cor do apanhaPingos
  ApanhaPingos(float tempR){
    r = tempR;
    x = 0;
    y = 0;
    cor = color(50,10,10,150);
  }
  void localizacao(float tempX, float tempY){
    x = tempX;
    y = tempY;
  }
  void visualiza(){
  //cabeça
stroke(10);
strokeWeight(5);
fill(242,193,92);
strokeWeight(3);
ellipse(mouseX+2,mouseY-24,35,48);
noFill();


//olhos
stroke(10);
ellipse(mouseX-7,mouseY-27,10,3);
ellipse(mouseX+10,mouseY-27,10,3);

//boca
fill(198,2,2);
ellipse(mouseX+1,mouseY-10,8,10);


//pescoço
fill(242,193,92);
rect(mouseX,mouseY,7,45);

//braços
stroke(10);
fill(245,0,57);
rect(mouseX-25,mouseY+20,55,6);
rect(mouseX-30,mouseY,7,26);
rect(mouseX+28,mouseY+20,7,27);

//corpo
stroke(10);
fill(245,0,57);
rect(mouseX-10,mouseY+10,25,43);

//pernas
stroke(196,239,255);
strokeWeight(13);
line(mouseX-5,mouseY+60,mouseX-10,pmouseY+118);
stroke(196,239,255);
strokeWeight(13);
line(mouseX+10,mouseY+60,mouseX+15,pmouseY+118);
  }
  //Função que devolve true ou false, consoante o apanhaPingos
  //intersecta ou não um pingo de chuva
  boolean intersecta(Pingo p){
    //Calcula distância
    float distancia = dist(x, y, p.x, p.y);
    //Compara distância com soma dos raios
    if(distancia < r + p.r){
      return true;
    }else{
      return false;
    }
  }
}

3º Class  (Pingo)


// Classe Pingo
class Pingo{
  float x, y;   //localização do pingo de chuva
  float speed;  //velocidade do pingo de chuva
  color c;      //cor do pingo de chuva
  float r;      //valor do raio do pingo de chuva
  //Construtor
  Pingo(){
    r = 4;      //Os pingos têm todos o mesmo tamanho
    x = random(width);        //começam numa posição x aleatória
    y = -r*4;                 //começam acima da janela
    speed = random(7,5);      //velocidade com valor aleatório
    c = color(255);    //cor azul
  }
  //Fazer cair o pingo de chuva
  void cair(){
    y += speed;   // Incrementa y com valor de speed
  }
  //Verificar se o pingo de chuva atinge o fundo da janela
  boolean atingeChao(){
    if (y > height + r*4){
      return true;
    }else{
      return false;
    }
  }
  //Visualizar o pingo de chuva
  void visualiza(){
    fill(c);
    noStroke();
    for(int i=2; i<r; i++){
      ellipse(x, y + i*4, i*2, i*2);
    }
  }
  //Se pingo é apanhado
  void apanhado(){
    speed = 0;
    y = -1000;
  }
}

E por fim o 4º class (temporizador)


class Temporizador{
  int tempoInicial; //Indica quando o temporizador começou
  int tempoTotal;  //Indica quanto o temporizador deve contar
  //Construtor
  Temporizador(int tempTempoTotal){
    tempoTotal = tempTempoTotal;
  }
  //Dar início ao temporizador
  void inicia(){
    tempoInicial = millis();
  }
  //Verificar fim da contagem
  boolean terminou(){
    //Verifica quanto tempo já passou
    int tempoDecorrido = millis() - tempoInicial;
    if (tempoDecorrido > tempoTotal){
      return true;
    }else{
      return false;
    }
  }
}

Share this post


Link to post
Share on other sites
clera

boas, se usares uma arrayList de pingos em vez de uma array poupas recursos, e sabes automaticamente o número de pingos "activos" que estão no stage.

quando algum pingo tocar no chão basta fazeres um clear à arrayList e mostrares uma imagem, ou fazeres um botão para reiniciar :)

o contador não percebi muito bem, mas se não puderes usar uma arrayList podes ter uma variável à parte com o número de pingos...

força nisso :)

Share this post


Link to post
Share on other sites
clera

não tem nada que saber..

int i;
int trails=50, diam=30;
int posX,posY;

ArrayList positions= new ArrayList();

void setup(){
  size (400,400);
  ellipseMode(CENTER);
  noStroke();
}

void draw(){
  background(50);
  posX=mouseX;
  posY=mouseY;
  
  if(positions.size()<trails*2){
    positions.add(new Float(posX));
    positions.add(new Float(posY));
  }
  else{
    positions.remove(0);
    positions.remove(0);    
    positions.add(new Float(posX));
    positions.add(new Float(posY));
  }
  
  for(i=0;i<positions.size();i+=2){
    Float X= (Float)positions.get(i);
    Float Y= (Float)positions.get(i+1);
    fill(255,50);
    ellipse(X,Y,diam,diam);
  }
}

aqui tens um exemplo muito simples de como podes usar a arrayList,

aplicado ao teu problema é substituíres a tua array de pingos por uma arrayList, sempre que um pingo tocar no chão removes o pingo e utilizando o ".size()" sabes os pingos que estão activos..

se precisares de mais alguma função para as arrayList podes ver aqui

http://download.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html

e não te esqueças de quando utilizares o get, definires o tipo de objecto que vais buscar, por exemplo:


  for(i=0;i<pingos.size();i+=2){
    Pingo p= (Pingo) pingos.get(i);
    p.cair();
    p.vizualiza();
.......
  }

Share this post


Link to post
Share on other sites
clera

se calhar sou eu que não estou a perceber o teu problema..

int pingoX, pingoY, raio;
boolean fim;
// Declaração de variável do tipo PImage
//PImage img;

// Declaração dos objectos do jogo
ApanhaPingos apanhaPingos;
Temporizador temporizador;
//Pingo[] pingos;
ArrayList pingos;
PFont font;

int totalPingos = 0;

void setup() {
  size(600, 450);
  // Criar uma instância PIMage a partir de ficheiro
  //img = loadImage("background.jpg");
  fim=false;
  smooth();
  apanhaPingos = new ApanhaPingos(50);
  pingos=new ArrayList();
  temporizador = new Temporizador(300);
  temporizador.inicia();

  font = loadFont("ArialMT-20.vlw"); 

  raio=(int)random(15)+15;
  pingoX=(int) random(raio, width-raio);
  pingoY=(int) random(raio, height-raio);
  textFont(font);
}

void draw() {
  background(img);

  


  if (fim)
  {
    text("perdeste", 15, 60);
  }
  else
  {
    text(pingos.size(), 15, 60);

    apanhaPingos.localizacao(mouseX, mouseY);
    apanhaPingos.visualiza();
    //Verifica temporizador
    if (temporizador.terminou()) {
      //Inicializa 1 pingo
      pingos.add(new Pingo());

      temporizador.inicia();
    }
    //Mover e visualizar os pingos
    for (int i=pingos.size()-1; i >=0; i--) {
      Pingo p=(Pingo)pingos.get(i);
      if (p.atingeChao())
      {
        fim=true;
        break;
      }
      else
      {
        p.cair();
        p.visualiza();

        if (apanhaPingos.intersecta(p)) {
          pingos.remove(i);
          if (sqrt(sq(mouseX-pingoX)+sq(mouseY-pingoY))<raio)
          {
            fill(255, 0, 0);
          }
          else
          {
            fill(229, 46, 205);
          }
          ellipse(pingoX, pingoY, raio*3, raio*3);
        }
      }
    }
  }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.