Compo 3h

15.04.2009 @ 22:39:12 by Rafał Kozik | .NET C# gamedev warsztat programowanie

W poprzedni weekend na warsztacie zostało zorganizowane trzygodzinne compo.

Jeszcze nigdy nie brałem udziału w tak krótkim pisaniu gry na czas, ale postanowiłem, że zobaczę co z tego wyjdzie. Ostatecznie zająłem 2 miejsce i jestem z tego zadowolony.

Gra (oczywiście niedokończona ;)), którą pisałem była klonem crimson landa i wypadła nienajgorzej. Całkiem ciekawe wydają mi się szczegóły techniczne, bo jadąc do domu na święta nie miałem dostępu do swojego kodu i pisałem kompletnie od zera:

  • całość pisana w C# i GDI+ (standardowe rysowanie obiektem Graphics)
  • litery w 'intro' i 'outro' są zapisywane podczas preprocessingu do osobnych bitmap
  • podczas gry nie jest używana rotacja (która to byłaby dość wolna), ale podczas wczytywania danych generuję sporą ilość obróconych wersji robotów i pocisków
  • gdy robot jest niszczony, śmieci po nim pozostające zostają wkomponowane w bitmapę tła

Ciekawostką jest też to, że na procesorze C2D 1.8 GHz, użycie procesora według Menadżera zadań Windows nie przekracza 2%. Jak widać proste gry można spokojnie robić bez jakiejkowiek akceleracji ;)

Grę można zobaczyć tutaj.


Wynalazek zwany PIMPL

06.04.2009 @ 23:04:34 by Rafał Kozik | programowanie C++

Pisząc biblioteki w C++ często można natrafić na problem wytworzenia wystarczająco dobrej enkapsulacji. Definicje klas, znajdujące się w plikach nagłówkowych, często pokazują za wiele: wszystkie prywatne pola i metody, które moglibyśmy chcieć ukryć. Dodatkowym problemem jest to, że praktycznie każda zmiana w implementacji wymaga zmiany definicji klasy, a to często przekłada się na konieczność ponownej kompilacji całego projektu.

Okazuje się, że istnieje bardzo proste rozwiązanie tego problemu -- PIMPL (private implementation):

// plik object.h

class ObjectImpl;

class Object
{
    ObjectImpl* impl;
public:
    Object();
    ~Object();

    int SampleMethod(int x);
};

// plik object.cpp

class ObjectImpl
{
    // Właściwa implementacja
};

Object::Object()
{
    impl = new ObjectImpl();
}

Object::~Object()
{
    delete impl;
}

int Object::SampleMethod(int x)
{
    return impl->SampleMethod(x);
}

Oczywiście wypdałoby jeszcze dopisać konstruktor kopiujący i operator przypisania jeśli to konieczne.

Dodatkowo, można zmienić całkowicie implementację, a dla użytkowników klasy wszystko będzie wyglądać dokładnie tak samo. Jako lekturę uzupełniającą polecam to i stary wątek na forum gamedev.pl.