Agradecimento aos amigos do forum e Jogo 2D (vinigodoy?)

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

Alguma sugestão ??


Dei uma pesquisada no forum , e achei isso :

Aí no caso, Vinigodoy indicou este site: http://www.programadoresdejogos.com/osgames/

Aí no caso, como que eu faco para aprender com o código fonte? Posso mandar rodar com o Netbeans ou tem que ter alguma API ou engine?

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.

Você pode ler esses tutoriais:
http://pontov.com.br/site/java/47-javageral
http://pontov.com.br/site/java/48-java2d

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

Finalmente, se você realmente quiser mudar um dia de mercado, ou quiser aprender a mexer com 3D, siga os tutoriais de SDL e OpenGL. Não exigem profundo conhecimento na linguagem, e são bem interessantes, pois o resultado sai em três dimensões:
http://lazyfoo.net/SDL_tutorials/
http://pontov.com.br/site/opengl
http://pontov.com.br/site/arquitetura/54-matematica-e-fisica

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.

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.

Aí vc poderá fazer aplicações Java interativas desse tipo:
http://www.pontov.com.br/files/outros/vinigodoy/particles/particles.html

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!!

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.

[quote=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.[/quote]

Vlw Viny, ja estou estudando o chat mais simples, acho que estou entendendo, mas tenho uma dúvida aqui no final do código:

[code] private void listen(final InputStream inputStream)
{
new Thread(new Runnable() {
DataInputStream ds = new DataInputStream(inputStream);
public void run()
{
try
{
while (true)
{
int size = ds.readInt();
int cont = 0;
char[] chars = new char[size];
while (cont < size)
{
chars[cont] = ds.readChar();
cont = cont + 1;
}

                    String str = new String(chars);
                    if (str.equals(&quot;EXIT&quot;))
                    {
                        System.out.println(&quot;Conversa terminada.&quot;);
                        System.exit(0);
                    }
                    
                    System.out.println(str);
                }
            } catch (IOException e)
            {
            }
        }
    }).start();
}

}
[/code]

Por que new thread? eu li sobre isso mas eu nao consigo entender direito… è como se tivesse criando um novo objeto??

E por que no comeco tem isso aqui :

[code]if (args.length < 2)
{
System.out.println("Número inválido de argumentos!");
return;
}

    if (args[0].equals(&quot;-server&quot;))
    {
        new SimpleChat().startServer(Integer.parseInt(args[1]));
        return;
    }
    
    if (args[0].equals(&quot;-client&quot;))
    {
        new SimpleChat().startClient(args[1], Integer.parseInt(args[2]));
        return;
    }
    
    System.out.println(&quot;Argumento inválido &quot; + args[0]);
}[/code]

Equanto aguardo resposta, estou pesquisando as minhas duvidas pra ver se eu entendo…

Aguardor resposta xD

===Edit 2

Viny, tenho mais uma duvida rsrsrsrs,

aqui neste código vc usou scanNextLine… eu poderia trocar tudo por JOptionPane ou por jtextfield?

while (!line.equals("EXIT")) { Scanner scan = new Scanner(System.in);

Mt interessante o topico!

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:

java SimpleChat -server 1234

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:

java SimpleChat -client 127.0.0.1 1234

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.

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

[code]import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class SimpleChat2
{
public static void main(String[] args)
{
String hostt;
int porrt;
String portt;
String a;

  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");
      int porrt;
      porrt = Integer.parseInt(portt);
      startServer(porrt);
      //
      //non-static method startServer(int) cannot be referenced from a static context
      //
  }
  
  
}

private void startClient(String host, int port)
{
    try
    {
        Socket socket = new Socket();
        socket.connect(new InetSocketAddress(host, port));
        chat(socket);
    }
    catch (UnknownHostException e)
    {
        System.out.println("Host desconhecido");
        System.out.println("Host: " + host);
        System.out.println("Porta: " + port);
        System.exit(2);
    }
    catch (IOException e)
    {
        e.printStackTrace();
        System.exit(1);
    }
}

private void startServer(int porta) 
{
    try
    {
        ServerSocket socket = new ServerSocket(porta);
        System.out.println("Aguardando conexao...");
        Socket s = socket.accept();
        chat(s);
    } catch (IOException e)
    {
        System.out.println("Problemas na comunicação: ");
        e.printStackTrace();
        System.exit(1);
    }
}

private void chat(Socket s) throws IOException
{
    System.out.println("Conectado com " + s.getRemoteSocketAddress());
    listen(s.getInputStream());
    talk(s.getOutputStream());
}

/**
 * @param outputStream
 */
private 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();
    }
}

/**
 * @param inputStream
 */
private void listen(final InputStream inputStream)
{        
    new Thread(new Runnable() {
        DataInputStream ds = new DataInputStream(inputStream);
        public void run() 
        {                
            try
            {
                while (true)
                {
                    int size = ds.readInt();
                    int cont = 0;
                    char[] chars = new char[size];
                    while (cont < size)
                    {
                        chars[cont] = ds.readChar();
                        cont = cont + 1;
                    }
                    
                    String str = new String(chars);
                    if (str.equals("EXIT"))
                    {
                        System.out.println("Conversa terminada.");
                        System.exit(0);
                    }
                    
                    System.out.println(str);
                }
            } catch (IOException e)
            {
            }
        }
    }).start();
}

}
[/code]

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.

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”

[code]import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class SimpleChat2
{
public static void main(String[] args)
{
String hostt;
int porrt;
String portt;
String a;

  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
      //
  }
  
  
}

