Jump to content

Acesso a outras classes


MacgyverPT
 Share

Recommended Posts

Boas.

Estou com uma dúvida. Há muito tempo que não faço nada em Java, de maneira que isto tá "enferrujado". De modo a me ir preparando para a cadeira de Programação II decidi ir fazendo um programa (quase sem "nexo") de modo a relembrar passos, como se faz determinadas coisas, etc etc. Foi neste exercício que surgiu a minha dúvida:

Tenho 3 classes (GameLauncher, Player, GameGraphics). A "GameLauncher" é que tem o run (e chama os métodos das restantes), a classe "Player" tem os atributos do jogador e respectivos métodos (inserção do nome - por enquanto) e a classe "GameGraphics" é utilizada para desenhar os gráficos da aplicação (labels, rectângulos, quadrados, ovais, etc etc).

Na GameLauncher consigo aceder ao conteúdo da Player sem qualquer problema (meti uma label de teste para mostrar o nome inserido pelo jogador e funciona sem stress), mas não consigo de maneira nenhum aceder ao conteúdo da GameGraphics. Abaixo deixo o pequeníssimo código que tenho para exemplificar e me tentarem ajudar com digas para tentar resolver o "mistério":

Classe: GameLauncher

import acm.program.*;
import acm.graphics.*;
import acm.gui.*;
import acm.io.*;
import acm.util.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.*;

public class GameLauncher extends GraphicsProgram{
public static final int WINDOW_WIDTH = 1000;
public static final int WINDOWS_HEIGHT = 500;
GameGraphics graphics = new GameGraphics();
Player player = new Player();


public void run(){
 setSize(WINDOW_WIDTH, WINDOWS_HEIGHT);

 graphics.drawLabels();
 graphics.drawRect();

 player.insertPlayer();

 GLabel playerStatus = new GLabel("Player Name: " + player.name, 300, 50);
 this.add(playerStatus);
}

}

Classe: Player

import acm.program.*;
import acm.graphics.*;
import acm.gui.*;
import acm.io.*;
import acm.util.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.*;
public class Player {
public String name;

public void insertPlayer(){
 IODialog dialog = new IODialog();

 name = dialog.readLine("Insert your name: ");
}
}

Classe: GameGraphics

import acm.program.*;
import acm.graphics.*;
import acm.gui.*;
import acm.io.*;
import acm.util.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.*;

public class GameGraphics extends GraphicsProgram{

public void drawLabels(){
GLabel banner = new GLabel ("LABEL TEST", 50, 50);
this.add(banner);
}

public void drawRect(){
GRect rect = new GRect(100, 150);
rect.setFillColor(Color.BLUE);
rect.setFilled(true);
this.add(rect);
}
}

O que estou a fazer de errado?

Cump

MoffspringR

Link to comment
Share on other sites

nada :

import acm.program.*;
import acm.graphics.*;
import acm.gui.*;
import acm.io.*;
import acm.util.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.*;

public class GameLauncher extends GraphicsProgram{
public static final int WINDOW_WIDTH = 1000;
public static final int WINDOWS_HEIGHT = 500;
GameGraphics graphics = new GameGraphics();
Player player = new Player();


public void run(){
 setSize(WINDOW_WIDTH, WINDOWS_HEIGHT);

 graphics.drawLabels(); // <--- a aceder à classe GameGraphics
 graphics.drawRect();   // <--- a aceder à classe GameGraphics

 player.insertPlayer();

 GLabel playerStatus = new GLabel("Player Name: " + player.name, 300, 50);
 this.add(playerStatus);
}

}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sim, fiz dessa maneira, mas no entanto a label (e demais objetos) teima(m) em não aparecer... Deduzo que algo está mal "definido" na classe GameGraphics.

Não será por não retornares nada da classe GameGraphics?

Para além do mais isto é, teoricamente, considerado errado:

public String name;

public void insertPlayer(){
 IODialog dialog = new IODialog();

 name = dialog.readLine("Insert your name: ");
}
(....)
GLabel playerStatus = new GLabel("Player Name: " + player.name, 300, 50);

Não deves aceder directamente às variáveis das classes. As variáveis das classes tendem a ser privadas e podes aceder ao conteúdo delas através de funções.

Private String name;
Public String getName(){ return this.name; }
(...)
GLabel playerStatus = new GLabel("Player Name: " + player.getName(), 300, 50);
Link to comment
Share on other sites

Boas.

Obrigado pela chamada de atenção no caso das variáveis. No entanto as ditas teimam em não aparecer... Mesmo errando na parte de passar o nome do jogador entre as classes, eu criei um GRect e não aparece... Será por ser carnaval ele está mascarado de invisível? 😛

Link to comment
Share on other sites

Qual conteúdo? A classe GameGraphics não tem "conteúdo" acessível.

Que, olhando para o teu código, também estou de acordo..daí eu ter dito:

Não será por não retornares nada da classe GameGraphics?

public void drawLabels(){
 GLabel banner = new GLabel ("LABEL TEST", 50, 50);
 this.add(banner); // <------ ponto A
}

Não tenho conhecimento do ponto A, mas parece-me que estás adicionar o objecto à própria classe e quando a chamas numa outra classe é normal que não te apareça nenhum conteúdo.

O que faz mais sentido para mim é fazeres um return desse banner.

Link to comment
Share on other sites

Mais uma chamada de atenção, "variáveis de classe" são variáveis estáticas associadas à classe, o que está a ser usado são variáveis de instância, que neste caso são bastante diferentes 🙂

Como o HappyHippyHippo indicou, só vendo todo o código. Com essas três classes apenas não dá bem para perceber o que estás a fazer de errado. Olhando para o código surge a questão de em que local adicionas os teus objectos à janela (ao componente visual) que estás a usar? As labels são adicionadas a uma instância de GameGraphics mas essa instância está a ser desenhada? É desenhada automaticamente ou precisa ser adicionada ao contexto gráfico manualmente?

No código que apresentaste não há nada que não funcione, talvez uma má utilização de modificadores de visibilidade ou pormenor de arquitectura mas a nível de código está correcto.

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
 Share

×
×
  • 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.