Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Aimind

Abrir uma classe apartir de outra

Recommended Posts

Aimind

Estou fazendo o jogo da Snake. Tenho 2 classes uma com o jogo e outra com um menu (new game, score, instructions, exit), gostava que ao clicar em new game abri-se a outra classe e começa-se a dar para jogar. So que quando eu clico em new game aparece a outra janela (a do jogo) so que nao da para jogar. Na classe do jogo estou utilizando a class Canvas. Desde ja muito obrigado, e se precisarem de mais promenores para me poder ajudar é so dizer.

Share this post


Link to post
Share on other sites
Knitter

Não dá para jogar porquê? O que é que acontece e o que é que esperavas que acontecesse?

Dá para colocares o teu código? Se for muito usa o pastebin, o link está no topo da página na barra preta.

Share this post


Link to post
Share on other sites
Aimind

Não dá para jogar porquê? O que é que acontece e o que é que esperavas que acontecesse?

Dá para colocares o teu código? Se for muito usa o pastebin, o link está no topo da página na barra preta.

Eu ao clicar em new game estava a espera que abrisse a outra janela (a que contem o jogo) e desse para jogar, mas eu clico abre a outra janela só que não dá para jogar. Eu não concigo controlar a cobra, ela vai sempre em frente.

Share this post


Link to post
Share on other sites
Aimind

Não dá para jogar porquê? O que é que acontece e o que é que esperavas que acontecesse?

Dá para colocares o teu código? Se for muito usa o pastebin, o link está no topo da página na barra preta.

public class Home extends JFrame {

private JLabel jLabel_img3 = new JLabel(new ImageIcon("new_game.png"));

private JPanel contentPane = (JPanel) this.getContentPane();

public Home() {

setTitle("Snake Game");

setLocation(new Point(342, 150));

setSize(new Dimension((40 * 15) + 15, (40 * 15) + 35));

setupActions();

contentPane.setLayout(null);

contentPane.setBorder(BorderFactory.createEtchedBorder());

contentPane.setBackground(Color.BLACK);

painel_home();

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

setResizable(true);

setVisible(true);

}

private void painel_home() {

addComponent(contentPane, jLabel_img3, 360, 220, 220, 50);

}

private void addComponent(Container container, Component c, int x, int y,

int width, int height) {

c.setBounds(x, y, width, height);

container.add©;

}

private void setupActions() {

jLabel_img3.addMouseListener(new MouseListener() {

@Override

public void mouseReleased(MouseEvent arg0) {

Main m = new Main();

m.game();

}

@Override

public void mousePressed(MouseEvent arg0) {

// TODO Auto-generated method stub

}

@Override

public void mouseExited(MouseEvent arg0) {

// TODO Auto-generated method stub

}

@Override

public void mouseEntered(MouseEvent arg0) {

// TODO Auto-generated method stub

}

@Override

public void mouseClicked(MouseEvent arg0) {

// TODO Auto-generated method stub

}

});

}

public static void main(String[] args) {

new Home();

}

}

Isto é o código do menu, não esta completo, mas o resto também penso que não interessa porque são mais imagens (instructions, score, sair), e ações para as mesmas. o Main é a classe que contém o meu jogo.

Share this post


Link to post
Share on other sites
Knitter

Não vejo aí qualquer código para controlar a cobra, não tens código para controlo de eventos de teclado, não adicionas qualquer listener à JFrame para isso... se a classe Main é que tem o jogo precisava ver o código disso ou pelo menos que confirmes se estás a adicionar os listeners para controlo da cobra.

Há alguns pormenores no código que colocaste que não estão muito correctos mas não devem afectar o controlo da cobra.

Se colocares mais código usa a opção para sintaxe para que seja mais simples de ler.

Share this post


Link to post
Share on other sites
Aimind

