|
 | | |
|
| |  |   |  |  | |  |  | |  |  | |  |  | |  | |
 | | | |
Pessoal, estou tentando fazer uma colisão entre um personagem e os demais Tiles da fase, mas não estou conseguindo, ja rodei a internet inteira mas não consigo resolver o problema.
Detalhando o problema:
- Meu personagem possui 64x64 pixels, assim como todos os elementos da fase
- Quando o personagem colidi com as paredes (Impassable) estas nao colidem exatamente na parede, ou colide antes ou colide depois,
dependendo do ajuste, o personagem por sua vez gruda na parede como chiclete, e não desliza na parede como deveria.
No codigo esta assim:
float Velocidade = 7.0f;
int esquerda = vetorvalorescolisao[0];
int cima = vetorvalorescolisao[1];
int direita = vetorvalorescolisao[2];
int baixo = vetorvalorescolisao[3];
if (keyboardState.IsKeyDown(Keys.Up)) // Ou seja, se personagem precionou para cima.
{
if (ChecarColisao(esquerda, cima, ref tiles, ref map) == false || ChecarColisao(direita, cima, ref tiles, ref map) == false)
{
emcolisaocima = true;
direcao.Y += 0;
}
else
{
if (PosicaoSupaplex.Y > 0)
{
cam.Move(new Vector2(0, -8));
}
emcolisaocima = false;
direcao.Y += -1.0f;
}
PosicaoSupaplex.X = direcao.X * Velocidade;
PosicaoSupaplex.Y = direcao.Y * Velocidade;
}
E o metodo de checar a colisao esta da seguinte maneira:
public bool ChecarColisao(int esquerdadireita, int cimabaixo, ref List<Tile> tiles, ref int[,] map)
{
if (tiles[map[cimabaixo, esquerdadireita]].collision == TileCollision.Impassable)
{
return (false);
}
return (true);
}
Para determinar o que esta ao redor do personagem eu uso o metodo que preenche as variaveis do inicio (aqui que estou calibrando):
public int[] BuscaDados(ref Vector2 PosicaoSupaplex, Texture2D caractersupaplex)
{
int[] vetorvalorescolisao = new int[5];
vetorvalorescolisao[0] = (int)(PosicaoSupaplex.X / 64);//x.esquerda
vetorvalorescolisao[1] = (int)(PosicaoSupaplex.Y / 64);//y.cima
vetorvalorescolisao[2] = (int)((PosicaoSupaplex.X + (64)) / 64);//x.direita
vetorvalorescolisao[3] = (int)((PosicaoSupaplex.Y + (64)) / 64);//y.baixo
return (vetorvalorescolisao);
}
Não sei se consegui explicar muito bem mas se alguem puder me ajudar eu agradeço, meu MSN é bramstoker1688@hotmail.com
Abraços. |
|
|
|  |  | | | |
Olha, me parece que é um daqueles casos de des-sincronismo entre o Update() e o Draw(). É comum no Update() você detectar um estado (no caso, a colisão do jogador com o tile) e não refletir isso no Draw() (o que explicaria a colisão "antes" do tile). Dê uma olhada para se você não impede o movimento do jogador em direção ao tile após detectada a colisão. Microsoft Most Valuable Professional e Administrador do Sharpgames.
 |
|
|
|  |  | | | |
Olá,
Também passei por esse problema. Criei uma solução provisória que tá funcionando. Mas acho que deve ter algo melhor.
De qualqeur maneira aí vai minha dica:
Crie um objeto (rectangle, vector2, etc) pra armazenar temporariamente as coordenadas que localizam teu personagem. Sempre que NÃO houver colisão o UPDATE atualiza essas variáveis com a posição atual do personagem. Caso aconteça a colição, o DRAW deve desenhar teu personagem na última posição válida, que é obtida dessa variável temporária.
Vai lá e testa que funcionou comigo. |
|
|
|
|  |  | |  |  | |  |  | |  |
|
|
| | |
|
|
|  |
 |  |
|