Author Archive

Sztuczny Device Lost w Viście

Zajmując się ostatnio moim silnikiem, natrafiłem na jedną bardzo ciekawą zaletę Visty. Otóż przypadkiem odkryłem jak sztucznie wywołać utratę urządzenia w DirectGraphics. Wystarczy do tego użyć Ctrl + Alt + Del, gdyż Vista w tym momencie przechodzi na ekran wyboru czynności, więc prawdopodobnie przejmuje całkowitą kontrolę nad urządzeniem, czego skutkiem (pewnie ubocznym) jest utrata urządzenia.

Mnie ta sztuczka się bardzo przydała, ponieważ dzięki temu wykryłem, że miałem problem z odzyskiwaniem urządzenia.

Assert

Ostatnio dowiedziałem się o bardzo fajnej funkcji jaką udostępnia biblioteka standardowa, czyli o funkcji Assert. Funkcja ta ma tę zaletę, że warunek, który jej przekazujemy jest sprawdzany tylko, gdy jest umieścimy definicje NDEBUG. Wtedy, gdy warunek zwróci fałsz, zostaje wyświetlone okienko, gdzie i kiedy miało zdarzenie. W przeciwnym wypadku, gdy nie zdefiniujemy NDEBUG, sprawdzanie warunku po prostu znika, dzięki czemu osiągamy większą wydajność.

Oczywiście standardowa makrodefinicja nie jest idealna, ponieważ wyświetla różne rodzaje okienka w zależności od tego, czy używamy main czy WinMain. Ale napisanie swojego odpowiednika tej funkcji nie nastręcza problemów, wystarczy się przyjrzeć makrodefinicji zawartej w pliku assert.h. Polecam również artykuł w książce Perełki Programowania Gier część pierwsza, rozdział 1.12. Są tam świetne porady na ten temat.

Moduł 2D

Postanowiłem napisać do mojego silnika moduł 2D, gdyż od jakiegoś czasu mnie nosiło, aby napisać symulacje rzutów fizycznych (głównie ukośnego – pewnie przez to, że zbliżają się matury). Po raz pierwszy jednak udało mi się napisać własny shader, co uważam za niebywałe osiągniecie, chociaż jedyną czynnością jaką on wykonuje jest wyświetlenie tekstur. Wracając do modułu. Jest on bardzo prosty, ponieważ składa się tylko z 2 klas: ImageBox oraz Image. Klasa ImageBox jest pojemnikiem na obiekty typu Image. Jej zadaniami są:

  • Tworzenie i likwidacja obiektów Image
  • Zarządzanie wewnętrznym Vertex Bufferem
  • Zarządzanie shaderem (który służy tylko do próbkowania tekstury)
  • Likwidacja i przywracanie zasobów na czas resetowania urządzenia

Funkcja rysująca i zestaw funkcji do manipulowania obrazkami są dostępne w klasie Image, dzięki czemu można samodzielnie kontrolować czy obrazek ma zostać narysowany oraz co zostanie zmienione. Z racji tego, że przed narysowaniem czegokolwiek, konieczne jest ustawienie shadera, rysowanie odbywa się w bloku BeginPainting() (…) EndPainting(). Podobnie jest z manipulacją obiektami, gdyż trzeba zablokować VertexBuffer.

Oto prosty przykład zastosowania tego modułu w “symulacji” rzutu ukośnego.

Download – wymaga sm 1.1

Kolejna notka z cyklu “Po konferencji IGK”

Nawiążę (a przynajmniej tematem), do notek innych posiadaczy bloga, którzy uczestniczyli w konferencji IGK. Było to moje pierwsze uczestnictwo w konferencji i muszę stwierdzić, że warto było pojechać. Nie ma to jak spotkanie w realu z ludźmi, z którymi codziennie się rozmawia na kanale, identyfikuje po nickach (choć na konferencji też tak było). Zapewne jak co roku, Reg bądź Xion napiszą sprawozdanie z konferencji, więc ja nie będę tego robił, ponieważ i tak byłoby one niepełne. Sam nie mogę się doczekać zdjęć, filmów głównie z tych części, na których mnie nie było.

Teraz pozostało tylko czekać rok na kolejną edycję. Mam nadzieję, że tym razem będę do końca.

Zmiany na lepsze?

Postanowiłem, że należałoby wreszcie zrobić porządek z biblioteką NLib oraz z silnikiem NIne. Niestety jak się okazało przy projektowaniu gry (myślę nad klonem Tetrisa w 3D), aktualny stan silnika nie pozwala na jego rozbudowę i pisanie w oparciu o niego jakiejkolwiek gry. Dlatego stwierdziłem, że lepszym pomysłem byłoby zaprojektować grę, a następnie do niej odpowiedni interfejs, mając na uwadze ponowne użycie kodu do tworzenia innych gier.

Na początek zająłem się biblioteką NLib. Zamierzam kompletnie uniezależnić się od wyjątków, ponieważ uważam, że są one dobre do zwykłych programów, w których występuje wiele sytuacji wyjątkowych. W grze są niepotrzebne, gdyż jeżeli nastąpi sytuacja wyjątkowa, to grę i tak należy zamknąć, a poza tym podobno obsługa wyjątków spowalnia kod. Zamiast tego błędami będzie sie zajmował Logger, do którego będą trafiać wszystkie komunikaty (nawet te najmniej ważne), dzięki temu będzie wiadomo co i kiedy poszło nie tak. Dlatego będzie wymagany do używania jakiegokolwiek modułu z biblioteki.
Ważną zmianą jest też wprowadzenie obsługi Unicode. Niestety standardowe strumienie zapisujące do plików, nie zapisują ich w tym kodowaniu, dlatego zacząłem pisać własny strumień oparty na funkcjach WinApi. Z początku będzie obsługiwał tylko Little Endian, ale myślę nad dodaniem obsługi plików zapisanych jako Big Endian i ANSI (w trybie Unicode projektu). Z tego strumienia będzie korzystał również Logger. Oczywiście Unicode będzie obsługiwany tylko wtedy, gdy w ustawieniach projektu kodowanie będzie w tym trybie. W trybie ANSI, strumień będzie zapisywał tylko w ANSI.

Uważam, że należy iść z duchem czasu, a nie pozostawać w epoce kamienia łupanego :D.

Problemy z plikami afxres.h oraz winres.h w Visual C++ EE 2008

Mała porada dla tych, którzy chcą otworzyć stare projekty, które zawierają pliki *.rc.
Przy próbie kompilacji takich projektów, może wyskoczyć błąd, który oznajmia, że nie mamy plików podanych w tytule.

Rozwiązanie jest proste, wystarczy nazwę tego pliku podmienić na windows.h. Dzięki temu można korzystać z zasobów ładowanych do pliku *.exe. (Sprawdzałem tylko na prostym projekcie z książki Programowanie w DirectX Masona McCuskey’a).

W Visualu C++ EE, zablokowana jest możliwość otwierania plików *.rc, jednak nie tak do końca, albowiem wystarczy kliknąć na takim pliku prawym przyciskiem myszy, a następnie wybrać Open with… i w oknie wybrać Source Code (Text) Editor. Według mnie zawsze jest to jakieś rozwiązanie.
EDIT: wystarczy kliknąć na takim pliku prawym przyciskiem myszy i opcję View Code. Thx Tarains.

Spotkałem się również z takim problemem, jak brak zdefiniowanej stałej IDC_STATIC (używanej do tworzenia szablonów okien dialogowych).
Kod błędu:
error RC2104 : undefined keyword or key name: IDC_STATIC

W takim przypadku należy do pliku resources.h dodać następujący kod:

#ifdef IDC_STATIC
#undef IDC_STATIC
#endif
#define IDC_STATIC (-1)

