Fórum Sharpgames
 
 
  Forum  Criação de Jogo...  Gráficos 2D/3D  Duvida com Sprites
Anterior Anterior
 
Próximo Próximo
Nova Entrada 5/8/2009 1:23
  lucianoJose
194 tópicos
Iniciante


Re: Duvida com Sprites 
 kellyson escreveu
Fala Pessoal, aproveitando o assunto de Sprites gostaria de perguntar aos mais experientes...é possivel fazer colisão por pixel de sprites animados ? Se não, qual a tecnica mais indicada ? Se possivel me postem um exemplo ou tutorial que eu possa analisar. Valeu.
public static class PerPixelCollision
    {
        ///<summary>
        /// Determines if there is overlap of the non-transparent pixels
        /// between two sprites.
        ///</summary>
        ///<param name="rectangleA">Bounding rectangle of the first sprite</param>
        ///<param name="dataA">Pixel data of the first sprite</param>
        ///<param name="rectangleB">Bouding rectangle of the second sprite</param>
        ///<param name="dataB">Pixel data of the second sprite</param>
        ///<returns>True if non-transparent pixels overlap; false otherwise</returns>
        public static bool IntersectPixels(Rectangle rectangleA, Color[] dataA,
                                    Rectangle rectangleB, Color[] dataB)
        {
            // Find the bounds of the rectangle intersection
            int top = Math.Max(rectangleA.Top, rectangleB.Top);
            int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom);
            int left = Math.Max(rectangleA.Left, rectangleB.Left);
            int right = Math.Min(rectangleA.Right, rectangleB.Right);
 
            // Check every point within the intersection bounds
            for (int y = top; y < bottom; y++)
            {
                for (int x = left; x < right; x++)
                {
                    // Get the color of both pixels at this point
                    Color colorA = dataA[(x - rectangleA.Left) +
                                         (y - rectangleA.Top) * rectangleA.Width];
                    Color colorB = dataB[(x - rectangleB.Left) +
                                         (y - rectangleB.Top) * rectangleB.Width];
 
                    // If both pixels are not completely transparent,
                    if (colorA.A != 0 && colorB.A != 0)
                    {
                        // then an intersection has been found
                        return true;
                    }
                }
            }
 
            // No intersection found
            return false;
        }
    }
Considerando que o cenário aqui seja: animação de sprites com sprite Sheet.
Será preciso obter o ”SourceRectangle” do Frame Atual da Animação. Entenda SourceRectangle por região da imagem que está sendo renderizada.
Com essa região em mãos, será preciso obter as informações dos texels dessa região da textura. Mas como obter isso?
Uma forma de obter isso é utilizar a sobrecarga do método GetData<T>, Texture2D class, aonde pode-se definir a seção da imagem a ser copiada. 

Veja a assinatura desse método abaixo:
 
public void GetData<T> (
         int level,
         Nullable<Rectangle> rect,
         T[] data,
         int startIndex,
         int elementCount
)
Se tiver alguma dificuldade ao tentar botar isso pra funcionar, é só avisar!
Abraços 

Administrador do SharpGames.
 
Nova Entrada 27/8/2009 11:00
  kellyson
8 tópicos
Sem Ranking




Re: Duvida com Sprites 
Modificado Por lucianoJose  em 30/8/2009 11:31:20)

Fala Luciano,

     Olhei teu exemplo e implementei, mas o VS ficou me retornando o seguinte erro:



Tens...alguam idéia do que esqueci ?

Valeu

Meu Código:

 public Color[] Data
 {
     get
     {
       this.data = new Color[Imagem.Height * Imagem.Width];
       this.Imagem.GetData<Color>(this.data, (int)umIndex, 1);
       return this.umaCor;
     }
 }


Kellyson Victor
Microsoft Student Partner
Líder da Célula Acadêmica XNA Natal Academics
 
Nova Entrada 27/8/2009 18:59
  lcolnaghi
32 tópicos
8th Level Poster


Re: Duvida com Sprites 
Modificado Por lcolnaghi  em 27/8/2009 19:28:52)

Kellyson, to sem XNA gs aqui, mas porque tu tá usando esse overload?
pelo nome da tua propriedade parece que tu só quer um array com as cores da textura...
e pra isso tenho certeza que existe um overload no GetData<Color>(Color[] array);  : D

--Edit: agora que consegui ver no vs... cara tu ta usando um método que recebe por parâmetros  ( Color[] data, int start index, int lenght ),
no teu caso já tá errado o código pois tu tá passando start index == float convertido pra int ( ein ? - pra que isso pra controlar índices ? ) , e 1, no caso o tamanho de colors que tu quer pegar... realmente, não sei se era isso que tu queria..


 
Nova Entrada 28/8/2009 11:52
  kellyson
8 tópicos
Sem Ranking




Re: Duvida com Sprites 

Opa ZoraBr

Acho que não expliquei direito...

     Seguinte estou querendo fazer uma colisão por pixel com um sprite animado, mas não estou conseguindo recuperar as "texels" do frame corrente para fazer a comparação...ai o luciano me sugeriu usar o overload do metodo GetData mas acho que estou esquecendo algo....

Tu teria algum exemplo de colisão por pixel com Sprite animado que possa me passar ?

Valeu


Kellyson Victor
Microsoft Student Partner
Líder da Célula Acadêmica XNA Natal Academics
 
Nova Entrada 28/8/2009 15:45
  lcolnaghi
32 tópicos
8th Level Poster


Re: Duvida com Sprites 
Tenho sim, mas pelo teu post anterior o que eu  quis dizer que a razão de estar estourando aquela exceção é que tu tava usando um overload errado  ( ou simplesmente tu podia usar ele  com os seguintes parâmetros ( data, 0, imagem.width * imagem.height ) - que dá na mesma de usar ( data ) somente ).
Mas porque tu não dá uma olhada naquele tutorial do creators club?  de per-pixel collision ? animação eu coloquei em algum tópico por aí um arquivo  com as classes : ) daí é só pegar com esse overload ( que tu está usando )  e pegar somente a data da img do frame atual.... mas para imagens individuais este overload de 3 parâmetros é meio inútil ...

[]'s,
Lucas Colnaghi

 
Anterior Anterior
 
Próximo Próximo
  Forum  Criação de Jogo...  Gráficos 2D/3D  Duvida com Sprites
Novatec
Promoção Novatec
Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso