[LibGDX][Java] Tworzenie własnych tekstur

W tym temacie przekaże podstawowe i niezbędne informacje które pozwolą wam stworzyć własną teksturę programowo. Zaczniemy od utworzenia tekstury jednego pixela...
Funkcja zwracająca teksturę z jednym białym pixelem wygląda następująco:



public Texture getWhitePixel(){        
            
             Pixmap textureSource; //Pixmapa z której budujemy Gdx2DPixmap
             Gdx2DPixmap pixmap; //Pixmapa Gdx`a najniższy poziom pixmapy
            
            
             pixmap = new Gdx2DPixmap(1, 1, Gdx2DPixmap.GDX2D_FORMAT_RGBA8888);       
             textureSource = new Pixmap(pixmap);
             textureSource.drawPixel(0, 0, Color.rgba8888(Color.WHITE));
             return new Texture(textureSource);            
       }


W powyższej funkcji użyliśmy 2 klas Pixmapy(być może ten sam efekt można było uzyskać pomijając Gdx2DPixmap - ale przedstawiam metodę sprawdzoną). Najpierw tworzymy Gdx2DPixmap o rozmiarze 1 X 1,  w formacie RGBA8888. Tutaj odnośnie formatów: występuje ich kilka a każda z nich ma przypisaną konkretną wartość typu int:

 public static final int GDX2D_FORMAT_ALPHA = 1;
 public static final int GDX2D_FORMAT_LUMINANCE_ALPHA = 2;
 public static final int GDX2D_FORMAT_RGB888 = 3;
 public static final int GDX2D_FORMAT_RGBA8888 = 4;
 public static final int GDX2D_FORMAT_RGB565 = 5;
 public static final int GDX2D_FORMAT_RGBA4444 = 6;

Ja wybrałem RGBA8888 czyli 4, ponieważ każdy kolor jest zapisany w 8 bitach, wspiera także kanał alpha i ten prawdopodobnie może nam się najczęściej przydawać. Choć jako że chcemy tylko jeden mały pixel i to bez kanału alpha to ze spokojem moglibyśmy wybrać format RGB565 czy inny zajmujący teoretycznie mniej miejsca w pamięci. Nie mniej kanał 8888 jest tym podstawowym i sprawia najmniej problemów.

Następnie tworzymy obiekt typu Pixmap z obiektu typu Gdx2DPixmap, na którym to rysujemy Pixel w pozycji 0,0 i o kolorze który wybraliśmy czyli: Color.rgba8888(Color.WHITE)
Na odpowiedni format przekształcamy go dzięki odpowiedniej funkcji statycznej klasy Color.
UWAGA: Zamiast korzystać z już gotowych kolorów w klasie Color, możemy sami wpisać pożądane przez nas parametry w formacie RGBA(czerwony, zielony, niebieski, alpha) np:



textureSource.drawPixel(0, 0, Color.rgba8888(1,1,1,0));


Oczywiście sam obiekt pixmap umożliwia także rysowanie na nim gotowych wzorów jak kół, kwadratów czy liń. I w ten sposób programowo możemy tworzyć własne tekstury.

Poniżej przykład jak zrobić Texture o dowolnym wymiarze i obramowaniem:



/**
        * Funkcja ta zwraca teksture z namalowanym kwadratem z ramką
        * @param x
        * @param y
        * @param width
        * @param height
        * @param sizeFrame szerokość w pixelach ramki
        * @param colorBackground kolor tła
        * @param colorFrame kolor ramki
        * @return
        */
       public static Texture GetRectangleWithFrame(int x, int y, int width, int height, int sizeFrame, Color colorBackground, Color colorFrame){
            
             Pixmap textureSource;
             Gdx2DPixmap pixmap;
            
            
             pixmap = new Gdx2DPixmap(width, height, Gdx2DPixmap.GDX2D_FORMAT_RGBA8888);           
             textureSource = new Pixmap(pixmap);
            
             //Wypełnianie tekstury
             for(int pixelX = 0; pixelX < width; pixelX++){
                    for(int pixelY = 0; pixelY < height; pixelY++){                          
                          
                           if(pixelY < sizeFrame || pixelY > (height - 1) - sizeFrame || pixelX < sizeFrame ||  pixelX > (width - 1) - sizeFrame) {
                                 
                                  textureSource.drawPixel(pixelX, pixelY, Color.rgba8888(colorFrame));
                                 
                           } else{
                                 
                                  textureSource.drawPixel(pixelX, pixelY, Color.rgba8888(colorBackground));                                 
                           }
                    }
                   
             }
                          
             return new Texture(textureSource);            
            
       }



Mamy tutaj podobny przykład jak na początku utworzenie obiektu Pixmap i Gdx2DPixmap, a następnie wstępne ich skonfigurowanie(szerokosc , wysokość, format). Cały problem polega jedynie na umiejętnym używaniu funkcji textureSource.drawPixel(). Gdzie musimy podać pozycje pixela licząc od 0, jak w przypadku tablicy a także podać interesujący nas kolor.