MacgyverPT Posted March 5, 2014 Report Share Posted March 5, 2014 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 More sharing options...
HappyHippyHippo Posted March 5, 2014 Report Share Posted March 5, 2014 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 Portugol Plus Link to comment Share on other sites More sharing options...
Knitter Posted March 5, 2014 Report Share Posted March 5, 2014 Qual conteúdo? A classe GameGraphics não tem "conteúdo" acessível. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 6, 2014 Author Report Share Posted March 6, 2014 Knitter, então como acedo na GameLauncher ao "drawRect()" (por exemplo) da classe GameGraphics? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 6, 2014 Report Share Posted March 6, 2014 Knitter, então como acedo na GameLauncher ao "drawRect()" (por exemplo) da classe GameGraphics? está assinalado no teu código (no meu post) como já acedeste a esse método ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 6, 2014 Author Report Share Posted March 6, 2014 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 6, 2014 Report Share Posted March 6, 2014 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. só vendo/testando todo o código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bioshock Posted March 6, 2014 Report Share Posted March 6, 2014 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 More sharing options...
MacgyverPT Posted March 6, 2014 Author Report Share Posted March 6, 2014 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 More sharing options...
bioshock Posted March 6, 2014 Report Share Posted March 6, 2014 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 More sharing options...
Knitter Posted March 6, 2014 Report Share Posted March 6, 2014 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. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 6, 2014 Author Report Share Posted March 6, 2014 Boas. Já dá. Realmente faltava o return nas funções. Olhando para as dicas apresentadas e para o erro, deu para perceber onde falhei. Obrigado mais uma vez. 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