Jump to content

Pipe Mania (Java Swing)


yin

Recommended Posts

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

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

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.