sobota, 13 listopada 2010

Podsumowanie pracy

Z racji tego, iż za dwa dni kończy się konkurs "Daj się poznać" w którym udział bierze ten projekt, chciałem dzisiaj podsumować okres ponad 2 miesięcy pracy nad nim i podzielić się spostrzeżeniami  na jego temat.
Otóż w silniku przez ten okres udało mi się stworzyć mnóstwo klas, które będą stanowić podstawę do dalszej pracy nad silnikiem. W skrócie:
- można wyświetlać obraz(wczytany z pliku lub generowany) i tekst na ekranie;
- można rysować prymitywy;
- można używać klawiatury, myszki;
- dostępny jest wielowyjściowy logger(obecnie wyjscia do pliku i na konsolę dos);
- dostępny timer stałokrokowy;
- animacje z atlasu i manager animacji;
- dodano podstawową obsługę dźwięku(można załadować muzykę z pliku i odtwarzać ją); - i inne drobnostki.
- integracja z Box2D (obecnie mało rozwinięta: można renderować świat, klasa IActor - która łączy się z Body i zarządza nim)
- klasa Aplikacji(CApp) - pozwala zaoszczędzić czas i skrócić pisany kod, bo ma już pętle główną i inne metody których nie musimy pisać sami.
-IGame - interfejs gry klasa główna naszej gry powinna dziedziczyć i wykorzystać metody w nim zawarte.

To na razie tyle, obecnie po zakończeniu konkursu będę się chyba zajmował dokumentacją tego wszystkiego, bo ją strasznie zaniedbałem i skupiłem się tylko na implementacji. Poza tym udział w takim konkursie był super, nauczyłem się paru nowych rzeczy od uczestników. Oby takie konkursy były organizowane częściej.

Teraz jest głosowanie na najlepsze projekty w konkursie jeśli komuś przydały się informacje znajdujące  się na blogu może oddać głos na mój projekt: http://dajsiepoznac.devmedia.pl/ 

IActor

IActor to klasa reprezentująca jak sama nazwa wskazuje aktora. Jest abstrakcyjną klasą bazową po której dziedziczy nasza klasa aktora, w której dodajemy np. zdrowie postaci. Poza tym reprezentuje graficzną formę, zawiera CSprite. Klasa jest zintegrowana z Boxem i została stworzona właśnie do Renderowania ciał(b2Body) na ekranie. Poza tym zawiera kilka flag do zarządzania tym ciałem(czy ma zostać zniszczone, czy ma być rysowane, czy "żyje").




#pragma once
#include
#include
#include
#include "CSprite.h"
namespace DarkStorm2D
{
class DLLDARKSTORM2D IActor
{
protected:
b2Body* m_Body;
GraphicsCore::CSprite* m_Sprite;
unsigned int ID;

enum ActorFlags
{
Alive,
Destroy,
Visible,
ActorFlagsCount
};
std::bitset m_Flags;
public:
IActor()
{
m_Body = 0;
m_Sprite = 0;
m_Flags.reset();
}

~IActor()
{
m_Body = 0;
m_Sprite = 0;
m_Flags.reset();
}
void Render(float ScaleFactory)
{
if ( m_Flags[Alive]&& !m_Flags[Destroy])
{
float rot = m_Body->GetAngle();
b2Vec2 pos = m_Body->GetPosition();
//if (rot)
//m_Sprite->Render(pos.x/ScaleFactory-(float)m_Sprite->GetWidth()/2.0f, pos.y/ScaleFactory-(float)m_Sprite->GetHeight()/2.0f);
//else
m_Sprite->Render(pos.x/ScaleFactory-(float)m_Sprite->GetWidth()/2.0f, pos.y/ScaleFactory-(float)m_Sprite->GetHeight()/2.0f);
}
}

GraphicsCore::CSprite* GetSprite()
{
return m_Sprite;
}
bool IsAlive()
{
return m_Flags[Alive];
}

bool IsDestroy()
{
return m_Flags[Destroy];
}

bool IsVisible()
{
return m_Flags[Visible];
}
};
};


Na razie nie jest aż tak funkcjonalna ale to się zmieni. Dzięki niej można wyrenderować świat Boxa za pomocą jednej komend(klasy CWorld - Render() // iteruje ona przez wszystkie body i renderuje ich aktorów). To na razie tyle o aktorach.

sobota, 6 listopada 2010

CApp - Podstawa Frameworka

O klasie CApp wspomniałem w jednym z wcześniejszych postów, ale nie przedstawiałem jej jeszcze dokładnie. Otóż, będzie ona stanowić podstawę frameworka, jest to jedna z głównych klas w silniku. W założeniu, tworzymy jej instancje w głównej funkcji( main ), oto jak by to wyglądało:




#include "MyGame.h"

#include "CApp"




using namespace DarkStorm2D::SystemCore;

int main()

{

MyGame Game;

CApp App(&Game);

if (App.Init())

{

App.Run();

App.Deinit();

}

return 0;

}


Dosyć prosto wygląda :).
MyGame to klasa naszej gry(dziedziczy po IGame.
Do konstruktora aplikacji przekazujemy naszą grę zgodną z interfejsem IGame, drugim parametrem, którego tu nie podaję, bo domyślna wartość(60) w zupełności wystarczy, to żądana liczba klatek na sekundę.
Potem inicjujemy Grę, następnie jeśli się to powiodło Możemy ją uruchomić(W metodzie Run() znajduje się pętla główna). Na koniec Zwalniamy wszelkie zasoby i kończymy. I to by było na tyle o CApp, jeśli ktoś miałby jakieś sugestie, uwagi niech napisze w komentarzach.

Box2D - Wielka bitwa

Od ponad tygodnia rozplanowuje klasy pomocnicze do obsługi fizyki w silniku. Głównie to będą jakieś wrappery(nakładki) na Boxa, które trochę ułatwią zarządzanie nim. Jeszcze dokładnie nie opanowałem tego pudełka, ale większość już wiem, internet w tej sprawie trochę mi pomógł, ale mogłoby być więcej tutków do tego. Niedługo spróbuję napisać jakieś małe demko z fizyką.