niedziela, 3 października 2010

Języki Skryptowe

Do mojego silnika planuję stworzyć nowy język skrptowy o nazwie "DarkScript". Będzie on miał składnię podobną do C++. Dziękiniemu możliwe będzie zarządzanie
większością(jeśli nie wszystkimi) elementami w grze. Można będzie tworzyć i ładować z jego poziomu obrazy, dźwięki, sprity, animacje. Zarządzać GUI, aktorami, scenami, Nawet
tworzyć nowe wątki, serwery itp.. Język będzie posiadał (na razie podstawową) obiektowość (można będzie tworzyć własne klasy)
, przestrzenie nazw, inne elementy języka C++ np. pętle, instrukcje warunkowe. Drugim językiem skryptowym jakim można będzie posługiwać się w silniku jest Lua.

Po co mi drugi język skryptowy?
- żeby ten kto zna Lua mógł z niej skorzystać(to bardziej prawdopodobne niż to że będzie znał "DarkScript")

sobota, 2 października 2010

Nowa wersja Allegro

Niedawno wyszła nowa wersja Allegro, opatrzona numerkiem 4.9.22. Postanowiłem na nią przejść,bo chcę żeby mój silnik był aktualny. Nie było to takie trudne, musiałem zmienić kilka linijek kodu i dołączyć nowe liby. Zyskiem była trochę zwiększona wydajność względem .21.

sobota, 25 września 2010

GŁUPIE BŁĘDY Część 1

W tym poście chciałbym napisać jakie głupie błędy popełniłem przez te kilka tygodni, które opóźniały pracę:
1. Pierwszy błąd jaki popełniłem był związany z  niskim fps(frame per second), a mianowicie inicjowałem okno Allegro5 po utworzeniu obrazka, co prowadziło do kosztownych konwersji formatu, a winikiem tego był fps rzędu 0 - 1(przy 48 wyświetleniach bitmapy 100x100px). Wpadnięcie na rozwiązanie tego problemu zabrało mi 2 dni.

2. Drugi błąd dotyczył  klas managerów zasobów, dokładnie chodziło o błąd spowodowany moja nie wiedzą na temat hash_map z stl. Chciałem uzyskać mapę w postaci: std::string, *resource. Korzystając z przykładu z tej strony: http://www.sgi.com/tech/stl/hash_map.html, popełniłem błąd( nie wiedziałem że istnieje już specjalizacja dla std::string), męczyłem się z nim ze 4 dni.

3. Więcej błędów nie pamiętam ...

Rozwiązywanie błędów to szansa na zdobycie cennego doświadczenia, które przyda się w przyszłości.

Logger

Dzisiaj zabrałem się za stworzenie Loggera ale za nim to zrobiłem przemyślałem pewną istotną kwestię dotyczącą jego implementacji, a mianowicie czy powinien być zintegrowany z klasami silnika(czy ma być wewnątrz klasa i logować co one robią w swoich metodach), nie byłoby to jednak dobre rozwiązanie. Po pierwsze musiałbym przebudować to co wcześniej napisałem. Po drugie logować wszystko to nie najlepszy pomysł, więc Logger jest oddzielony od reszty i stanowi odzielną jednostkę, dodatkowo jest wielowyjściowy(można na razie wypisywać log na konsole i do pliku, ale w przyszłości udostępnię również logowanie do pliku .html czy .rtf). Jeszcze słów kilka o koncepcji Error Handlera,  zrezygnowałem z niego, bo wiązałoby się to z wielkimi zmianami w kodzie (i tak nie dałby mi za dużo:)). 

wtorek, 14 września 2010

Koncepcja Loggera i Error Handlera

Od kilku dni myślę o dodaniu do silnika Loggera, który jak sama nazwa wskazuje zapisuju przebieg programu. Jest to bardzo pomocne narzędzie w wykrywaniu błędów różnego rodazaju:
  • Logiczne(czy funkcje są wykonywane w odpowiedniej kolejności);
  • Wykonania(możemy wykryć gdzie  program wywala na pulpit);
  • U klienta(gdy urzytkownicy korzystają z naszego produktu i mają błędy możemy je wykryć i naprawić).
