Ponto V!

Home Java Java 2D Uma visão rápida sobre o Java 2D
Vinícius Godoy de Mendonça
Uma visão rápida sobre o Java 2DImprimir
Escrito por Vinícius Godoy de Mendonça

O Java 2D é uma API extensa e poderosa. Ele faz parte do JDK padrão, e inclui diversos tipos de funções para desenhar diretamente na tela, desenhar texto, manipular imagens e utilizar a impressora. Nesse artigo, vamos conhecer um pouco da terminologia básica do Java 2D, e ver de maneira resumida suas funcionalidades.

Introdução

O Java 2D é implementado como uma extensão do Abstract Window Toolkit (AWT). Ele tornou-se muito poderoso depois da adição de outra extensão: o Swing. Inicialmente, os projetistas da AWT delegavam a tarefa de desenhar janelas, botões e caixas de texto ao sistema operacional. Mas logo perceberam que isso não era muito portável, e limitava severamente a performance do Java em aplicações mais sérias. Então, decidiram associar a AWT uma nova extensão, chamada Swing, que desenharia integralmente todos os componentes de tela. Ao fazer isso, a biblioteca Java 2D ganhou grande importância.

O Swing rapidamente tornou-se o padrão do Java para todo o tipo de aplicação desktop. Entretanto, uma de suas grandes reclamações sempre foi a performance, o que motivou os desenvolvedores da Sun a investir em otimizações agressivas no Java 2D. Entre elas, está a aceleração de hardware (integrada com OpenGL), possibilidade de trabalhar em modo janela exclusivo (FSEM), otimizações agressivas na biblioteca de manipulação de imagens, entre outras coisas.

Dentre as principais capacidades do Java 2D, podemos citar:

  • Um modelo uniforme de desenho para dispositivos de vídeo e impressoras;
  • Um grande número de primitivas geométricas (retângulos, elipses, curvas), e um mecanismo para se desenhar qualquer forma geométrica;
  • Mecanismos para detectar colisão em texto e imagens;
  • Modelos de composição (Alpha Composition), que permitem escolher como combinar imagens que se interceptam;
  • Modelo de cores avançado;
  • Diretivas para controlar a qualidade do desenho;
  • Classes para manipulação uniforme dos principais formatos de imagem;

Desenho com Java 2D

Espaço de coordenadas

Coordenadas do Java 2DO Java 2D permite o trabalho em dois tipos de sistemas de coordenadas. As coordenadas do dispositivo e as coordenadas de usuário. As coordenadas do dispositivo se referem ao sistema do hardware que está sendo trabalhado. Vão alterar de acordo com a resolução de tela, ou o tamanho da folha, por exemplo.

Já as coordenadas do usuário são um sistema lógico, usado pelo seu programa. Elas são uniformes e independentes de dispositivo, é o próprio Java 2D que se encarrega da conversão de um sistema para outro.

O sistema de coordenadas da aplicação inicialmente considera a coordenada (0,0) como o canto superior esquerdo da área de desenho. As coordenadas serão sempre crescentes, com x crescendo para direita e y para baixo. Na realidade, o Java 2D permite que essas coordenadas sejam alteradas à vontade, permitindo a criação de diversos sistemas coordenados próprios, dentro da aplicação.

O contexto gráfico

Todo desenho no Java 2D é feito através da classe Graphics2D. Essa classe. que deriva da classe Graphics, representa o contexto gráfico sobre o qual o desenho será feito. Por isso, a classe guarda informações como cor será aplicada sobre a pintura, que tipo de borda o desenho terá ou qual será a fonte utilizada no texto, entre outras coisas.

Normalmente, uma aplicação é formada não por uma só imagem, mas por várias. Seria extremamente trabalhoso garantir que uma alteração no feita em uma imagem não interferisse em outra. Por exemplo, ao desenhar o fantasminha azul acima, você poderia definir no Graphics que ele deveria usar 80% de transparência. Entretanto, se você esquecer de desfazer essa definição, o pacman, que será desenhado logo em seguida, poderia ficar transparente também. Para contornar esse problema, os projetistas do Java 2D criaram uma forma de copiar o contexto gráfico. Isso permite que você trabalhe sobre uma cópia, faça as modificações necessárias para pintar a imagem, e descarte essa cópia ao final da pintura, deixando o contexto gráfico original inalterado.

