Fórum Sharpgames
 
 
  Forum  Criação de Jogo...  Algoritmos  Colisão por Tiles
Anterior Anterior
 
Próximo Desabilitado
Nova Entrada 3/2/2010 15:55
Não-resolvido
  rainier_augusto@yahoo.com.br
1 tópicos
Sem Ranking


Colisão por Tiles 
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.
 
Nova Entrada 7/2/2010 8:55
  jalf
116 tópicos
Iniciante




Re: Colisão por Tiles 
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.
 
Anterior Anterior
 
Próximo Desabilitado
  Forum  Criação de Jogo...  Algoritmos  Colisão por Tiles
Novatec
Promoção Novatec
Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso