Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Aimind

Abrir uma classe apartir de outra

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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();
}

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.