Fórum Sharpgames
 
 
  Forum  Criação de Jogo...  Algoritmos  Colisão por Tiles
Anterior Anterior
 
Próximo Próximo
Nova Entrada 3/2/2010 16: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 9:55
  jalf
165 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. jalfbr's Gamercard
 
Nova Entrada 8/9/2010 13:48
  leosimonetti
2 tópicos
Sem Ranking


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