O site está em reconstrução - obrigado pela paciência.

Você não está conectado. Conecte-se ou registre-se

 »  »  » 

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

Paulo Soreto


Visitante
Visitante
Como eu expliquei no tutorial passado a classe Cache será responsável por carregar e armazenar na memória todas as imagens que serão usadas (e provavelmente outros arquivos no futuro).

Dentro da pasta Global, crie uma nova classe chamada Cache.

Antes de começar eu preciso explicar algumas coisas, pesquisei algumas alternativas para o List, pois a mesma é muito lenta e seria prejudicial para o projeto utiliza-la, então a opção mais eficaz que encontrei foi o HashSet, porém o mesmo não tem muitos métodos internos pra ajudar o desenvolvedor (isso não é um grande problema).

A classe terá apenas métodos e variáveis estáticos, primeiro vamos criar um HashSet para armazenar as imagens:
Código:
private static HashSet<Structures.GameImage> images = new HashSet<Structures.GameImage>();

Agora precisamos criar um método de "busca" para encontrar a imagem desejada a partir de seu nome. Esse método se chamará GetImage, terá apenas um argumento que será string name. Seu retorno é de um Structures.GameImage (a struct que criamos no tutorial passado).

Esse método usará consulta LINQ para obter a imagem de retorno, mais informações sobre esse tipo de consulta pode ser encontrado aqui.

O método final ficou dessa forma:
Código:
public static Structures.GameImage GetImage(string name)
{
        var img = from image in images
                  where image.Name == name
                  select image;
        return img.First();
}

Agora precisamos criar um método para carregar na memória a imagem, para isso usaremos o seguinte código:
Código:
public static int LoadTexture(string name, string path)
{
        // Verifica se o arquivo existe
        if (String.IsNullOrEmpty(path))
                throw new ArgumentException(path);

        // Gera o id e vincula a textura
        int id = GL.GenTexture();
        GL.BindTexture(TextureTarget.Texture2D, id);

        // Define os parâmetros de renderização da textura
        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

        // Carrega a imagem na memória
        Bitmap bmp = new Bitmap(path);
        // Armazena os atributos de um bitmap, o lockbit bloqueia o bitmap na memória
        BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly,
        System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        // Especifica os parâmetros  da textura
        GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data.Width, bmp_data.Height, 0,
                OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmp_data.Scan0);

        bmp.UnlockBits(bmp_data);

        // Cria um objeto para ser armazenado no cache
        Structures.GameImage image = new Structures.GameImage();
        image.Id = id;
        image.Name = name;
        image.Path = path;
        images.Add(image);

        return id;
}

Não irei falar muito sobre esse método aqui no tópico pois comentei todas as linhas praticamente, então basta ler para saber do que se trata.

Agora que já temos o Cache e Graphics prontos, no próximo tutorial irei dar início a criação de um joguinho simples.

Ver perfil do usuário

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum

Parceiros
Centro RPG Maker Mundo RPG Maker La Communauté RPG Maker Condado Braveheart