Clever

Fotka clever
Od jakiegoś czasu stacja komercyjna TVN emituje program o znaczącej nazwie “Clever – widzisz i wiesz”. Muszę przyznać, że jest on całkiem fajny. Prowadzący doświadczenia “profesor” Halama wyjaśnia zjawiska bardzo przystępnie (może trochę jak do dzieci) i są to ciekawostki warte uwagi. Wszystkie doświadczenia są dobrze zaprezentowane, z drobną dawką humoru. Myślę, że mogę polecić go każdemu :).

O wydajności

Reg spłodził ostatnio ciekawy artykuł o wydajności wczytywania tekstur. Bazuje on na teście, który on sam przeprowadził, co ciekawe, przy którym restartował kompa n-razy. Muszę przyznać, że inicjatywa, choć pracochłonna, na pewno się opłaciła, ponieważ po przeczytaniu artykułu, nie muszę się martwić o to, jak zoptymalizować wczytywanie tego typu plików. Mogę od razu powiedzieć, że najlepszym według mnie formatem będzie DDS z mipmapami generowanymi po załadowaniu (nie wczytywane z pliku) + własny VFS z kompresją danych. Wbrew podsumowaniu Rega nie zastosuję formatu JPEG, ponieważ nie lubię stratnej kompresji :).

Link do artykułu

PS. Więcej takich inicjatyw :).

Geek syndrome

Ostatnio na kanale wywiązała się ciekawa dyskusja na temat dziwnej choroby jaką jest Zespół Aspergera. Postanowiłem się przyjrzeć temu dziwnemu schorzeniu i natychmiast zauważyłem, że niektóre objawy idealnie pasują do mnie.

Oto kilka z nich:
– lubię kolekcjonować różne rzeczy (chociaż na to już się trochę uodporniłem),
– lekka aspołeczność, ale to raczej z przyzwyczajenia, ponieważ jestem jedynakiem,
– informatyka :),
– używam skrótów myślowych i ciężko jest mnie zrozumieć.

Pomimo tego, że kilka z objawów się zgadza, nie czuję, że jest ze mną źle, a przynajmniej mogę poszczycić się doborowym towarzystwem (Einstein, Newton). Niestety wadą tego jest, że nie zwalnia matury z polskiego ;).

Co nowego?

Czas ferii jak wiadomo powinien być czasem wolnym, przeznaczonym na odpoczynek, ale jak wiadomo takich durnych pomysłów nigdy się nie realizuje, więc i ja tego nie zrobiłem.
Początek ferii zaczął się paradoksem, otóż trzeba było przygotować prezentację na historię (oczywiście nic za darmo :) ). Na szczęście cel udało się zrealizować szybko, choć przy 38 stopniach gorączki było to nie lada wyczynem, ponieważ przygotowywałem ją wraz z kilkoma kolegami.
Następnym punktem programu ferii było drugie podejście do egzaminu praktycznego na prawo jazdy, które zakończyło się wynikiem pozytywnym. Wszystkich z Myszkowa i okolic proszę uprzejmie informuje, że od lutego należy się bardziej rozglądać na drodze :D.
Koniec ferii to wypad do Białki Tatrzańskiej na narty, pogoda była dobra (idealna to -6 C), zabawa przednia, polecam.

Oczywiście czas ferii nie zleciał mi tylko na tym, co wymieniłem wyżej. Już przed feriami zacząłem się interesować shaderami. Zainwestowałem w książkę “Język Cg”, ale stwierdziłem jednak, że potrzebuję nie tylko wiedzy o samych shaderach, ale również o sposobie ich implementacji, dlatego postanowiłem przeczytać cały dział Programming Guide z pomocy DXSDK. Zadanie długie, ale myślę, że się opłaci.

Oto pierwszy przykład użycia przeze mnie efektów DirectX (na podstawie sampla BasicHLSL).

Pobierz