Estou tentando criar um sistema de Gravidade e Colisão entre formas da classe Graphics e Graphics2D. Mas nem sei por onde começar!
As formas eu já sei criar, mas só não sei como implementar Física no projeto. Se alguém poder me ajudar, me dizer por onde começar já ficarei muito agradecido!
Cordialmente,
Gustavo Borba.
Olá GustavoBorba,
Você terá que utilizar conceitos de vetores para fazer isso, onde a gravidade terá um vetor, e o movimento das suas formas serçao representados por outros vetores.
recomendo vc ler o artigo sobre vetores do site www.pontov.com.br
[]s
Cara, eu não me lembro bem, mas sei que o pessoal do Indigente (Universidade Federal da Bahia) utilizava uma biblioteca C/C++ para a parte física da engine gráfica que eles estavam montando… Talvez tenha algo parecido pra java…
Olá, Boa Tarde/Noite!
Eu até achei uma engine que implementa a física em Java2D, mas eu gostaria mesmo de saber por conta própria, assim eu adquiriria mais conhecimento e meu horizonte de possibilidades ficaria maior. Eu li sobre os vetores, mas não entendi como aplica-los ao meu problema. Se alguém puder me orientar ou algo parecido, ficarei grato.
Cordialmente,
Gustavo Borba.
Bem, o vetor aqui é usado para ter a velocidade e posição nos 2 eixos, x e y. você pode deixar como vetor ou separar em 2 atributos pra cada componente (velocidade x e velocidade y e posição x e y).
Gravidade nada mais é que uma força pra baixo… logo, se pra cima o y aumenta (considerando por exemplo que y=0 é o chão, y = 10 está em cima do chão vamos dizer assim), para simular a gravidade basta subtrair da velocidade y um valor constante em cada passo, até atingir uma velocidade máxima de queda livre. Aí, é só calcular a nova posição y daquele passo, que vai ser posicao y = posicao y (atual) + velocidade y.
Quando toca o chão (onde o y=0 por exemplo), é só “desligar” a força da gravidade e manter o y ali mesmo. Nessa hora, a velocidade y fica = 0. Assim a posição não é alterada.
Não sei se fui claro (acho que não rs) mas da pra ter umas idéias aqui: http://gamedesign.wikicomplete.info/gravity
Então eu devo declarar um Vector2D com a posição de meu objeto e um Vector2D com a sua velocidade. Então os cálculos seriam (corrija-me se eu estiver errado:
VELOCIDADE = VELOCIDADE + GRAVIDADE;
myVector2D.Y = myVector2D.Y + VELOCIDADE;
E eu então devo usar a classe Rectangle, para detectar a colisão, se ela for detectada, então eu farei Vector2D.normalize() para normalizar o vetor de posição. E em um metódo de atualização como um:
public void update() {
while(true) {
repaint();
}
}
E então no paint component… :
@Override
public void paintComponent() {
// pintar o plano de fundo
g.fillRect(myVector2D.X, myVector2D.y, 10, 10);
}
Não sei se estou correto, por favor me corrija se eu estiver errado, mas acho que é isso! Estou aguardando ansiosamente por sua resposta!
Cordialmente,
Gustavo Borba.
Bem, a primeira parte está correta, seu cálculo da velocidade e posição nova estão ok.
Agora, quanto ao tratamento da colisão, não entendi bem se é isso mesmo que você precisa. Quando se normaliza um vetor, ele fica na mesma direção mas de comprimento 1. (http://pt.wikipedia.org/wiki/Vetor_unitário).
No tratamento de colisões, vai depender do que você vai querer fazer, então não posso dizer se está certo ou errado isso. Se for um jogo, por exemplo, e um dos Rectangle é uma parede e o outro seu personagem: você vai precisar fazer o personagem voltar alguns pontos para que ele não atravesse a parede (a não ser que seja um fantasma ;D).
Para o desenho da tela, sim este modo funciona, é chamado de modo passivo aliás… pode tentar também o modo ativo, que você encontra mais informações por aqui:
http://fivedots.coe.psu.ac.th/~ad/jg/index.html
http://fivedots.coe.psu.ac.th/~ad/jg/ch1/index.html