MacgyverPT Posted March 5, 2014 at 05:19 PM Report #547651 Posted March 5, 2014 at 05:19 PM 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
HappyHippyHippo Posted March 5, 2014 at 05:56 PM Report #547656 Posted March 5, 2014 at 05:56 PM 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
Knitter Posted March 5, 2014 at 06:29 PM Report #547665 Posted March 5, 2014 at 06:29 PM Qual conteúdo? A classe GameGraphics não tem "conteúdo" acessível.
MacgyverPT Posted March 6, 2014 at 08:38 AM Author Report #547688 Posted March 6, 2014 at 08:38 AM Knitter, então como acedo na GameLauncher ao "drawRect()" (por exemplo) da classe GameGraphics?
HappyHippyHippo Posted March 6, 2014 at 09:31 AM Report #547693 Posted March 6, 2014 at 09:31 AM 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
MacgyverPT Posted March 6, 2014 at 09:49 AM Author Report #547696 Posted March 6, 2014 at 09:49 AM 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.
HappyHippyHippo Posted March 6, 2014 at 10:07 AM Report #547698 Posted March 6, 2014 at 10:07 AM 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
bioshock Posted March 6, 2014 at 10:48 AM Report #547706 Posted March 6, 2014 at 10:48 AM 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);
MacgyverPT Posted March 6, 2014 at 11:31 AM Author Report #547721 Posted March 6, 2014 at 11:31 AM 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? 😛
bioshock Posted March 6, 2014 at 11:42 AM Report #547727 Posted March 6, 2014 at 11:42 AM 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.
Knitter Posted March 6, 2014 at 11:43 AM Report #547728 Posted March 6, 2014 at 11:43 AM 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.
MacgyverPT Posted March 6, 2014 at 02:28 PM Author Report #547751 Posted March 6, 2014 at 02:28 PM 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.
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