/** Método paint do fantasma */
public void paint(Graphics g) {
   //1. Copiamos o contexto gráfico
   Graphics2D g2d = (Graphics2D) g.create();

   //2. Desenhamos o fantasma 80% transparente
   AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8);
   g2d.setComposite(alpha); 
   g2d.drawImage(x, y, phantomImage, null);

   //3. Descartamos a cópia do contexto gráfico
   g2d.dispose();
}

Uma confusão comum feita pelos iniciantes em Java 2D é pensar que a classe Graphics representa a superfície de desenho em si. Isso não é verdade. Ela só representa o estado exato em que será feita a pintura. Por isso, copiar esse contexto como sugerido acima é uma operação extremamente eficiente e barata. Assim como descarta-lo ao final da pintura não destruirá o desenho. De fato, isso nos leva a primeira regra de ouro ao desenhar em Java 2D:

“Jamais altere o estado do objeto Graphics recebido como parâmetro nas funções de pintura”.

Caso contrário, o Swing poderá usar esse objeto na hora de desenhar partes de sua janela, e você poderá obter efeitos muito estranhos, diferentes do esperado e difíceis de corrigir.

Dentre os estados no interior da classe Graphics2D, podemos citar:

  • A largura que as bordas de uma figura são desenhadas (Pen, Stroke);
  • Como duas bordas se conectam;
  • A área, não necessariamente retangular, em que o desenho será realizado (Clipping path);
  • Transformações de translação, rotação, escala e shear (AffineTransform);
  • Cores e padrões de pintura;
  • Composições entre múltiplos objetos (Composite);

Entretanto, a classe Graphics2D não guarda somente estados, mas também provê métodos para realizar a pintura em si. E isso nos leva ao próximo tópico.

Primitivas geométricas

As primitivas geométricas do Java 2D são: pontos, linhas, retângulos, arcos e elipses e curvas. As classes que lidam com cada uma dessas geometrias são definidas no pacote java.awt.geom. Por questões de performance e conveniência, o objeto Graphics também fornece métodos para a pintura direta dessas primitivas, sem a necessidade de criação de um objeto. Além dessas, o Java 2D fornece uma classe chamada GeneralPath, que permite a criação de formas arbitrárias, baseadas em linhas e curvas de Bézier.

Primitivas geométricas

As classes de primitivas também fornecem diversos métodos bastante práticos, como distância entre dois pontos (Point2D), área de figuras sólidas, teste se um ponto está contido em uma determinada forma, etc. O Java ainda fornece a classe Area, que permite realizar operações comuns como interseção ou subtração de duas formas.

Texto

O Java 2D fornece diversas classes para trabalhar com texto. Embora a forma mais direta e mais comumente usada seja simplesmente chamar os métodos setFont e drawString da classe Graphics, a API fornece classes auxiliares, que facilitam recursos mais avançados, como o posicionamento do texto. Essas classes, são parte do pacote java.awt.Font.

Chamamos de Glyph a forma usada para representar um caractere dentro de uma fonte. Um caractere de texto real pode ser formado por uma combinação de dois glyphs, como é o caso da maior parte das letras acentuadas. Da mesma forma, podem haver Glyphs que representam o desenho de mais de um caractere, como esse aqui o do símbolo de peseta: ₧

Uma fonte, é portanto, um conjunto de Glyphs, com o mesmo estilo artístico. Essa fonte pode ter uma série de variações, como itálico ou negrito, e essas variações são chamadas de faces. O conjunto de todas as faces de uma fonte é chamada de família. Podemos questionar o Java sobre diversas propriedades da fonte em questão, tais como altura, largura e outras métricas. Essas propriedades são encapsuladas na classe FontMetrics.

Antes do texto ser exibido, entretanto, ele deve ser formatado. Quem realiza essa tarefa é a classe TextLayout. Ela fornece métodos para lidar com fontes misturadas, idiomas diferentes e texto bidirecional. Caso você queira um controle ainda mais refinado sobre as opções de layout, o Java 2D fornece uma classe de mais baixo nível, chamada GlyphVector.

Imagens

Por último, mas não menos importante, o Java 2D fornece diversos recursos para a manipulação de imagens. O primeiro recurso interessante é certamente uma classe que permite a carga e escrita de diversos tipos de imagem de maneira uniforme, chamada ImageIO.

