[libGDX] SilverGUI for Android

Mój projekt biblioteki którą mam zamiar użyć w przyszłości do  innych projektów.
Sama biblioteka ma zawierać sporo prostych kontrolek: przyciski, suwaki, listy, kontrolki do wprowadzania textu a także joysticki kierunku jak i rotacji i inne rzeczy które przydadzą się w projektach.
Celem jest stworzenie alternatywy dla innych GUI - która jest w pełni modyfikacyjna, jednak nie wymaga zewnętrznych programów czy znajomości innego typu języka do jej zaprojektowania. Całością można zarządzać z naszego projektu i konfigurować kod bezpośrednio.
Aktualna wersja: 0.0.7
Platforma: Android 1.5+
Licencja: Open source
Download: <aktualnie niedostępne> dodam jak już zaimplementuje wszystkie podstawowe funkcje

Instrukcja użycia poniżej


1. Konfiguracja i "instalacja" biblioteki
 Kod jest w postaci czystych plików klas(na razie nie zamierzam tworzyć z tego biblioteki). Żeby dodać kod do naszego projektu będziemy musieli skonfigurować nasz projekt libGDX tak aby można było go uruchomić.
Następnie dodać 2 ściezki package do naszego folderu scr:
Pierwszą i główna ścieżka, zawierająca wszystkie pliki biblioteki, nazywamy:
pl.silvergui
Drugą ścieżką w której możemy przechowywać szablony naszego menu nazywamy:
pl.layout
No a trzecia ścieżka to nasza domyślna z klasą główną naszej aplikacji, u mnie to:
pl.my.game

Teraz w klasie gry importujemy package naszego layoutu, dodając na początku:
import pl.layout.TestLayout;
I to właściwie cała konfiguracja naszego środowiska:)


2. Żeby zacząć wykorzystywać SilverGUI wystarczy utworzyć klasę Layout dziedziczącą po Window:

package pl.layout;

import com.badlogic.gdx.Files;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

import pl.silvergui.Button;
import pl.silvergui.ListButton;
import pl.silvergui.Scroll;
import pl.silvergui.Window;

public class TestLayout extends Window {
      // Komponenty wpisujemy tutaj
     
      float X;
      float Y;
     
      public TestLayout(Files fileManager) {
            super(fileManager);
            // TODO Auto-generated constructor stub
           
           
            // Tutaj tworzymy komponenty
      }
     
     
      public void Draw(SpriteBatch theSpriteBatch)
      {
      DrawX(theSpriteBatch); // rysowanie menu, zawsze na poczatku
      }
      public void Update(Input input)
      {
      UpdateX(input); // Window odświeżanie - zawsze na poczatku
      }

}




Następnie w głównej klasie gry dodać naszą klasę Layoutu jako zmienną.
W metodzie Create() dodać konstruktor naszego Layoutu.
W metodzie Render() wywołać kolejno funkcje Render() i Draw() z naszego Layoutu

Całość prezentuje się mniej więcej tak:

package pl.my.game;


import pl.layout.TestLayout;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;



public class Game implements ApplicationListener {

    private SpriteBatch spriteBatch;
    static final int WIDTH  = 480;
    static final int HEIGHT = 320;
        
   // Window SzkieletWindow;
    TestLayout lMenu;
  
   
  
   
      @Override
      public void create() {
            // TODO Auto-generated method stub      
            spriteBatch = new SpriteBatch();        
            lMenu = new TestLayout(Gdx.files);
      }

      @Override
      public void resize(int width, int height) {
            // TODO Auto-generated method stub

      }

      @Override
      public void render() {
            // TODO Auto-generated method stub
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // This cryptic line clears the screen.
            lMenu.Update(Gdx.input);
           
            lMenu.Draw(spriteBatch);
           

      }

      @Override
      public void pause() {
            // TODO Auto-generated method stub

      }

      @Override
      public void resume() {
            // TODO Auto-generated method stub

      }

      @Override
      public void dispose() {
            // TODO Auto-generated method stub

      }

}