Logger zastępuje zewnętrzny debuger(w niektórych aspektach), upraszcza pisanie w początkowej fazie projektu( możemy wyniki kierować do loga, jeśli nie mamy innej możliwość np. nie ma funkcji do rysowania tekstu) .

Teraz po co nam Error Handler(uchwyt błedów):
  • przyda się, bo możemy zobaczyć jaki wystąpił ostatni błąd za nim program się wyłączył(zapisujemy go zawsze do loga automatycznie)
  • można zrobić listę błędów jakie wystąpiły
  • inne zalety to ...

niedziela, 12 września 2010

Pierwsze testy

Przez ostatnich kilka dni robiłem trochę testów wydajnościowych itp., wypadły całkiem nieźle:
Przy rysowaniu 48 obrazków 100x100 mam 2500 FPS;
Przy rysowaniu 500 obrazków 100x100 mam 60 FPS.
Obecnie będę kończył rdzeń graficzny:
Dodam klasy odpowiedzialne za animacje, sprite-y itp.
Potem przejdę do tworzenia klas odpowiedzialnych za wejście(klawiatury,myszki i joystika).

środa, 18 sierpnia 2010

Czas zacząć pisać kod !!!

Ostatnio tylko projektowałem klasy i interfejsy mojego silniczka, teraz trzeba to wszystko wcielić w życie i pisać tysiące linii kodu, cóż takie jest już życie programisty:). Zaczynam od najprostszych elementów, czyli klas pomocniczych. Jedną z nich jest CSAllegroController - "S" w nazwie sugeruje, że jest to klasa typu singleton, 
czyli może istnieć tylko jeden taki obiekt w całym silniku. Klasa jest "nakładką"  na wszelki inicjalizacje i instalacje w Allegro(zawiera tablice w której będą znajdowały się informacje o bieżących zainicjowanych elementach Allegro np. czy zainstalowano obsługę klawiatury, myszki itp.). Klasa, będzie pomocna również, gdy   będziemy chcieli dowiedzieć się jaki interfejsem Allegro posługuje się przy obsłudze plików(podstawowym czy PhysicsFS). CSAllegroController nie trzeba używać na zewnątrz, będzie ona używana tylko wewnątrz silnika.

Jeszcze na temat implementacji w postać singletona:
  • Jest to technika programistyczna pozwalająca na to, że w naszym programie będzie istnieć tylko jeden egzemplarz naszej klasy.
  • Jest to możliwe dzięki statycznemu wskaźnikowi na tę klasę, który jest w niej zawarty, a dostęp do niego uzyskujemy przez statyczną metodę która go zwraca.
Singleton.h
#pragma once
#include
class  Singleton
{
private:
         // statyczny wskaźnik na klasę 
static Singleton * m_Singleton;
public:
static Singleton * GetSingleton();
Singleton();
~Singleton();

};




















// składowe statyczne trzeba deklarować w globalnym obszarze nazw





Singleton * Singleton::m_Singleton;



Singleton SingletonOne; // Tworzymy jedyny obiekt 





Singleton.cpp









#include "Singleton.h"

Singleton::Singleton()
{
        // Sprawdzamy czy nie stworzono już obiektu, czy wskaźnik jest pusty
assert(!m_Singleton);
       // Jeśli tak to inicjujemy go obecnym obiektem
m_Singleton = this;
}


Singleton::~Singleton()
{
        // Sprawdzamy czy obiekt istniej, czy nie jest to pusty wskaźnik
assert(m_Singleton);
       // jeśli nie jest pusty to doprowadzamy go do tego stanu
m_Singleton = 0;
}

static Singleton::Singleton * GetSingleton()
{
        assert(m_Singleton);
        // zwracamy wskaźnik na jedyny obiekt tej klasy
        return m_Singleton;
}


Edit: Słusznie ta implementacja nie jest taka dobra, ale znalazłem lepszą:
http://users.v-lo.krakow.pl/~temporal/SCGame/html/v-lo/arts/inf/singleton.html


Implementacja Scotta Bilasa