Colisao em jogos j2me

Pessoal,

to começando a estudar jogos e to fazendo um prototipo em j2me.

eu coloquei na tela um castelo, onde o personagem pode entrar. Como resolvo a colisao dele com a parede do castelo? quer dizer… tem o metodo do j2me que verifica colisao, mas ai o que vcs me recomendam fazer? quando o personagem colide, eu verifico a direcao da colisao e nao deixo ele ir pra la de novo? eu faço ele retroceder um pouco, ir um pouco pra tras? o que vcs, com mais experiencia, recomendam? tipo… se tiver um lugar onde seja estreito, so de o personagem msm, como num beco, se eu mandar ele ir p tras pode dar pau no jogo ne?

afinal, se ele for pra tras, pode colidir com a outra parede (ja que é um beco estreito, entenderam?), ai ficaria colidindo infefinidamente. nao sei se me expressei bem, mas é mais ou menos isso.

Valeu, gente!

Você pode guardar a ultima posição válida em uma variavel, e quando detectar a colisão retornar para a mesma.
Importante é verificar a colisão depois do input do usuario e antes de renderizar os graficos:

–verifica input
–verifica colisão(volta para posição anteriro se necessário)
–pinta tela

Fazendo desta maneira, ficará invisivel ao usuario que o personagem voltou a posição anterior.

Eu tbm sou um pouco novato nessas situações, talvez possa ter uma maneira melhor.

oi, blz?

eu to usando o canvas e nao o gameCanvas.

parece que o canvas nao tem um loop, como no gamecanvas. entao eu coloquei um while(true), pra que o jogo ficasse rodando direto, sem parar. Isso fez com que a tela nao fosse pintada… nao sei se e pq a pintura demora… o que fiz entao foi fazer um thread pra pintura de tela. Assim, a tela é pintada continuamente (isso serve pra que tudo na tela fique animado, andando mesmo que o jogador nao faça nada).

o que acontece é que quando eu ando com o jogador, eu testo se há colisao. entao o que eu tenho que fazer é voltar pra posicao anterior, que eu guardei anteriormente, certo?

solucao facinha de fazer… eu tava testando assim: se nao ha colisao, ande. mas ai, quando ele tinha colisao, dava pau pq depois que ele colide com alguma coisa fica no estado de colisao direto… Agora tem mais um duvida… imagina que eu tenho um corredor, onde o personagem tenha que passar bem estreito (so da um personagem, so cabe ele no corredor). quando o personagem entrar nesse corredor, ele nao da pau, nao? tipo… ele vai ficar no estado de colisao direto nao e nao?

eu fiz uma coisa parecida antes, mas deva pra notar que o personagem, depois da colisao, andava um pouco p tras. vou tentar essa sua mais tarde e falo depois o resultado.

--------- (parede)
@ (personagem quer atravessar o corredor, mas fica encostando nas paredes pq é muito estreito… Colisao??? Se sim, ando uma posicao atras??? tem que passar sem colidir?)
--------- (parede)

Sim estou utilizando GameCanvas, e porque voce não está utilizando?

Se você utilizar MIDP2.0 , terá coisas prontas como LayerManager, Sprite, TiledMap, GameCanvas e uma porção de métodos prontos como collidesWith() que iria resolver esse teu problema.

Se não for um requisito utilizar MIDP1, deverias utilizar MIDP2.0.

Segue alguns links bons para iniciar os estudos:
http://developers.sun.com/mobility/midp/articles/gameapi/
http://developers.sun.com/mobility/midp/articles/game/

to usando o canvas pra desenhar na tela e usado o netbeans com o gameDesign pra fazer os cenarios, imagens, etc.

entao uso uma classe que é minha midlet, um gamedesign pra criar os frames, criacao de sprites, cenarios, etc, etc… e finalmente um canvas, que pega os eventos do teclado e tambem desenha na tela. Dá no mesmo, no final.

[quote=gpmdf2]
--------- (parede)
@ (personagem quer atravessar o corredor, mas fica encostando nas paredes pq é muito estreito… Colisao??? Se sim, ando uma posicao atras??? tem que passar sem colidir?)
--------- (parede)[/quote]

No seu caso o corredor deve ser menor que o Sprite. A não ser que vc desconsidere os pixels transparentes, coisa que o método o metodo [i]collidesWith/i; da GameApi fornece, passando como segundo parametro true.

No caso vc não está utilizando a Gameapi então terá que implementar isto na mão.