3. Konkretne metody i obsługę komponentów opiszę jak wypuszczę pierwszą wersje GUI .
Poniżej zamieszczam przykładową klasę Layouta, warto dodać że kontrolować i sprawdzać elementy możemy już w Layoucie jak i w kodzie naszej aplikacji.


public class TestLayout extends Window {
      // Komponenty wpisujemy tutaj
     
      Button Exit;
      Button OK;
      Button NewGame;
      Button Cofnij;
      ListButton Lista;
      Scroll Volume;
     
      float X;
      float Y;
     
      public TestLayout(Files fileManager) {
            super(fileManager);
            // TODO Auto-generated constructor stub
           
           
            // Tworzymy button Exit
            Exit = new Button(100, 150, 256, 64, "Nowa Gra");         
            AddButton(Exit);
            Lista = new ListButton(100,100,256,64,"Wybierz");
            Lista.AddArg("maciora", 23);
            Lista.AddArg("końiu", 33);
            Lista.AddArg("Mater Dei koniu wal", 33);
            Lista.AddArg("Mater Dei koniu wal", 33);
            Lista.AddArg("Mater Dei koniu wal", 33);
            Lista.AddArg("końiu", 33);
            Lista.AddArg("końiu", 33);
            Lista.AddArg("końiu", 33);
            Lista.AddArg("końiu", 33);
            Lista.AddArg("Heniek lecisz bardzo daleko co nie", 33);
            AddListButton(Lista);
           
            Volume = new Scroll(5,200,100f,100f,false);
            AddScroll(Volume);
      }
     
     
      public void Draw(SpriteBatch theSpriteBatch)
      {
      DrawX(theSpriteBatch); // rysowanie menu, zawsze na poczatku
      //-----------------CZŁON TESTOWY---------------------------
      theSpriteBatch.begin();
      font10.draw(theSpriteBatch, "X: " + X + " Y: " + Y, 30, 50);
      font10.draw(theSpriteBatch,"Wybrany index: " + Integer.toString(Lista.selectArgIndex), 30, 40);
      font10.draw(theSpriteBatch,"Aktywny selectButtona: " + XsieZgadza, 30, 30);
      font10.draw(theSpriteBatch,"Volume: " + Float.toString(Volume.ActualValue), 30, 20);
      theSpriteBatch.end();
      //-------------------- DO USUNIECIA PO TESTACH ------------------
      }
      public void Update(Input input)
      {
      UpdateX(input); // Window odświeżanie - zawsze na poczatku
      X = input.getX();
      Y = PrzeliczYpolozeniaKursora(input.getY());
      if(Exit.mouseJustClick)
      {
            ViewInputStream = true;
            input.setOnscreenKeyboardVisible(true);
      }
     
      }

}

Widzimy tutaj że pierwsza inicjalizacja i ustawienie komponentów zachodzi w konstruktorze klasy naszego stylu menu. To tutaj modulujemy zawartość, położenie i wygląd naszych komponentów - co nie jest oczywiście ostatecznymi parametrami, bo zawsze możemy je zmienić podczas funkcjonowania naszej aplikacji.
Żeby jednak nasze komponenty same się odświeżały i żyły własnym życiem musimy je dodać do klasy Window, która je wszystkie obsługuje.
Na razie ograniczyłem ilość każdego elementu chyba do 32 albo 20 sztuk(w przyszłości albo ten limit jeszcze pomniejszę by zwiększyć wydajność albo zrobię przesuwany layout).
W metodach Draw i Update(używam tych 2 osobnych metod z racji przyzwyczajenia do środowiska XNA) musimy pamiętać by samemu zainicjować odświeżanie się menu i rysowanie komponentów.
Reszta jest opcjonalna, ale można pokusić się o dodatkowe tryby naszego layouta. Tutaj akurat wyświetlam pomocne informacje przy testowaniu mojego GUI.

Na razie to wszystko, wszystko dokładniej opiszę w dniu premiery - która nastąpi jak czas pozwoli :D
Dzięki za uwagę,
Pozdrawiam Silver