pessoal, por acaso o significado do código abaixo seria fazer com que o objeto Graphics criado seja do tipo Graphics2D?? Assim como se eu tivesse int x = (int) 2.5f;
Graphics2D area = (Graphics2D) superficieComponente.create();
paint(area);
area.dispose()
alguem sabe o que significa o dispose? Diz que libera os recursos do sistema que o objeto esta usando,
como assim? alguem sabe me dar um exemplo melhor???
a) Você não pode chamar diretamente o método “paint”
b) Você não pode criar diretamente um objeto do tipo Graphics
c) Você tem de ler isto aqui, antes de fazer qualquer coisa:
Além de te recomendar a seguir o a,b,c do thingol, deixa eu só responder sua dúvida.
No passado, existia apenas o Graphics. Então a sun viu que isso era ruim, limitado, e resolveu melhorar. Criou-se a classe Graphics2D, filha de Graphics, muito mais flexível, poderosa e integrada com os pipelines gráficos do mercado (OpenGL e DirectX).
Todos os métodos que recebiam um Graphics como parâmetro (é o caso do paint(Graphics g) e paintComponent(Graphics g)), ou que retornavam um objeto Graphics (como é o caso do create() da própria classe Graphics), passaram a receber e retornar um objeto do tipo Graphics2D.
Entretanto, para não quebrar a compatibilidade de programas antigos, que usavam Graphics diretamente, a sun manteve a assinatura desses métodos com Graphics, ao invés de atualiza-la para Graphics2D.
Por isso, você sabe que, embora o tipo de retorno seja Graphics você pode fazer o cast para Graphics2D. Lembre-se o cast, em se tratando de objetos, não converte nada. O que ele faz é indicar para o compilador que sabemos que o tipo real do objeto é mais específico do que aquele. E então, falamos a ele que queremos trabalhar de forma mais específica, não genérica.
Você só está dizendo. Ei compilador, ei sei que o Graphics retornado pelo método create é na verdade um objeto do tipo Graphics2D, filho dele.
ViniGodoy
O objeto Graphics, recebido no parâmetro do paintComponent guarda uma série de estados:
Cor de fundo, cor da letra, matriz de transformação usada na pintura, largura do lápis, tipo de pintura, etc.
Parte desses recursos são armazenados pelo sistema operacional, outra parte pelo próprio pipeline gráfico (seja ele OpenGL ou DirectX).
O método create() cria uma cópia do contexto gráfico atual. Assim, você pode alterar essas propriedades, sem se preocupar e alterar o objeto graphics recebido como parâmetro. Como esse objeto será usado pelo Swing em futura pintura, é considerado uma péssima prática alterar o seu estado.
Se todas as propriedades ficassem no Java, bastaria deixar o garbage collector se virar. Como isso não ocorre e parte fica no SO e no pipeline, você precisa usar o dispose para efetivamente liberar todos os recursos usados para armazenar esses valores (seja do SO ou do pipeline).
O objeto Graphics, recebido no parâmetro do paintComponent guarda uma série de estados:
Cor de fundo, cor da letra, matriz de transformação usada na pintura, largura do lápis, tipo de pintura, etc.
Parte desses recursos são armazenados pelo sistema operacional, outra parte pelo próprio pipeline gráfico (seja ele OpenGL ou DirectX).
O método create() cria uma cópia do contexto gráfico atual. Assim, você pode alterar essas propriedades, sem se preocupar e alterar o objeto graphics recebido como parâmetro. Como esse objeto será usado pelo Swing em futura pintura, é considerado uma péssima prática alterar o seu estado.
Se todas as propriedades ficassem no Java, bastaria deixar o garbage collector se virar. Como isso não ocorre e parte fica no SO e no pipeline, você precisa usar o dispose para efetivamente liberar todos os recursos usados para armazenar esses valores (seja do SO ou do pipeline).
legal a sua explicação! muito boa! mas esse codigo não fui eu que escrevi estava apenas lendo para aprender um pouco mais. A chamada do metodo paint é um metodo que o cara havia criada era do tipo abstrato era um metodo da classe aonde estão parte do codigo que postei, me esqueci q em Graphics tb há um metodo paint! falha minha!!!
" b) Você não pode criar diretamente um objeto do tipo Graphics "
mas porque então o autor do codigo fez daquele modo? o codigo copila!!!
o complicado das explicações dos metodos em java é que muitas vezes não dá para entender o que o metodo em questão faz! Como por exemplo o do dispose(). Diz que libera os recursos do sistema que o objeto esta usando
ai fiquei me perguntando que recursos são esses! Sem falar que as vezes fica um pouquinho complicado porque de fato ainda não sei falar ingles muito bem!! rsrsrrs
=]
ViniGodoy
Chamar o paint diretamente faz o código compilar. É sintaticamente correto.
Isso não significa que seja correto usar dessa forma.
Porém, viola diretamente o uso da API. Leia o que diz o Javadoc (destaque por minha conta):
“Applications should not invoke paint directly, but should instead use the repaint method to schedule the component for redrawing.”
Quanto as explicações, o material que o Thingol passou explica tudo isso tintim por tintim.
Enfim, não sei porque o autor fazia dessa forma. Provavelmente, porque também não leu o Javadoc.
J
jhooon
ViniGodoy:
Enfim, não sei porque o autor fazia dessa forma. Provavelmente, porque também não leu o Javadoc.
hehe… vou começar a ler o javadoc
você sabe me dizer o que acontece nessa parte do codigo???
me parece uma estrutura de decisão!! mas desconheço esse formato.
ViniGodoy
Isso é o operador ternário. Pode ser reescrito assim:
private double correctCoord(double velocity, double a, double maxA)
{
if (velocity > 0)
return a - size - 1;
else
return maxA + 1;
}
J
jhooon
ViniGodoy:
o cara criou uma interface da seguinte maneira
public interface Sprite
{
public double getX();
public double getY();
void update();
void draw(Graphics2D surface);
Rectangle2D getBoundaries();
}
porque que ele usa em alguns metodos o "public" e em outros como por exemplo update() e getBoudaries() ele simplesmente o coloca void , Rectangle2D sem um "public, private ou protected" na frente do metodo?
J
jhooon
ViniGodoy ve se vc entende a ideia desse metodo
publicclassBall{/** * Indicate if the ball has gone offScreen. * * @return True if went offscreen, false if not. */publicbooleanisOffScreen(){returngetY()>575||getX()>799||getX()<-size;}/** * Returns the Y coordinate of this sprite. * * @return The Y coordinate of this sprite. */publicdoublegetY(){returny;}/** * Gets the X coordinate of this sprite. * * @return The X coordinate of this sprite. */publicdoublegetX(){returnx;}}
em que size é um atributo da classe Ball.
Eu não entendi qual foi a idéia de getY() > 575 || getX() > 799 || getX() < -size para saber se ouve offScreen
ViniGodoy
Eu entendo o código todo cara. Você por acaso não está estudando o Vikanoid?
Fui eu que escrevi esse código. heehehheheehhe Você deve ter baixado do meu blog…
Foi um dos meus primeiro jogos, então não tá nenhum primor.
A tela tem 800x600. Logo, quando a bola estiver na parte debaixo (y > 575) ou quando tiver saído pela direita (x > 799) ou quando ela tiver saído totalmente pela esquerda (x < tamanho da bola) ele vai estar fora da tela (como o próprio nome do método já diz). Não testo se a bola não saiu para cima (y < -size) porque ela não tem como sair por lá. A parte de cima é completamente fechada.
O x precisa ser negativo porque um x igual a zero põe deixaria a bola ainda visível, com o canto encostado na lateral da tela.
Quanto a interface sprite. Todos os métodos são publicos, independente de estar escrito public ou não.
Eu geralmente, não escrevo. Pode apagar dos dois primeiros métodos, que compila do mesmo jeito.
Se quer um conselho, comece estudando um código mais fácil e mais didático, como o Genius for Dummies, que eu também escrevi.
Foi um dos meus primeiro jogos, então não tá nenhum primor.
hahahaha que engraçado!!! Eu havia pego o teu codigo ha um bom tempo mas nesses ultimos dias é que comecei a estudá-lo!!
Bom vou fazer mais algumas perguntas sobre o teu codigo!!!!
Vc criou dois metodos que "desenham" os sprites, um chamado " public void draw(Graphics2D surface) " e outro " public abstract void paint(Graphics2D surface); ", porq dois metodos que fazem a mesma função?
Na classe Brick vc fez " List<Brick> bricks = new ArrayList<Brick>(); " qual a vantagem de criar um objeto tipo List e "guardar" nele um objeto tipo ArrayList do que criar um objeto ArrayList e "guardar" nele um obeto ArrayList????
porque que newX -= amount * speedFactor; vc multiplica amount por speedFactor?
em private void calculateVx(), newX - getX esta sendo dividido por UPDATES_FOR_MOVEMENT ???
são uma das dúvidas básicas que eu tenho!!! hehehehe
vlwww
;D
ViniGodoy
jhooon:
hahahaha que engraçado!!! Eu havia pego o teu codigo ha um bom tempo mas nesses ultimos dias é que comecei a estudá-lo!!
Bom vou fazer mais algumas perguntas sobre o teu codigo!!!
Vc criou dois metodos que “desenham” os sprites, um chamado " public void draw(Graphics2D surface) " e outro " public abstract void paint(Graphics2D surface); ", porq dois metodos que fazem a mesma função?
O principal método é o paint(). O que acontece é que uma das classes base já criaram um comportamento especializado do paint, que já faz algumas tarefas básicas como copiar o contexto gráfico com o create(). Ainda assim, por ser tratar de uma classe base, ainda há a necessidade de chamar um método de pintura da filha. Como o método paint já foi sobrescrito, decidi criar um novo método, chamado draw().
O nome do método já diz. É uma proporção. Como se calcula uma proporção?
O que eu quero saber é quantas vezes other rectangle é maior do que myRectangle.
É necessário que a velocidade do game seja constante entre diferentes plataformas. Se você voltar na física vai se lembrar que velocidade é formada por:
velocidade = deslocamento / tempo (por isso medimos em metres/segundo, kilometros por hora ou pixels/frame)
No cálculo de newX() estamos, na verdade, calculando um deslocamento. Isso significa que:
deslocamento = velocidade * tempo
Assim, apesar de cada computador ter seu próprio clock e o tempo variar. O deslocamento final se mantém constante. Em computadores rápidos, o speedFactor será pequeno, e portanto, a velocidade será multiplicada por um valor pequeno. Num computador lento, speedfactor será um número grande, e portanto, o deslocamento final será grande. No final, num mesmo intervalo de tempo, o deslocamento de ambos será igual.
71C4700
Eu queria desenha algo (Um tabuleiro) e controlar as ponsições atraves das coordenadas.
Queria fazer um jogo de Gamão mais ja tentei desenhar em um JPainel, mas quando dimensiono ele a imagem ou muda ou desaparece, por ter tamanho fixo ser a mesma imagem pra todos os estados.
Alguma sugestão ?
J
jhooon
[quote=ViniGodoy]
jhooon:
hahahaha que engraçado!!! Eu havia pego o teu codigo ha um bom tempo mas nesses ultimos dias é que comecei a estudá-lo!!
Cara será que não tem como fazer o teu jogo rodar apenas usando as classes "essenciais" do arkanoid! Como por exemplo a classe bola, barra, parede, tijolo, , detector de colisoes, jogador, aquelas que fazem o tratamento de eventos e o vector2D.... Mas o problema é o metodo main na classe Vikanoid, não entendi bem, mas me parece que dependendo da situação ela cria um objeto vikanoid e assim chama pela classe GameCore, mas eu como eu disse queria tentar rodar o jogo somente com as classes que disse mas ficou meio complicado porq como vc chama pela classe GameCore ela por si esta totalmente entrelaçãda com mais um porção de classes das quais eu queria excluir.... sabe como eu posso proceder????
no 3º e 4º for eu nunca havia visto aquele tipo de estrutura "for(algumacoisa : outraCoisa)" será que vc pode me explicar o que de fato esta ocorrendo???
bom, o jogo inicia aqui certo!!? Eu não sei ao certo como funciona a passagem
do array para args[] mas em que tipo de situação o tamanho desse array será zero?
Então na 1º posição desse array deveria conter a String "-profile"? E nas demais
posições do args[] ???