As imagens representadas pela classe BufferedImage. Um dos recursos mais interessantes do Java 2D, é que podemos requisitar o objeto Graphics de qualquer imagem, e realizar pintura ou escrever texto sobre imagens da mesma forma que fazemos para desenhar os componentes de tela.

O Java ainda suporta filtros sobre imagens, através da classe BufferedImageOp. Alguns sites de terceiros, como o jhlabs, já tem diversos desses filtros implementados, o que pode adicionar efeitos bastante interessantes aos jogos.

Por fim, o Java permite ainda a manipulação direta e eficiente dos pixels de uma imagem, através de suas definições, contidas na classe Raster. Essa manipulação avançada é geralmente necessária apenas para quem vai trabalhar com aplicações que geram filtros diretamente e, se esse é o seu caso, pode ser interessante consultar o tutorial “Using Rasters for Image Processing”, do Java Boutique. Fique atento, pois o tutorial também tem uma segunda parte.

Infelizmente, a biblioteca Java2D cobre bem apenas imagens formadas por mapas de bits. Para imagens vetoriais, é necessário utilizar bibliotecas de terceiros.

Conclusões

Nesse artigo, vimos rapidamente os recursos do Java 2D, e conhecemos a terminologia básica da maior parte de seus componentes. Deixamos de fora somente a parte de impressão, menos importante para jogos. Embora ainda não possamos desenhar nada, já podemos ter uma boa noção do quão poderosa a biblioteca é. Mais importante, aprendemos a terminologia do Java 2D, associada ao nome de diversas de suas principais classes.


