yin Posted August 18, 2012 at 11:15 PM Report Share #472791 Posted August 18, 2012 at 11:15 PM Boa noite a todos. Estou a desenvolver um jogo em Java, tendo como referência o jogo “Pipe Mania”. (link: http://www.freeonlinegames.com/game/pipe-mania) Estou com um problema em relação ao painel lateral do jogo. Nesse painel tenho 7 JPanels, onde 5 deles são peças que estão à espera de serem colocadas. Neste momento já consigo pôr a última peça da lista a “rodar”. Para o fazer, usei uma variável inteira para contar o número de cliques do rato no JPanel e desenhar a peça com a orientação certa. O problema agora é colocar essa mesma peça no tabuleiro de jogo, depois de a rodar. De momento só consigo colocar a peça numa só posição. A minha ideia seria aceder ao número de cliques da peça em espera e assim saber qual a peça que teria de desenhar no tabuleiro. Fiz um teste para as peças rectas e o resultado que obtive foi este: http://img31.imageshack.us/img31/355/pipen.png Os JPanels do tabuleiro são do tipo MousePanel e o JPanel da última peça da lista é MousePanel2. MousePanel: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MousePanel extends JPanel implements MouseListener { String[] pg = GridV9.getPG(); int c = MousePanel2.getCount(); boolean rightButtonIsPressed = false; public MousePanel() { addMouseListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); if (rightButtonIsPressed == true) { if (c % 2 == 0 && pg[4].equals("RectaV")) { g.setColor(Color.orange); g.fillRect(0, 0, 20, 100); // esquerda g.fillRect(75, 0, 25, 100); // direita } if (c % 2 != 0 && pg[4].equals("RectaV")) { g.setColor(Color.orange); g.fillRect(0, 0, 100, 20); // topo g.fillRect(0, 75, 100, 25); // baixo } } } public void mousePressed(MouseEvent mouse) { if (mouse.getButton() == MouseEvent.BUTTON3) { repaint(); rightButtonIsPressed = true; } } public void mouseClicked(MouseEvent mouse) { } public void mouseEntered(MouseEvent mouse) { } public void mouseExited(MouseEvent mouse) { } public void mouseReleased(MouseEvent mouse) { } } MousePanel2: import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JPanel; public class MousePanel2 extends JPanel implements MouseListener { static boolean leftButtonIsPressed = false; static int countClicks = 0; int countClicksJ = 0, countClicksL = 0, countClicksG = 0, countClicksF = 0; String[] pg = GridV9.getPG(); public MousePanel2() { addMouseListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); // desenhar a peça no último painel de peça if (pg[4].equals("RectaH")) { g.setColor(Color.orange); g.fillRect(0, 0, 100, 20); // topo g.fillRect(0, 75, 100, 25); // baixo } if (pg[4].equals("RectaV")) { g.setColor(Color.orange); g.fillRect(0, 0, 20, 100); // esquerda g.fillRect(75, 0, 25, 100); // direita } if (pg[4].equals("Cruz")) { g.setColor(Color.orange); g.fillRect(0, 0, 20, 20); // 1º quadrado g.fillRect(75, 0, 25, 20); // 2º quadrado g.fillRect(0, 75, 20, 20); // 3º quadrado g.fillRect(75, 75, 25, 20); // 4º quadrado } if (pg[4].equals("BalaoH")) { g.setColor(Color.orange); // topo g.fillRect(0, 15, 20, 5); g.fillRect(75, 15, 25, 5); g.drawArc(20, 0, 55, 35, 0, 180); // baixo g.fillRect(0, 75, 20, 5); g.fillRect(75, 75, 20, 5); g.drawArc(20, 60, 55, 30, 0, -180); } if (pg[4].equals("BalaoV")) { g.setColor(Color.orange); // esquerda g.fillRect(15, 0, 5, 20); g.fillRect(15, 75, 5, 25); g.drawArc(0, 20, 35, 55, 90, 180); // direita g.fillRect(75, 0, 5, 20); g.fillRect(75, 75, 5, 25); g.drawArc(60, 20, 35, 55, 90, -180); } if (pg[4].equals("AnguloJ")) { g.setColor(Color.orange); g.fillRect(0, 0, 20, 20); // quadrado g.fillRect(0, 75, 100, 25); // baixo g.fillRect(75, 0, 25, 100); // direita } if (pg[4].equals("AnguloL")) { g.setColor(Color.orange); g.fillRect(75, 0, 25, 20); // quadrado g.fillRect(0, 75, 100, 25); // baixo g.fillRect(0, 0, 20, 100); // esquerda } if (pg[4].equals("AnguloG")) { g.setColor(Color.orange); g.fillRect(75, 75, 25, 20); // quadrado g.fillRect(0, 0, 100, 20); // topo g.fillRect(0, 0, 20, 100); // esquerda } if (pg[4].equals("AnguloF")) { g.setColor(Color.orange); g.fillRect(0, 75, 20, 20); // quadrado g.fillRect(0, 0, 100, 20); // topo g.fillRect(75, 0, 25, 100); // direita } if (leftButtonIsPressed == true) { /****************** PEÇAS RECTAS ********************/ // peça recta V if ((countClicks % 2 != 0 && pg[4].equals("RectaH")) || ((countClicks % 2 == 0 && countClicks != 0) && pg[4] .equals("RectaV"))) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); g.fillRect(0, 0, 20, 100); // esquerda g.fillRect(75, 0, 25, 100); // direita } // peça recta H if ((countClicks % 2 == 0 && countClicks != 0) && pg[4].equals("RectaH") || (countClicks % 2 != 0 && pg[4].equals("RectaV"))) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); g.fillRect(0, 0, 100, 20); // topo g.fillRect(0, 75, 100, 25); // baixo } /****************** PEÇAS BALAO ********************/ // peça balao V if ((countClicks % 2 != 0 && pg[4].equals("BalaoH")) || ((countClicks % 2 == 0 && countClicks != 0) && pg[4] .equals("BalaoV"))) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); // esquerda g.fillRect(15, 0, 5, 20); g.fillRect(15, 75, 5, 25); g.drawArc(0, 20, 35, 55, 90, 180); // direita g.fillRect(75, 0, 5, 20); g.fillRect(75, 75, 5, 25); g.drawArc(60, 20, 35, 55, 90, -180); } // peça balao H if ((countClicks % 2 == 0 && countClicks != 0) && pg[4].equals("BalaoH") || (countClicks % 2 != 0 && pg[4].equals("BalaoV"))) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); // topo g.fillRect(0, 15, 20, 5); g.fillRect(75, 15, 25, 5); g.drawArc(20, 0, 55, 35, 0, 180); // baixo g.fillRect(0, 75, 20, 5); g.fillRect(75, 75, 20, 5); g.drawArc(20, 60, 55, 30, 0, -180); } /****************** PEÇAS ANGULO ********************/ // peça J if ((pg[4].equals("AnguloJ") && countClicksJ == 4) || (pg[4].equals("AnguloL") && countClicksL == 3) || (pg[4].equals("AnguloG") && countClicksG == 2) || (pg[4].equals("AnguloF") && countClicksF == 1)) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); g.fillRect(0, 0, 20, 20); // quadrado g.fillRect(0, 75, 100, 25); // baixo g.fillRect(75, 0, 25, 100); // direita countClicksJ = 0; } // peça L if ((pg[4].equals("AnguloL") && countClicksL == 4) || (pg[4].equals("AnguloG") && countClicksG == 3) || (pg[4].equals("AnguloF") && countClicksF == 2) || (pg[4].equals("AnguloJ") && countClicksJ == 1)) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); g.fillRect(75, 0, 25, 20); // quadrado g.fillRect(0, 75, 100, 25); // baixo g.fillRect(0, 0, 20, 100); // esquerda countClicksL = 0; } // peça G if ((pg[4].equals("AnguloG") && countClicksG == 4) || (pg[4].equals("AnguloF") && countClicksF == 3) || (pg[4].equals("AnguloJ") && countClicksJ == 2) || (pg[4].equals("AnguloL") && countClicksL == 1)) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); g.fillRect(75, 75, 25, 20); // quadrado g.fillRect(0, 0, 100, 20); // topo g.fillRect(0, 0, 20, 100); // esquerda countClicksG = 0; } // peça F if ((pg[4].equals("AnguloF") && countClicksF == 4) || (pg[4].equals("AnguloJ") && countClicksJ == 3) || (pg[4].equals("AnguloL") && countClicksL == 2) || (pg[4].equals("AnguloG") && countClicksG == 1)) { g.setColor(Color.darkGray); g.fillRect(0, 0, 100, 100); g.setColor(Color.orange); g.fillRect(0, 75, 20, 20); // quadrado g.fillRect(0, 0, 100, 20); // topo g.fillRect(75, 0, 25, 100); // direita countClicksF = 0; } } } public static int getCount() { return countClicks; } public void mouseClicked(MouseEvent mouse) { } public void mouseEntered(MouseEvent mouse) { } public void mouseExited(MouseEvent mouse) { } public void mousePressed(MouseEvent mouse) { if (mouse.getButton() == MouseEvent.BUTTON1) { leftButtonIsPressed = true; if (pg[4].equals("RectaH") || pg[4].equals("RectaV") || pg[4].equals("Cruz") || pg[4].equals("BalaoH") || pg[4].equals("BalaoV")) countClicks++; if (pg[4].equals("AnguloJ")) countClicksJ++; if (pg[4].equals("AnguloL")) countClicksL++; if (pg[4].equals("AnguloG")) countClicksG++; if (pg[4].equals("AnguloF")) countClicksF++; repaint(); } } public void mouseReleased(MouseEvent mouse) { } } Acho que o problema deve estar na maneira como estou a aceder à variável countClicks mas não sei como o resolver 😞 Se me pudessem dar umas dicas, ficaria muito agradecida 🙂 Link to comment Share on other sites More sharing options...
KTachyon Posted August 19, 2012 at 12:29 AM Report Share #472801 Posted August 19, 2012 at 12:29 AM Se calhar devias utilizar uma variável de estado para definir o ângulo da peça em vez de só contares os cliques. Até porque no fundo devias estar a aplicar o %4 à variável, visto que rodas em ângulos de 90º. Melhor ainda seria passares toda a representação da peça para o seu próprio objecto. Assim, quando quisesses desenhar a peça só precisavas de chamar uma função com o Graphics do JPanel. Por exemplo: piece.draw(g, posX, posY, width); Como estás a fazer assim é quase ilegível. Podes gerar as peças durante a inicialização, colocando-as, por exemplo, num HashMap, e chamas o objecto pelo nome, em vez de fazeres comparações de strings como estás a fazer no método que desenha a peça. Esse método ficaria qualquer coisa como: public void paintComponent(Graphics g) { super.paintComponent(g); pieceMap.get(pg[4]).draw(); //... } E, não deves utilizar constantes dessa forma. Imagina que um dia decides que, em vez do pg[4], devia ser o pg[5]. Vais ter que mudar todos os sítios que estão com pg[4] e não deviam. O ideal é teres declarada uma variável constante (final) que só precisas de alterar nesse sítio (e sem recorrer a coisas como "substituir todas as ocorrências de", que em código longo e complexo pode causar bastantes problemas em determinadas situações). Portanto: final defPieceIndex = 4; //... pg[defPieceIndex] //... pg[defPieceIndex] //... pg[defPieceIndex] //... pg[defPieceIndex] //... pg[defPieceIndex] //... Não tenho uma ideia concreta de qual é o teu problema, mas se encapsulares as partes do código específicas da peça em objectos, como disse anteriormente, vais ter código bastante mais fácil de gerir e maior facilidade em detectar erros. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to comment Share on other sites More sharing options...
yin Posted August 19, 2012 at 02:02 PM Author Report Share #472834 Posted August 19, 2012 at 02:02 PM Obrigada pelas explicações, KTachyon 🙂 Vou seguir as tuas dicas e tentar pôr isto a funcionar. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now