Não vejo aí qualquer código para controlar a cobra, não tens código para controlo de eventos de teclado, não adicionas qualquer listener à JFrame para isso... se a classe Main é que tem o jogo precisava ver o código disso ou pelo menos que confirmes se estás a adicionar os listeners para controlo da cobra.

Há alguns pormenores no código que colocaste que não estão muito correctos mas não devem afectar o controlo da cobra.

Se colocares mais código usa a opção para sintaxe para que seja mais simples de ler.

O codigo a cima era o que contém o menu, este aqui é o que contem o jogo. Se eu executar o jogo apartir da classe que contem o jogo ele dá perfeitamente, mas se eu executar apartir do que contem o menu e clicar em new game ele abre o jogo so que a cobra não vira.

import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.LinkedList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Main extends Canvas implements KeyListener{
AudioClip eat = java.applet.Applet.newAudioClip(Main.class.getResource("sound/eat.wav"));
private boolean pause = false;
private JFrame janela = new JFrame("Snake");
private final int norte = 1, sul = 2, este = 3, oeste = 4;
private int scale = 10, height = 40, width = 40, speed = 80, direcao=norte, nivel = 1, vida = 0;
private int crescer = 0;
private static final String comida = "lme";
private LinkedList<body> cobra = new LinkedList<body>();
private char matriz [][] = new char [height][width];
private JPanel painel = (JPanel) janela.getContentPane();

public Main(){
	painel.add(this);
	ImageIcon favicon = new ImageIcon("icon.png");
	janela.setIconImage(favicon.getImage());
	carregar_nivel(nivel);
	requestFocus();
	addKeyListener(this);
	janela.setSize(width*scale+scale, height*scale+scale+25);
	janela.setLocationRelativeTo(null);
	janela.setVisible(true);
}

public void paint(Graphics g) {
	for(int y=0; y<height; y++){
		for(int x=0; x<width; x++){
			switch (matriz[y][x]){
				case 'w':desenharMuro(g, y, x);
						 break;
				case 's':desenharCobra(g, y, x);
						 break;
				case '.':desenharChao(g, y, x);
						 break;
				case 'l':desenharLimao(g, y, x);
						 break;
				case 'm':desenharMaca(g, y, x);
				 		 break;
				case 'e':desenharMelancia(g, y, x);
				         break;
				case 'v':desenhaVida(g, y, x);
						break;
				default: desenharChao(g, y, x);
						 break;
			}
		}
	}
}


private void desenhaVida(Graphics g, int y, int x) {
	BufferedImage imagem = loadImage("imagens/vida.gif");
	g.drawImage(imagem, x*scale, y*scale, scale, scale, Color.black, this);
}


private void desenharMelancia(Graphics g, int y, int x) {
	BufferedImage imagem = loadImage("imagens/melancia.gif");
	g.drawImage(imagem, x*scale, y*scale, scale, scale, Color.black, this);
}

private void desenharMaca(Graphics g, int y, int x) {
	BufferedImage imagem = loadImage("imagens/maca.gif");
	g.drawImage(imagem, x*scale, y*scale, scale, scale, Color.black, this);
}

private void desenharLimao(Graphics g, int y, int x) {
	BufferedImage imagem = loadImage("imagens/limao.gif");
	g.drawImage(imagem, x*scale, y*scale, scale, scale, Color.black, this);
}

private void desenharChao(Graphics g, int y, int x) {
	g.setColor(Color.black);
	g.fillRect(x*scale, y*scale, scale, scale);
}

private void desenharCobra(Graphics g, int y, int x) {
	g.setColor(Color.yellow);
	g.fillRect(x*scale, y*scale, scale-1, scale-1);
}

private void desenharMuro(Graphics g, int y, int x) {
	g.setColor(Color.red);
	g.fillRect(x*scale, y*scale, scale-1, scale-1);
}

public void game() {
	while (isVisible()) {
		if (!mover_cobra()) {
			if (vida != 0) {
				vida--;
				carregar_nivel(nivel);
			} else {
				JOptionPane.showMessageDialog(null, "GameOver");
				return;
			}
		}
		paint(getGraphics());
		try {
			Thread.sleep(speed);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

public void keyPressed(KeyEvent e) {
	switch (e.getKeyCode()) {
		case KeyEvent.VK_DOWN :
			if(direcao!=norte)direcao = sul;
			break;
		case KeyEvent.VK_UP :
			if(direcao!=sul)direcao = norte;
			break;
		case KeyEvent.VK_LEFT :
			if(direcao!=oeste)direcao = este;
			break;
		case KeyEvent.VK_RIGHT :
			if(direcao!=este) direcao = oeste;
			break;
		case KeyEvent.VK_P :
			if(pause == false)pause = true;
			else pause = false;
	}
}

public void keyReleased(KeyEvent arg0) {

}

public void keyTyped(KeyEvent arg0) {

}

public Boolean mover_cobra(){
    if(pause==false){
	body head = cobra.getFirst();
	body tail = cobra.getLast();

	switch (direcao) {
	case norte: 
	{
		body newHead = new body(head.getX(), head.getY()-1);
		if(matriz[newHead.getY()][newHead.getX()]=='w' || matriz[newHead.getY()][newHead.getX()]=='s') return false;
		cobra.addFirst(newHead);
		if (matriz[newHead.getY()][newHead.getX()] == 'T') {
			newHead.setY(38);
		}
		int c = comeu_fruta(newHead);
		if (c>0) {
			comeu(true);
			crescer+=c;
		}
		matriz[newHead.getY()][newHead.getX()] = 's';
		break;
	}
	case sul: 
	{
		body newHead = new body(head.getX(), head.getY()+1);
		if(matriz[newHead.getY()][newHead.getX()]=='w' || matriz[newHead.getY()][newHead.getX()]=='s') return false;
		cobra.addFirst(newHead);
		if (matriz[newHead.getY()][newHead.getX()] == 'T') {
			newHead.setY(1);
		}
		int c = comeu_fruta(newHead);
		if (c>0) {
			comeu(true);
			crescer+=c;
		}

		matriz[newHead.getY()][newHead.getX()] = 's';
		break;
	}
	case oeste: 
	{
		body newHead = new body(head.getX()+1, head.getY());
		if(matriz[newHead.getY()][newHead.getX()]=='w' || matriz[newHead.getY()][newHead.getX()]=='s') return false;
		cobra.addFirst(newHead);
		if (matriz[newHead.getY()][newHead.getX()] == 'T') {
			newHead.setX(1);
		}
		int c = comeu_fruta(newHead);
		if (c>0) {
			comeu(true);
			crescer+=c;
		}

		matriz[newHead.getY()][newHead.getX()] = 's';
		break;
	}
	case este: 
	{
		body newHead = new body(head.getX()-1, head.getY());
		if(matriz[newHead.getY()][newHead.getX()]=='w' || matriz[newHead.getY()][newHead.getX()]=='s') return false;
		cobra.addFirst(newHead);
		if (matriz[newHead.getY()][newHead.getX()] == 'T') {
			newHead.setX(38);
		}
		int c = comeu_fruta(newHead);
		if (c>0) {
			comeu(true);
			crescer+=c;
		}

		matriz[newHead.getY()][newHead.getX()] = 's';

		break;
	}
	}

	if (crescer==0) {
		matriz[tail.getY()][tail.getX()] = '.';
		cobra.removeLast();
	}
	else 
	crescer--;

	return true;
    }
    return true;
}

private int comeu_fruta(body newHead) {
	if (matriz[newHead.getY()][newHead.getX()]=='m'){
		eat.play();
		return 1;
		}
	else if (matriz[newHead.getY()][newHead.getX()]=='e'){
		eat.play();
		return 2;}
	else if (matriz[newHead.getY()][newHead.getX()]=='l'){
		eat.play();
		return 3;}
	else if (matriz[newHead.getY()][newHead.getX()]=='v') {
		eat.play();
		vida++;
		System.out.println("vida ->"+vida);
		return 1;
	}
	return 0;
}

private void comeu(boolean comeu){
	int i = (int) (Math.random()*5);
	if(i==1 && vida < 5){
		int x = (int) (Math.random()*width);
		int y = (int) (Math.random()*height);

		while(matriz[y][x]!='.') {
			x = (int) (Math.random()*width);
			y = (int) (Math.random()*height);
		}
		matriz[y][x] = 'v';
	}
	else if(comeu) {
		int x = (int) (Math.random()*width);
		int y = (int) (Math.random()*height);

		while(matriz[y][x]!='.') {
			x = (int) (Math.random()*width);
			y = (int) (Math.random()*height);
		}
		int c = (int) (Math.random()*comida.length());
		matriz[y][x] = comida.charAt(c);

	}
}
public void carregar_nivel(int nivel) {
	String niv = Integer.toString(nivel);

	try {
		cobra.clear();
		BufferedReader r = new BufferedReader(new FileReader("level/"+niv));
		String s;
		int y=0;
		boolean encontrado = false; 
		while ((s = r.readLine())!= null) {
			for (int x=0; x<width; x++) {
				matriz[y][x] = s.charAt(x);
				if (matriz[y][x]=='s' && !encontrado) {
					body head = new body(x,y);
					cobra.addFirst(head);
					body tail = new body(x+1, y);
					cobra.addLast(tail);
					encontrado = true;
				}
			}
			y++;
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	direcao = norte;


}

public void gerarFrutos(){
	int valor, x, y;
	String fruta= "lme";
	x = 1 + (int) (Math.random()*39);
	y = 1 + (int) (Math.random()*39);
	while (matriz[y][x]== 'w'||matriz[y][x]=='s') {
		x = 1 + (int) (Math.random()*39);
		y = 1 + (int) (Math.random()*39);
	}
	valor = 0 + (int) (Math.random()*3);
	matriz[y][x] = fruta.charAt(valor);
}

public BufferedImage loadImage(String nome) {
	URL url=null;
	try {
		url = getClass().getClassLoader().getResource(nome);
		return ImageIO.read(url);
	} catch (Exception e) {
		System.out.println("Não foi possivel carregar a imagem " + nome +" de "+url);
		System.out.println("O Erro foi : "+e.getClass().getName()+" "+e.getMessage());
		System.exit(0);
		return null;
	}
}

public static void main(String[] args) {
	Main m = new Main();
	m.game();
}

}

Share this post


Link to post
Share on other sites
Knitter

Bem, isso está um pouco confuso. Por parte...

Estás a usar a JFrame mas depois não a usas para nada, ela é que é a janela principal e o canvas devia estar na JFrame e não ser instanciado como está a ser, e nem sequer está a ser adicionado à JFrame como devia. Um elemento do tipo canvas deve existir dentro de uma janela.

Em vez de usares um elemento do tipo Canvas, devias usar um do tipo JPanel dado que estás a usar uma JFrame, que é Swing, e não deves misturar Swing com AWT que é o Canvas.

Como me faltam pedaços de código e imagens, não consigo fazer debug disso mas faz debug do código e verifica se os eventos estão a ser capturados pelo Canvas ou se estão a ser capturados pela JFrame dado que a janela pode estar a interferir nos eventos.

Share this post


Link to post
Share on other sites
Darks

Pelo que percebi em 1º lugar chamas a classe Home que em seguida pelo menu chama a classe Main que contém o jogo (e os keyListeners).

Tive de fazer algo semelhante para um jogo, mas neste caso foi um tetris e a solução que encontrei para o teu problema foi pôr os listeners na classe Home (no teu caso) e invocar os métodos com o objecto criado da classe Main.

Muito esporádicamente:

Main jogo = new Main();

On Press{

    jogo.move_left();

}

Cumps.

Share this post


Link to post
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
Sign in to follow this  

×

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.