Agradecimento aos amigos do forum e Jogo 2D (vinigodoy?)
17 respostas
S
SirDominque
Estou fazendo este tópico pois eu consegui fazer meu programa abrir um JInternalFrame dentro do JFrame,
Consegui fazer aparecer uma imagem. Isso agora é facil, mas antes estava me matando pra conseguir;
Agora estou pensando no que aprender… Estava tentando aprender A fazer um Chat, mas ainda nao sei!!
O que eu queria mesmo era fazer algo interativo na tela, tipo, uma bola e mexer com gravidade…
Ou Aprender a Instalar uma API no netbeans… o que eu me confundo bastante!111
Black eu abri o código do genius feito pelo vini, bom está bem comentado o código, vc pode abrir ele até no notepad, o aprendizado com o código fonte seria basicamente como funciona e como aplicar o que está nele.
Diferente do tópico que você linkou, não recomendo mais Java no desenvolvimento de aplicações desse tipo. A Oracle e a Sun deixaram claro que não é um mercado de interesse para ela (abandonaram APIs importantes como a JMF e SwingX, não deram continuidade na java.sound, etc). Se você fosse fazer uma aplicação assim, hoje, seria obrigado a recorrer a bibliotecas de terceiros, e as únicas duas existentes hoje são a Slick2D (mantida por uma pessoa física) e a JMonkeyEngine (grande, mas com pouco apoio da indústria).
Uma alternativa muito similar ao Java é o C#. Além de ter o XNA, que é uma API completa para jogos e multimídia em geral, você ainda poderá portar seu código para X-Box 360 e WP7. E é uma ótima prática conhecer a linguagem concorrente da que você normalmente desenvolve, nem que seja para falar mal com propriedade (heheh): http://create.msdn.com/en-US/ http://pontov.com.br/site/xna/53-xna
Achei estranho pq o tópico tem o título de agradecimento, mas no corpo tem dúvidas, heheheh.
Se quiser só brincar de fazer jogo, mas sem necessariamente se estressar muito com o código, use a Unity. Só seguir os tutoriais do site já é uma grande diversão.
No caso do Genius for Dummies. Ele foi feito em eclipse, mas não depende de qualquer API adicional ao Java.
Ele pode ser compilado em linha de comando, ou pode ser montado no netbeans facilmente. Basta copiar os fontes lá e rodar.
V
ViniGodoy
Quase esqueço. Se quiser simular coisas como gravidade, fumaça, fogo, tiros, ou fazer movimentações convincentes, leia o tutorial de matemática, citado nos links ali e cima. Dominar o conceito de vetores é fundamental.
Vlw viny!
Vou fazer o seguinte, vou terminar aqui de fazer um aplicativo de socket, e vou tentar fazer algum jogo, bem simples…
Antes voce tinha me passado o XNA, mas achei muito complicado… eu queria fazer algo bem simples só pra comecar ou ter uma noção!!
V
ViniGodoy
Dê uma olhada nos tutoriais de XNA escritos pelo Alexandre Lobão ali no Ponto V.
Você vai ver que para fazer um pong, ele usa só umas 40 linhas de código!
Se quiser algo mais completinho e explicativo, veja os tutoriais de Pong do Kleber Andrade.
Se quiser ver um exemplo de chat simplíssimo (em linha de comando) e funcional, veja esse tópico:
Tem um outro exemplo de um chat mais complexo feito em UDP aí também.
S
SirDominque
ViniGodoy:
Dê uma olhada nos tutoriais de XNA escritos pelo Alexandre Lobão ali no Ponto V.
Você vai ver que para fazer um pong, ele usa só umas 40 linhas de código!
Se quiser algo mais completinho e explicativo, veja os tutoriais de Pong do Kleber Andrade.
Cada thread representa um trecho do seu programa em execução. Todo programa começa já com uma thread, chamada main thread, que é onde o código executa.
Quando crio uma nova thread, passo a ter dois códigos rodando ao mesmo tempo. Isso porque o programa precisa ler o que vem do socket, ao mesmo tempo que aguarda as mensagens do usuário.
Quanto ao código do começo. O programa é feito para ser executado no prompt de comando. Ali, eu testo os argumentos passados. Um dos programas será o servidor, ou seja, esperará conexões. Nesse caso, você deverá inicia-lo assim:
javaSimpleChat-server1234
Onde 1234 é o número da porta que o servidor irá escutar.
No caso do cliente, você deverá especificar o endereço do servidor. E iniciar o programa assim:
javaSimpleChat-client127.0.0.11234
Onde 127.0.0.1 é o endereço do servidor (nesse caso, a própria máquina) e 1234 é a porta.
Quanto a última dúvida, a resposta é sim.
S
SirDominque
Vlw, agora estou comecando a entender!!!!!!!
Estou mudando o código pra ver se eu consigo entender ele, mas deu um erro ... Esse erro eu ja tive com outros programas mas eu dei um jeito... aqui eu nao estou conseguindo, tem um modo correto de corrigir isso:
non-static method startClient(int) cannot be referenced from a static context
non-static method startServer(int) cannot be referenced from a static context
importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;importjavax.swing.JOptionPane;publicclassSimpleChat2{publicstaticvoidmain(String[]args){Stringhostt;intporrt;Stringportt;Stringa;a=JOptionPane.showInputDialog(null,"Iniciar Como Cliente?");if(a.equals("sim")){hostt=JOptionPane.showInputDialog(null,"Insira o host");portt=JOptionPane.showInputDialog(null,"Insira a porta");porrt=Integer.parseInt(portt);startClient(hostt,porrt);//non-static method startClient(int) cannot be referenced from a static context }else{portt=JOptionPane.showInputDialog(null,"Insira a porta");intporrt;porrt=Integer.parseInt(portt);startServer(porrt);////non-static method startServer(int) cannot be referenced from a static context//}}privatevoidstartClient(Stringhost,intport){try{Socketsocket=newSocket();socket.connect(newInetSocketAddress(host,port));chat(socket);}catch(UnknownHostExceptione){System.out.println("Host desconhecido");System.out.println("Host: "+host);System.out.println("Porta: "+port);System.exit(2);}catch(IOExceptione){e.printStackTrace();System.exit(1);}}privatevoidstartServer(intporta){try{ServerSocketsocket=newServerSocket(porta);System.out.println("Aguardando conexao...");Sockets=socket.accept();chat(s);}catch(IOExceptione){System.out.println("Problemas na comunicação: ");e.printStackTrace();System.exit(1);}}privatevoidchat(Sockets)throwsIOException{System.out.println("Conectado com "+s.getRemoteSocketAddress());listen(s.getInputStream());talk(s.getOutputStream());}/** * @param outputStream */privatevoidtalk(OutputStreamoutputStream)throwsIOException{DataOutputStreamoutput=newDataOutputStream(outputStream);Stringline="";while(!line.equals("EXIT")){Scannerscan=newScanner(System.in);System.out.print(": ");line=scan.nextLine();output.writeInt(line.length());for(charch:line.toCharArray())output.writeChar(ch);output.flush();}}/** * @param inputStream */privatevoidlisten(finalInputStreaminputStream){newThread(newRunnable(){DataInputStreamds=newDataInputStream(inputStream);publicvoidrun(){try{while(true){intsize=ds.readInt();intcont=0;char[]chars=newchar[size];while(cont<size){chars[cont]=ds.readChar();cont=cont+1;}Stringstr=newString(chars);if(str.equals("EXIT")){System.out.println("Conversa terminada.");System.exit(0);}System.out.println(str);}}catch(IOExceptione){}}}).start();}}
V
ViniGodoy
Você não pode chamar um método não estático a partir de um estático, sem uma instância do objeto.
Esse é um conceito extremamente básico da linguagem, seria bom você revisar o conceito de objeto e método estático antes de tentar alçar voos mais altos.
S
SirDominque
Ahh sim, é porque na verdade, quando eu coloco static em tudo.. comeca dar erros de métodos nao estáticos de dentro do java, tipo esse:
"non static method chat (java.net.socket) cannot be referenced from a static context"
importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;importjavax.swing.JOptionPane;publicclassSimpleChat2{publicstaticvoidmain(String[]args){Stringhostt;intporrt;Stringportt;Stringa;a=JOptionPane.showInputDialog(null,"Iniciar Como Cliente?");if(a.equals("sim")){hostt=JOptionPane.showInputDialog(null,"Insira o host");portt=JOptionPane.showInputDialog(null,"Insira a porta");porrt=Integer.parseInt(portt);startClient(hostt,porrt);//non-static method startClient(int) cannot be referenced from a static context }else{portt=JOptionPane.showInputDialog(null,"Insira a porta");porrt=Integer.parseInt(portt);startServer(porrt);////non-static method startServer(int) cannot be referenced from a static context//}}privatestaticvoidstartClient(Stringhost,intport){try{Socketsocket=newSocket();socket.connect(newInetSocketAddress(host,port));chat(socket);}catch(UnknownHostExceptione){System.out.println("Host desconhecido");System.out.println("Host: "+host);System.out.println("Porta: "+port);System.exit(2);}catch(IOExceptione){e.printStackTrace();System.exit(1);}}privatestaticvoidstartServer(intporta){try{ServerSocketsocket=newServerSocket(porta);System.out.println("Aguardando conexao...");Sockets=socket.accept();chat(s);}catch(IOExceptione){System.out.println("Problemas na comunicação: ");e.printStackTrace();System.exit(1);}}privatevoidchat(Sockets)throwsIOException{System.out.println("Conectado com "+s.getRemoteSocketAddress());listen(s.getInputStream());talk(s.getOutputStream());}/** * @param outputStream */privatestaticvoidtalk(OutputStreamoutputStream)throwsIOException{DataOutputStreamoutput=newDataOutputStream(outputStream);Stringline="";while(!line.equals("EXIT")){Scannerscan=newScanner(System.in);System.out.print(": ");line=scan.nextLine();output.writeInt(line.length());for(charch:line.toCharArray())output.writeChar(ch);output.flush();}}/** * @param inputStream */privatestaticvoidlisten(finalInputStreaminputStream){newThread(newRunnable(){DataInputStreamds=newDataInputStream(inputStream);publicvoidrun(){try{while(true){intsize=ds.readInt();intcont=0;char[]chars=newchar[size];while(cont<size){chars[cont]=ds.readChar();cont=cont+1;}Stringstr=newString(chars);if(str.equals("EXIT")){System.out.println("Conversa terminada.");System.exit(0);}System.out.println(str);}}catch(IOExceptione){}}}).start();}}
V
ViniGodoy
Por isso mesmo é hora de voltar ao básico. Você não deveria “colocar static em tudo”.
Num programa, statics são exceção, não regra.
Você dificilmente concluirá um chat ou um game se ainda não sabe diferenciar um método estático de um não estático.
Não adianta tentar nadar se vc nem sequer aprendeu a bater os braços…
S
SirDominque
Entendi… Vou dar uma pesquisada então, sabe algum tutorial ? Vou tentar achar aqui no meu livro de Java com BlueJ, mas nao sei se tem!
Então, pq meu prof disse que estático é pq ele ja esta pronto pra uso desde o inicio do programa… e o nao estático nao esta;;
“…Caso seja necessário acessar algum método ou membro não-static, é necessário criar uma instância da classe e então chamar o que quiser…”
“…Já o contrario é um pouco diferente: dentro de membros não-static, é possível acessar tanto propriedades static quanto as não-static…”
vou tentar mexer no programa de novo
S
SirDominque
Acho que deu certo... Antes de eu continuar modificando, vou postar o código aqui, pra ter certeza
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packageresearchuser;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.lang.String;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;importjavax.swing.JOptionPane;publicclassSimpleChat2{publicstaticvoidmain(String[]args){Stringhostt=null;intporrt;Stringportt=null;Stringa;Socketsocket=newSocket();a=JOptionPane.showInputDialog(null,"Iniciar Como Cliente?");if(a.equals("sim")){hostt=JOptionPane.showInputDialog(null,"Insira o host");portt=JOptionPane.showInputDialog(null,"Insira a porta");porrt=Integer.parseInt(portt);startClient(hostt,porrt);//non-static method startClient(int) cannot be referenced from a static context }else{portt=JOptionPane.showInputDialog(null,"Insira a porta");porrt=Integer.parseInt(portt);startServer(porrt);////non-static method startServer(int) cannot be referenced from a static context//}}privatestaticvoidstartClient(Stringhost,intport){try{Socketsocket=newSocket();socket.connect(newInetSocketAddress(host,port));chat(socket);}catch(UnknownHostExceptione){System.out.println("Host desconhecido");System.out.println("Host: "+host);System.out.println("Porta: "+port);System.exit(2);}catch(IOExceptione){e.printStackTrace();System.exit(1);}}privatestaticvoidstartServer(intporta){try{ServerSocketsocket=newServerSocket(porta);System.out.println("Aguardando conexao...");Sockets=socket.accept();chat(s);}catch(IOExceptione){System.out.println("Problemas na comunicação: ");e.printStackTrace();System.exit(1);}}privatestaticvoidchat(Sockets)throwsIOException{System.out.println("Conectado com "+s.getRemoteSocketAddress());listen(s.getInputStream());talk(s.getOutputStream());}/** * @param outputStream */privatestaticvoidtalk(OutputStreamoutputStream)throwsIOException{DataOutputStreamoutput=newDataOutputStream(outputStream);Stringline="";while(!line.equals("EXIT")){Scannerscan=newScanner(System.in);System.out.print(": ");line=scan.nextLine();output.writeInt(line.length());for(charch:line.toCharArray())output.writeChar(ch);output.flush();}}/** * @param inputStream */privatestaticvoidlisten(finalInputStreaminputStream){newThread(newRunnable(){DataInputStreamds=newDataInputStream(inputStream);publicvoidrun(){try{while(true){intsize=ds.readInt();intcont=0;char[]chars=newchar[size];while(cont<size){chars[cont]=ds.readChar();cont=cont+1;}Stringstr=newString(chars);if(str.equals("EXIT")){System.out.println("Conversa terminada.");System.exit(0);}System.out.println(str);}}catch(IOExceptione){}}}).start();}}
Voces podem dar uma olhada pra mim? !!! obrigado!!!
---Edit
Então gente, consegui abrir meu server localhost e me conectar a ele..
Agora vou tentar fazer algum esquema pra fazer um textfield e textarea para um chat , que pelo código , acho que só funciona para 2 pessoas!(?)
Enfim, só estou com algumas dúvidas com alguns métodos e com outputstream :
Vou deixar este post assim, pois alguem pode querer usar este código,, vou fazer um novo reply para minhas dúvidas.. senao fica muito misturado meu post
Pelo que eu entendi, eu vou chamar este método com o socket ao qual estou conectado, e e ele vai chamar o método listen para receber as mensagens e o método talk para
transmitir as mensagens… correto?
1º O listen deveria estar em while?Pois no caso, enquanto o chat estiver ativo as mensagens serao transmitidas, correto ?
2º O método talk pede “OutputStream outputStream” como parametro… então no caso, se eu criar um método , por exemplo, um jOptionPane.showInputdialog, ele deverá ter este objeto, e com este objeto é que eu vou transmitir os dados?Porém , ainda estou confuso, porque o método talk pede outputstream como parametro e logo
em seguida ele cria um new outputstream…
private static void talk(OutputStream outputStream) throws IOException
{
DataOutputStream output = new DataOutputStream(outputStream);
String line = "";
while (!line.equals("EXIT"))
{
Scanner scan = new Scanner(System.in);
System.out.print(": ");
line = scan.nextLine();
output.writeInt(line.length());
for (char ch : line.toCharArray())
output.writeChar(ch);
output.flush();
}
}
V
ViniGodoy
Ele cria um DataOutputStream que será usado para enviar mensagens ao outputstream recebido como parâmetro.
Os Streams no java usam o padrão decorator:
Então vou deixar o tópico morto por enquanto porque isso aqui iria dar muito trabalho para voce explicar pelo forum. E também não é justo eu ficar enchendo o saco rsrsrsrsrsrs