AGE ShowCode ^^

Do tej pory właściwie nie pokazałem ani kawałka kodu przykładowego użycia AGE, a przypuszczam, że byłaby to w jakimś sensie reklama 😉 Dlatego też postanowiłem zademonstrować jak wygląda przykładowy kod służący do wczytania zasobów z dysku, stworzeniu sprite’a i wyświetleniu go na ekranie.

Mam nadzieję, że kod jest wystarczająco skomentowany, żeby nie było wątpliwości co robi dana część ^^

#include <age.hpp>

#pragma comment( lib, "age_d.lib" )

class ageMain : public ageTask
{
	ageSprite sprite;
public:
	// konstruktor ustawia nazwe zadania
	ageMain(): ageTask("main") {}

	void init()
	{
		// wczytanie tekstury wczesniej zaladowanej
		// przez loadResources("data/rest.txt")
		sprite.setTexture( age::getTexture("spriteTexture") );
		// ustawia hotspot obrazka na srodek
		sprite.setHotspot( HS_CENTER );
	}

	void exec()
	{
		// wyswietl sprite'a na pozycji [100,100] w kolorze zielonym
		// obroconego wokol Hotspotu o 2 radiany i powiekszonego 4 razy
		sprite.draw( ageVector( 100, 100 ), 0xFF00FF00, 2.0f, 4 );
	}
};

int main()
{
	if( age::init( AGE_INIT_VIDEO | AGE_LOG ) )
	{
		// zaladuj zasoby
		age::getResManager()->loadResources("data/res.txt");
		// dodaj nowe zadanie
		age::getTaskManager()->addTask( new ageMain );
		// wejdz do petli glownej
		age::mainLoop();
	}
	return 0;
}
Reklamy

5 myśli nt. „AGE ShowCode ^^

  1. No to kilka pytań:

    1. Gdzie jest coś od ustawiania rozmiaru okna, ew. innych parametrów trybu graficznego?

    2. Jaka jest dokładnie funkcja tych tasków? To mi wygląda na lekko udziwnione opakowanie dla obiektów i IMHO niewygodne byłoby tworzenie osobnego taska dla każdego obiektu. Z drugiej strony rysowanie wszystkiego w jednym tasku nie różni się wiele od sytuacji, gdy mamy tylko metodę typu update(float dt) do napisania.
    Niedawno pisałem prosty framework 2D i zrobiłem tam po prostu menedżer obiektów, mających pozycję i prędkość (to było tylko GDI, więc żadnych transformacji, ale w DXie nie byłoby problemu z ich dodaniem) i wiedzących jak się narysować. Po dodaniu do menedżera aktualizują się one same, oraz same się rysują w zależności od ich rodzaju (animowany, statyczny, proceduralny, itd.).
    U siebie mógłbyś nie rezygnować z tych tasków, ale dodać podobny menedżer, który działałby jako kolejne zadanie. To oczywiście tylko sugestia, ale może ci się przyda 🙂

    3. ‚Hotspot’ to neologizm Microsoftu, określający piksel obrazku kursora, którym rzeczywiście się klika (np. koniec strzałki lub środek krzyżyka). W tym przypadku (‚punkt zaczepienia’) istnieje ładniejsze słówko ‚threshold’. Ale to oczywiście tylko taka drobna uwaga 🙂

  2. Xion,
    AD2 – najlepiej będzie, jak nam autor wyjaśni ;). Ale mnie bardziej kojarzy się to z task managerem, czyli bardziej ambitnym zarządzaniem zadaniami do wykonania w ciągu klatki. Pamiętasz pierwszy rozdział z GPG3, programowanie ogólne? Tam był taki; sam kiedyś coś podobnego implementowałem. Nie wiem dlaczego wszystko wszystkim kojarzy się z renderowaniem obiektów na ekranie ;))

    AD3 – ‚threshold’ nie znaczy przypadkiem ‚próg’? Nie kojarzy nam się to z jakąś granicą? Nie spotkałem się osobiście z użyciem tego słowa do oznaczania punktu zaczepienia obrazka 😉

    Osobiście widzę tutaj podobieństwo do SDLa ;). Brakuje tylko jawnego deinit()’a, skoro jest init(); ale to moje osobiste odczucie.

  3. @Xion:

    ad1: Jest osobna klasa okna, do której wskaźnik można pobrać przez age::getWindow() i ona ma zaimplementowane wszystko do obsługi okna. Jeśli chodzi o ustawianie rozdzielczości i ew czy ma być fullscreen czy nie to jest age::getVideo()->setVideoMode() ^^ (ona sama zmienia rozmiar okna jeśli potrzeba)

    ad2: Głównie chodziło o to, że np. po uruchomieniu gry pojawia Ci się ekran menu i ten jest renderowany i zarządzany przez menuTask jak przejdziesz do zapisywania gry to przez saveTask. A do samej gry na przykład gameTask. Poza tym IMO tak jest ładniej 😛

    ad3: Zastanawiałem się też nad inną nazwą ale Hotspot najbardziej mi tu pasował. Mogłoby być jeszcze Anchor ale to też jest „takie-se” więc pozostałem przy neologizmie MS’a 😉

    @TeMPOraL: jest tylko age::quit() i jego wywołanie zmienia tylko flagę czy petla główna ma się wyonywac na false a po pętli głównej wszystko jest czyszczone automatycznie – oczywiście wszystko co należy do AGE 😉 To co user stworzył musi wywalić po głównej pętli oraz ew w metodzie ageTask::destroy(), która też jest wykonywana po zakończeniu pętli głównej dla każdego zarejestrowanego taska.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s