[Java] Movimento bola aleatorio

Sky_Boy_

Power Member
Boas pessoal....estou a fazer um programar que consiste em construir uma applet com determinada dimensao (um quadro ou rectangulo....consideremos 480*480por ex) e uma bola que tem de andar dentro do mesmo batendo aleatoriamente nas paredes....teremos tambem de retirar um pc do quadrado e quando a bola acertar nesse buraco a applet deve terminar...

o quadrado esta desenhado com o respectivo buraco, alguem pode ajudar a fazer o movimento aleatorio da bola e, quando ela acertar no buraco, o programa terminar?

Obgd desde ja

Código:
import java.awt.*;
import java.applet.*;
import java.math.*;

public class pong extends Applet {
  int x, y;
  int deltaX, deltaY;
  
  public void init() {
    setSize(480, 480);
    x = this.getSize().width / 2;
    y = this.getSize().height / 2;
    deltaX = 5;
    deltaY = 5;
  }

  public void paint(Graphics g) {
    g.drawRect(10, 10, 460, 460);
    g.clearRect(220,10,60,460);
    while (true) {
      x += deltaX;
      y += deltaY;
      g.clearRect(x - deltaX, y - deltaY, 25, 25);
      g.fillOval(x, y, 25, 25);
      try {
        Thread.sleep(10);
      }
      catch (Exception e) {
        System.err.println("[ERRO: a Thread terminou...]");
      }
      if ((x >= 445) || (x <= 15)){
        deltaX = -deltaX;
      }
      if ((y >= 445) || (y <= 15)){
        deltaY = -deltaY;
      }
    }
  }
}
 
Movimento aleatório como? Alguma função matemática específica?

Da forma como o código está escrito vai sempre voltar ao ponto de origem...

Não podes imaginar que a bola segue um determinado ângulo em relação à abcissa? E quando bate numa parede o valor do ângulo muda?
 
O programa da maneira que esta a bola vai bater sempre no mm sitio caso desenhemos um quadrado....o objectivo e que isso nao aconteça, ou seja, o movimento seja aleatorio...

A sugestao que me foi dada pelo docente da cadeira foi utilizar o random da biblioteca Math
 
O metodo Math.random(), devolve um double entre 0(inclusivé) e 1(exclusivé), e podes multiplicar esse valor pela altura da applet e pela largura da applet, e assim encontrar um novo x e um novo y, por exemplo:
PHP:
/** Tens sempre a certeza que é um valor dentro da janela */
x = Math.random() * getSize().width;
y = Math.random() * getSize().heigth;

Sabendo que o (x,y) é o centro da bola, é andar com deltas(radius) para não permitir que metade da bola fique de fora do ecrã. Ou outra solução, seria em vez de ... * getSize().width; fazer ... * getSize().width - delta(isto é, o raio).
Para saber se a bola está dentro do quadrado, é verificar se as coordenadas estão "dentro" do quadrado.
Já agora uma applet não(penso que não) termina, porque é carregada em browser, podes é um fazer aparecer um popup, ou imprimir algo no status do browser através do metodo showStatus(String str).
 
PHP:
while (true) {
			x = (int) (Math.random() * (getSize().width-25));
			y = (int) (Math.random() * (getSize().height-25));
			//g.clearRect(x - deltaX, y - deltaY, 25, 25);
			g.fillOval(x, y, 25, 25);
			try {
				Thread.sleep(10);
			}
			catch (Exception e) {
				System.err.println("[ERRO: a Thread terminou...]");
			}
		}

Nesse trecho de código, consegues ter várias bolas no ecrã, sem exceder o limite da applet.
Agora sempre que é adicionado uma bola e um quadrado, tens que verificar se a bola está "dentro" do quadrado, através das coordenadas.
Eu não fiz essa parte, mas não é dificil, é so envolver alguma matemática elementar.
 
Neste momento o meu prog está assim:

Código:
import java.awt.*;
import java.applet.*;
import java.math.*;

public class pong extends Applet {
  int x, y;
  int deltaX, deltaY;
  
  public void init() {
    setSize(480, 480);
    /*x = this.getSize().width / 2;
    y = this.getSize().height / 2;*/
    deltaX = 5;
    deltaY = 5;
  }

  public void paint(Graphics g) {
    g.drawRect(10, 10, 460, 460);
    g.clearRect(220,10,60,460);
    while (true) {
        x += (int) (Math.random() * (getSize().width-25));
        y += (int) (Math.random() * (getSize().height-25));
        //g.clearRect(x - deltaX, y - deltaY, 25, 25);
        g.fillOval(x, y, 25, 25);
        try {
            Thread.sleep(10);
        }
        catch (Exception e) {
            System.err.println("[ERRO: a Thread terminou...]");
        }
      if ((x >= 445) || (x <= 15)){
        deltaX = -deltaX;
      }
      if ((y >= 445) || (y <= 15)){
        deltaY = -deltaY;
      }
    }
  }
}

Resultando nisto:



No entanto, o que eu pretendia era que ela fosse batendo aleatoriamente pelas paredes até ao momento em que passa-se pelo buraco e ai desaparecesse ou desse alguma mensagem....alguem me consegue ajudar?

Ela como está nem seker se mexe :005:
 
Código:
import java.awt.*;
import java.applet.*;

public class PingPong extends Applet {
  int x, y;
  int deltaX, deltaY;
  
  public void init() {
    setSize(640, 480);
    x = this.getSize().width / 2;
    y = this.getSize().height / 2;
    deltaX = 5;
    deltaY = 5;
  }

  public void paint(Graphics g) {
    g.drawRect(10, 10, 620, 460);
    while (true) {
      x += deltaX;
      y += deltaY;
      g.clearRect(x - deltaX, y - deltaY, 25, 25);
      g.fillOval(x, y, 25, 25);
      try {
        Thread.sleep(10);
      }
      catch (Exception e) {
        System.err.println("[ERRO: a Thread terminou...]");
      }
      if ((x >= 605) || (x <= 15)){
        deltaX = -deltaX;
      }
      if ((y >= 445) || (y <= 15)){
        deltaY = -deltaY;
      }
    }
  }
}

Assim ela movimenta-se mas n e de modo aleatorio... :rolleyes:
 
Bom para ti. Agora fica a saber que não é assim o modelo de programação de animações em AWT ou em qualquer motor gráfico, mas vai tentando.
(ou podes ler o link que te dei)

Em todo o caso, boa sorte.
 
MadOnion, de acordo com a tua ajuda o resultado foi este:



Não sendo o meu objectivo (possivelmente expliquei-me mal) :005:

Com as imagens de cima que permitem compreender melhor o proposito do prog nng me consegue dar uma ajuda :sad:

Tks
 
Código:
import java.awt.*;
import java.applet.*;
import java.math.*;

public class bouncing extends Applet {

	int deltaX = (int)(Math.random() * 10);
	int deltaY = (int)(Math.random() * 10);

	int x, y;


	public void init() {
		setSize(480, 480);
		x = this.getSize().width / 2;
		y = this.getSize().height / 2;
	}

	public void paint(Graphics g) {
		g.drawRect(10, 10, 460, 460);
		g.clearRect(220,10,80,440);
		while (true) {
			x += deltaX;
			y += deltaY;

			g.clearRect(x - deltaX, y - deltaY, 20, 20);
			g.fillOval(x, y, 20, 20);
			try {
				Thread.sleep(10);
			}
			catch (Exception e) {
				System.err.println("[ERRO: a Thread terminou...]");
			}
			if ((x >= 440) || (x <= 20)){
				deltaX = (int)(Math.random() * 10);
				if (x >= 440) {
					deltaX = -deltaX;
				}
			}
			if ((y >= 440) || (y <= 20)){
				deltaY = (int)(Math.random() * 10);
				if (y >= 440) {
					deltaY = -deltaY;
				}
			}

		}

	}
}

Ja faz o movimento aleatorio.....agora alguem sabe como posso verificar se a posição da bola coincide com as coordenadas da baliza (220,10,80,440)?
 
Back
Topo