private static  void  startClient(String host, int port)
{
    try
    {
        Socket socket = new Socket();
        socket.connect(new InetSocketAddress(host, port));
        chat(socket);
    }
    catch (UnknownHostException e)
    {
        System.out.println("Host desconhecido");
        System.out.println("Host: " + host);
        System.out.println("Porta: " + port);
        System.exit(2);
    }
    catch (IOException e)
    {
        e.printStackTrace();
        System.exit(1);
    }
}

private static void startServer(int porta) 
{
    try
    {
        ServerSocket socket = new ServerSocket(porta);
        System.out.println("Aguardando conexao...");
        Socket s = socket.accept();
        chat(s);
    } catch (IOException e)
    {
        System.out.println("Problemas na comunicação: ");
        e.printStackTrace();
        System.exit(1);
    }
}

private void chat(Socket s) throws IOException
{
    System.out.println("Conectado com " + s.getRemoteSocketAddress());
    listen(s.getInputStream());
    talk(s.getOutputStream());
}

/**
 * @param 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();
    }
}

/**
 * @param inputStream
 */
private static  void listen(final InputStream inputStream)
{        
    new Thread(new Runnable() {
        DataInputStream ds = new DataInputStream(inputStream);
        public void run() 
        {                
            try
            {
                while (true)
                {
                    int size = ds.readInt();
                    int cont = 0;
                    char[] chars = new char[size];
                    while (cont < size)
                    {
                        chars[cont] = ds.readChar();
                        cont = cont + 1;
                    }
                    
                    String str = new String(chars);
                    if (str.equals("EXIT"))
                    {
                        System.out.println("Conversa terminada.");
                        System.exit(0);
                    }
                    
                    System.out.println(str);
                }
            } catch (IOException e)
            {
            }
        }
    }).start();
}

}
[/code]

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…

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;;

http://www.guj.com.br/articles/121
Estou lendo este tutorial agora…

===
Edit 2

“…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

Acho que deu certo… Antes de eu continuar modificando, vou postar o código aqui, pra ter certeza

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package researchuser;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.String;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class SimpleChat2
{
public static void main(String[] args)
{
String hostt = null;
int porrt;
String portt = null;
String a;
Socket socket = new Socket();

  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
      //
  }
  
  
}

private static void  startClient(String host, int port)
{
    
    
    try
    {
        Socket socket = new Socket();
        socket.connect(new InetSocketAddress(host, port));
        chat(socket);
    }
    catch (UnknownHostException e)
    {
        System.out.println("Host desconhecido");
        System.out.println("Host: " + host);
        System.out.println("Porta: " + port);
        System.exit(2);
    }
    catch (IOException e)
    {
        e.printStackTrace();
        System.exit(1);
    }
}

private static void startServer(int porta) 
{
    try
    {
        ServerSocket socket = new ServerSocket(porta);
        System.out.println("Aguardando conexao...");
        Socket s = socket.accept();
        
        chat(s);
    } catch (IOException e)
    {
        System.out.println("Problemas na comunicação: ");
        e.printStackTrace();
        System.exit(1);
    }
}

private static void chat(Socket s) throws IOException
{
    System.out.println("Conectado com " + s.getRemoteSocketAddress());
    listen(s.getInputStream());
    talk(s.getOutputStream());
}

/**
 * @param 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();
    }
}

/**
 * @param inputStream
 */
private static  void listen(final InputStream inputStream)
{        
    new Thread(new Runnable() {
        DataInputStream ds = new DataInputStream(inputStream);
        public void run() 
        {                
            try
            {
                while (true)
                {
                    int size = ds.readInt();
                    int cont = 0;
                    char[] chars = new char[size];
                    while (cont < size)
                    {
                        chars[cont] = ds.readChar();
                        cont = cont + 1;
                    }
                    
                    String str = new String(chars);
                    if (str.equals("EXIT"))
                    {
                        System.out.println("Conversa terminada.");
                        System.exit(0);
                    }
                    
                    System.out.println(str);
                }
            } catch (IOException e)
            {
            }
        }
    }).start();
}

}[/code]

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 :

“…this abstract class is the superclass of all classes representing an output stream of bytes. An output stream accepts output bytes and sends them to some sink…”
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/OutputStream.html

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

Enfim, vamos as dúvidas:

private static void chat(Socket s) throws IOException { System.out.println("Conectado com " + s.getRemoteSocketAddress()); listen(s.getInputStream()); talk(s.getOutputStream()); }

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(); } }

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:

Dê uma lida mais detalhada sobre as classes de IO e o que cada uma faz:
http://docs.oracle.com/javase/tutorial/essential/io/

Vini, ainda nao respondi este tópico pois estou pedindo ajuda de um RL meu, pois nao estou entendendo esta parte:

[code]private static void chat(Socket s) throws IOException
{
System.out.println("Conectado com " + s.getRemoteSocketAddress());
listen(s.getInputStream());
talk(s.getOutputStream());
}

/**
 * @param 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();
    }
}

/**
 * @param inputStream
 */
private static  void listen(final InputStream inputStream)
{        
    new Thread(new Runnable() {
        DataInputStream ds = new DataInputStream(inputStream);
        public void run() 
        {                
            try
            {
                while (true)
                {
                    int size = ds.readInt();
                    int cont = 0;
                    char[] chars = new char[size];
                    while (cont < size)
                    {
                        chars[cont] = ds.readChar();
                        cont = cont + 1;
                    }
                    
                    String str = new String(chars);
                    if (str.equals("EXIT"))
                    {
                        System.out.println("Conversa terminada.");
                        System.exit(0);
                    }
                    
                    System.out.println(str);
                }
            } catch (IOException e)
            {
            }
        }
    }).start();
}

}
[/code]

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

Muito Obrigado!