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
Tens de correr o teu código de actualização da posição da bola numa thread à parte. Como está agora, estás a bloquear a thread principal do AWT. Lê este artigo: http://www.javaworld.com/javaworld/jw-03-1996/jw-03-animation.html
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...
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) Com as imagens de cima que permitem compreender melhor o proposito do prog nng me consegue dar uma ajuda 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)?