Comentários (48)
  • Matruskan  - AntiAliasing
    avatar

    Uma das melhores coisas que descobri com o Java2D foi o AntiAliasing. Ele deixa as linhas muito mais suaves e atraentes.

    Código:
    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIAS ING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALU E_ANTIALIAS_ON);
  • Vinícius Godoy de Mendonça
    avatar

    Sem dúvida. Só tem que tomar cuidado porque anti-aliasing consome um bocado de recursos.

    Caso você vá repetir o mesmo desenho várias vezes, pode ser uma boa desenhar sobre uma BufferedImage, e só processar a pintura em si uma única vez. :)

  • Bruno Daniel Marinho  - Bem Objetivo
    avatar

    Bem explicativo o artigo interesante a parte de manipulação de imagens, que acho que seria o que mais usamos nos jogos.

  • Anônimo
    avatar

    eu acharia melhor, se tivesse o exemplo completo de como funciona o paint. e até se possivel o download da imagem. nao consegui importar a classe AlphaComposite. ? meu java está defasado, será?

  • Vinícius Godoy de Mendonça
    avatar

    Já viu o próximo tutorial desse site? Ele mostra como desenhar uma figura usando GereralPath, e também usa o paint com degradée.

    Talvez seja uma boa atualizar o seu Java. Todos os exemplos são compatíveis com Java 5 ou superior.

  • Cesar  - Duvida sobre a biblioteca a usar
    avatar

    Eu vou fazer o meu projecto final de curso e estava a pensar em fazer uma especie de paint mas com algumas ferramentas mais avançadas. Mas não estou familiarizado com o java 2d eu nao sei como começar. Podia me ajudar?

  • Vinícius Godoy de Mendonça  - Java 2D
    avatar

    Sim, comece lendo os tutoriais do site.

    Agora, para fazer um paint assim, não basta só dominar o Java 2D, como vc faria para jogos. A forma mais eficiente é criar componentes do Swing.

    Estude os tutoriais e poste dúvidas no GUJ:
    http://www.guj.com.br

  • Fernando Amado  - Dúvida para desenvolvimento de Game
    avatar

    olá Vinícius,

    Cara, falam muito de vc no Guj... hehehhe, agora estou vendo que vc é o cara dos games mesmo :cheer:

    Estou querendo um norte, para começar a desenvolver um game. É um game estilo Magic the Gathering, ele tem um versão online tb, tem um video aki no youtube que mostra como ele é (se puder dara uma olhada, caso nao conheça o game, e me ajudar ficaria grato) http://www.youtube.com/watch?v=5K87-47ec-0

    Você acha que esse tipo de gráfico e possivel criar somente com o Java2D?:

    Desde já, muito obrigado e parabéns pelos artigos...

    Abraços...

  • Vinícius Godoy de Mendonça  - Java 2D
    avatar

    Me parece perfeitamente possível fazer um jogo com esses gráficos (e até melhores que esses) no Java 2D. Não vi nada demais.

    Esse game você vai desenvolver para que? Curiosidade? Trabalho de graduação? Ou pra tentar vender mesmo? E onde vc pretende que rode? Celular, PC ou num applet?

  • Fernando Amado
    avatar

    Oba que bom, já fiquei mais empolgado(espero nao estar errado, pois nao sei se é mais dificil mexer com Java2D do que com outras tecnologias).

    Primeiramente, sou um fanático e adepto ao jogo de Trade Card Game, e é lógico, caso de certo, gostaria de utiliza-lo para ter retorno de investimento com o mesmo, pois já estou colocando tudo no papel, como seria o jogo, um esquema do mesmo.

    O jogo seria Online (esse jogo do link que te passei, vocÊ baixa um executável do jogo, e ele faz o download do restante dos componentes, uns 700MB mais ou menos, grandinho né, mas nao sei se ao baixar esse executável, vem por exemplo, todas as cartas do jogo, pois algumas cartas vc ganha ao começar, outras vc tem que comprar, e ah mais de 5000 cartas diferentes em todo o jogo, creio eu que nao venha, pois se nao, alguem dariaum jeitinho de pega-lás. Então, teria que ser Online. E que roda-se no PC.

    Andei pesquisando, e surgiu o JSP, Servelet, Flex, Hibernate, Mysql entre outras, essas foram o que o pessoal mais comentou, alguns disseram tb do uso de algum FrameWork como: Work... nao me lembro direito.

    Procurei algo semelhante de exemplo, mas nao encontrei. tem alguns sites na web com jogos parecidos, como por exemplo: Urban Rivals, mas na minha opiniõa o jogo é horrível, mas tentei descobrir onde ele foi desenvolvido.

    É isso... Ah, o login no caso do jogo do video, é realizado diretamente na tela do jogo, e nao via um site por exemplo, como na maioria dos outros, isso pra mim hj é indiferente, mas também gostaria de saber a sua opnião sobre o mesmo, se possível.

    Abraços... e muito obrigado pela resposta e atenção.

  • Vinícius Godoy de Mendonça
    avatar

    Você tem várias possibilidades. Para o backend, é uma boa fazer o servidor com Java, já que você já conhece a linguagem.

    O JSF não é o caso para o jogo em si. Se você tiver um site onde o jogador poderá comprar cartas e negociar com outros jogadores, aí sim, você faz esse site em JSF.

    Hibernate e MySQL são opções de persistência interessantes (e bem clássicas também). Outra opção de banco seria o PostGre SQL.

    Agora, para o lado do cliente, seria interessante avaliar se o Java é mesmo a melhor opção. O flash geralmente é mais fácil de instalar e de programar, e tem recursos ótimos para fazer jogos 2D.

    Acho o esquema do jogador só baixar as cartas que comprar muito bom. Assim você fica com um executável leve e rápido e pulveriza o tempo de download da carta. A informação da carta não deve exceder mais de 100kb, incluindo a imagem, então, não seria muito trabalhoso para o jogador baixá-la. E você ainda tem a vantagem de poder expandir o número de cartas com o tempo, bastando programar do lado do servidor.

    Organize o lado do cliente para salvar em disco as cartas e não baixa-las novamente.

  • Anônimo
    avatar

    Vi que vc nesse link: http://www.guj.com.br/posts/list/107625.java , indicou ao usuário que utiliza-se Swing e Java2D para criar um jogo de baralho. Pelo que andei lendo, Swing cria dll´s, então nao é legal utiliza-lo para jogos web, pois se não funcionaria somente em windows. Estou certo ou equivocado quanto a isso?

  • matruskan
    avatar

    Desde quando Swing cria DLLs? xD

  • Bruno Daniel Marinho  - hehe
    avatar

    Fernando Amado, eu tinha a mesma ideia de fazer um TCG so que de pokemon exatamente pelos mesmos motivos cartas muito caras ngm com tempo de ir na casa do outro pra jogar e talz...mais dei uma parada agora para estudar outras coisas... o que estava resolvendo para min e me ajudando é formar uma equipe de pessoas que gostão do jogo mais que não nescessariamente sabem programar para poder ripar imagens das cartas etc...

  • Anônimo
    avatar

    matruskan,

    É verdade, fui verificar outro tópico e vi que Swing nao cria dll's, é uma outra forma de criar componentes que cria dll's. :)

    Bruno Daniel Marinho,

    Então, gostar do que irá fazer já é um inicio muito melhor, hehehehe, mas assim, nao quero copiar as cartas de Magic The Gathering, por exemplo, quero criar as minhas príprias cartas, mecânicas de jogo, e etc. Isso já estou meio que desenvolvendo. Mas valeu ai pela dica.

    Vinícius Godoy de Mendonça ,

    Mais uma coisinha, se puder responder, há um jeito de criar o jogo, para ser jogado online e também colocá-lo nas app do Orkut, por exemplo?

    Abraços e obrigado a todos!

  • Vinícius Godoy de Mendonça
    avatar

    Se você quiser fazer parte das apps do Orkut, tem que entrar no site da google e ver as restrições e exigências deles.

    Não sei se eles integram com java applets. Os jogos que vi lá até hoje são feitos em flash + actionscript.

    E... realmente, o Swing não cria dlls.

  • Fernando Amado
    avatar

    Ah, esse Anônimo ai em cima sou eu... hauhauhau .. todos eles !!! B)

    Abraços...

  • Luis
    avatar

    Eu comecei a estudar java há um ano, acho uma linguagem muito legal.
    Eu pretendo fazer alguns jogos em java, mais não sei por onde começo, o que preciso estudar primeiro?
    E como está o mercado para jogos para celular? é possível uma empresa pequena, bem pequena, sobreviver no mercado de games para celular?

    obrigado e muito boa matéria :)

  • Vinícius Godoy de Mendonça
    avatar

    Se você não sabe muito bem de Java, comece dando uma olhada nos livros indicados em nosso roadmap:
    http://www.pontov.com.br/site/index.php/java/47-javageral/89-roadmap-j ava

    Continue seguindo os tutoriais desse site. Outra boa fonte é o livro Killer Game Programming in Java, que pode ser lido gratuitamente no site do autor: http://fivedots.coe.psu.ac.th/~ad/jg/

    E o livro do Dave Brackeen, Developing Games in Java.


    Quanto a empresa. Isso depende mais de capacidade administrativa do que de programação em si. Mas é possível sim, uma empresa sobreviver fazendo games desse tipo. É uma boa também estudar a tecnologia similar da moda, o Android.

  • Luis  - re:
    avatar

    Eu já olhei os livros indicados, já estudei algumas apostilas da Caelum, obrigado pelas dicas

  • Moacir Assoni
    avatar

    Com graphics2D é possível rotacionar um JLabel ?

  • Vinícius Godoy de Mendonça
    avatar

    Não seria tão fácil rotacionar um JLabel em si, e manter o comportamento consistente. Você teria que criar um componente filho do JLabel, e tratar coisas como o novo tamanho do componente, após a rotação.

    Agora, você pode usar Java 2D para desenhar texto com efeitos muito facilmente. Rotação seria só um deles, e o mais fácil. Veja esse tutorial da Sun, com mais opções:
    http://java.sun.com/developer/onlineTraining/Media/2DText/style.html

  • Mel  - Jhlabs
    avatar

    Viny! Oi, td bem? ^^

    Eu entrei nesse JHlabs pra ver uns efeitos de transição e talz, mas não sei se é meu pc ou se é o site, não consigo "executar" a applet pra ver o efeito... alguma outra sugestão de onde olhar? E sugestão de como fazer?

    Valeu, cara!

    PS: tava dando uma olhada nos seus jogos, muito maneiro! *viciada* (Jogo no pc desde o meu primeiro pc - 5 ou 6 anos... XD )

  • Vinícius Godoy de Mendonça  - Filtros
    avatar

    Oi Mel.

    Há muitos anos, usei em uma aplicação. Ele é bem fiel as fotos que ele mesmo postou no início do site.

    É muito simples usá-los no java. Basta carregar a Buffered e aplica-las nele. Poucos filtros pedem parâmetros adicionais.

  • Mel  - Buffered?
    avatar

    Hum...legal ^^"

    Mas só uma dúvida *noob em java* que é Buffered?

  • Vinícius Godoy de Mendonça
    avatar

    Era a BufferedImage. A palavra Buffered significa "em memória".

  • Diogo
    avatar

    Sou novo em java, porem tenho muito interesse em aprender, mas nao consigo montar nem uma reta, voces podem me indicar algum lugar pra eu aprender e que seja bem basico?

    Obrigado

  • Vinícius Godoy de Mendonça
    avatar

    Oi. Esses tutoriais são bem básicos em Java 2D. Mas talvez o ideal seja você começar estudando o Java antes.

    Comece visitando o GUJ e lendo a apostila de Java Básico da Caelum. Quando sentir mais familiaridade com a linguagem, volte até aqui. ;)

  • JAlexsandro
    avatar

    Estou tentando implementar um jogo, consigo caregar a imagem para o Jlabel, porém quando eu minimizo e maxmizo a aplicação o Jlabel volta a ficar vazio, o que estou fazendo de errado?

    BufferedImage imagem = ImageIO.read( new File("img.png";));

    inst.inserirSimbolo(jLabel3.getGraphics(), X, Y);

    public void inserirSimbolo(Graphics g,Integer x, Integer y){
    Graphics2D q2d = (Graphics2D)g.create();
    q2d.drawImage(imagem, x , y , null);
    q2d.dispose();
    }

  • Vinícius Godoy de Mendonça  - Repaint
    avatar

    Você deve sobrescrever apenas o método paintComponent ou, no caso do JFrame e demais janelas, o método paint. São eles que são chamados sempre que o componente tiver que ser redesenhado (seja por ter sido apagado ao minimizar, ou pelo repaint() ter sido chamado explicitamente).

    Que tipo de jogo você está fazendo? A menos que seja um jogo muito estático, como jogo da memória ou campo minado, o ideal é não usar componentes do Swing como o JLabel, e ficar apenas no Java 2D puro, como ensinam os tutoriais do nosso site.

  • JAlexsandro
    avatar

    Muito obrigado, sua dica foi de suma importância para meu projeto, que é um jogo da velha, uma classe controla a lógica do jogo e armazena as informações em uma matriz, outra classe sobrescreve o método paint e redesenha a tela todas as vezes que há interação como usuário.

  • weslley lopes
    avatar

    Eu queria saber se você poderia falar sobre a biblioteca LWJGL, quais são as vantagens e as desvantagens dessa biblioteca, se não for pedir muito por favor me indique site ou tutoriais em relação a essa biblioteca.
    Em relação ao material que você postou esta excelente.
    Obrigado pela atenção.

  • Vinícius Godoy de Mendonça
    avatar

    A LWJGL é um binding direto para algumas APIs comuns:
    - OpenGL - Temos um tutorial extenso dela aqui no site
    - OpenAL
    - JInput

    Basicamente, é ideal se você quiser fazer aplicações 3D. Ela serve de base também para outras APIs de jogos, como a JMonkeyEngine.


    Se você quer desenvolver jogos com essas funcionalidades, dê uma olhada no C# + XNA no lugar do Java. Não só é muito produtivo, como é também baseado em DirectX e tem suporte ao X-Box.

  • Michel Pinheiro Montenegro
    avatar

    Os desenvolvedores do PontoV, programadoresdejogos e GUJ me deram muita ajuda durante estes anos, graças a isso fiz este projeto em Java.
    http://www.einformacao .com.br/parallax/
    ps: Só clicar em Video 1 para ver o 1° video demonstrativo do que a minha engine já pode fazer.

    Desenvolver em Java tem suas tranqueiras, mas da para resolver e tem seus benenficios, o importante que este trabalho esta em evolução e espero que inspire outros.

  • Jonatã Paulino'  - Trabalho de Mestrado
    avatar

    Olá Vinícius!
    Eu pretendo fazer o mestrado na área de Informática na Educação, mas não conheço muito da linguágem Java a qual eles usam na Universidade pra fazer os jogos educacionais.
    O que você me indicaria pra eu fazer um jogo educacional pra minha dissertação?
    Obrigado.

  • Vinícius Godoy de Mendonça
    avatar

    Depende. Sobre que é o jogo?

    Se for montar apenas um protótipo (o que geralmente é suficiente para uma dissertação), eu recomendo uma engine fácil, como a Flixel ou a Construct.

    Se for um game 3D, use uma engine como a Unity.


    De maneira geral não recomendo Java para jogos, a menos que você já saiba a linguagem e queira usá-la para estudos.

  • Anônimo
    avatar

    Bom, é o seguinte, você pode adicionar "corpo" a uma imagem? Por exemplo.. colisão, fricção, gravidade, ou na verdade essas propriedades são aplicadas a um molde de objeto (sprite) e a imagem é apenas para representar, não entendi bem isso aí. Fico agradecido a quem me responder. ;)

  • Vinícius Godoy de Mendonça
    avatar

    Se você usar uma engine de física, ela lhe dará as propriedades do corpo, como fricção, gravidade, posição e orientação.

    E você só desenha com o Java2D onde a engine de física te indicar.

  • Michel Pinheiro Montenegro
    avatar

    Vinícius, sobre trafego entre cliente e servidor, imaginando um ambiente de 1000 pessoas jogando simultaneamente, qual o tamanho maximo de trafego em cada informação.

    Li mais acima que a imagem não deve exceder os 100kb, tem alguma outra regra sobre ou site que fale sobre isto?

  • Vinícius Godoy de Mendonça
    avatar

    Ali eu não estava falando no sentido de uma restrição, e sim, no sentido de uma possibilidade.

    O problema, quando se tem muitos jogadores, não é tanto banda (isso é, se você estiver usando um protocolo binário e não fazendo fluxos de dados). Hoje é relativamente fácil obter muita banda de rede.

    O problema são outros recursos. Por exemplo, você teria problemas em criar 1000 threads para gerenciar 1000 sockets. Já teria que usar recursos como selectors.

    Também começa a pesar o processamento do servidor, o acesso a arquivos, etc.

  • Anônimo
    avatar

    Realmente banda esta londe de ser o problema, pois quem tem que se preocupar com 1000 jogadores é o servidor, se o servidor não tem banda para aguentar o tráfego de 1000 pessoas, então o projeto todo já não tem sentido.

    Agora em termos de código gerenciar os 1000 jogadores é bem complexo e não adianta socar HW que não resolve o problema, tem que ter um sw capaz de aguentar e isso não é trivial.

    No Erinia o pessoal sofreu um bocado com isso no servidor e no final das contas, nosso servidor suportava 1000 jogadores em uma maquina relativamente comum.

    No cliente não era simples também, pois existem todos os problemas de sincronização que temos em qualquer outro jogo multiplayer.

    T+

  • Jonata  - Vetorial
    avatar

    Opa, tudo bem Vinicus?

    Você sabe de alguma biblioteca para exibir imagem vetorial em Java Desktop? Ou você já fez isso?

    Abraço.

  • ViniGodoy  - Biblioteca
    avatar


    Oi. A Java2D é tem suporte a geração de imagens vetoriais através de comandos como drawLine, drawCircle, etc...

    Para o padrão svg, tem a batik:
    http://xmlgraphics.apache.org/batik/

  • Matheus  - UserInterface
    avatar

    Existe aluma biblioteca para a criação de interfaces através do J2D? tipo botões e tudo, mas só que personalizados, tipo como se faz no HTML?

  • Vinícius Godoy
    avatar

    Dê uma olhada no JavaFX.
    http://www.oracle.com/us/technologies/java/fx/overview/index.html

  • Matheus
    avatar

    Existe alguma maneira de carregar a partir de uma string? ao invés de um arquivo fxml eu carrego o conteúdo dele em uma string, porque eu pretendo baixar o arquivo de um servidor e montar a tela.

  • Mauro  - Livros
    avatar

    Olá, alguem pode sugerir livros para aprender JAVA2D Graphics, de preferencia em lingua portuguesa

  • Leonardo
    avatar

    tenho um código porém a imagem perde qualidade, e tamanho. como posso resolver como modificar para não perder qualidade.?

    FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl";);

    Buffer buffer = fgc.grabFrame();
    BufferToImage bti = new BufferToImage((VideoFormat) buffer.getFormat());

    Image image = bti.createImage(buffer);
    Image image1 = bti.createImage(buffer);

    BufferedImage imageresize = new BufferedImage(600, 450, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = imageresize.createGraphics();


    g2d.setComposite(AlphaComposite.Src);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.drawImage(image, 0, 0, 600, 450, null);
    g2d.dispose();

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter