Przerwa? Nie ma tak dobrzeJuż od miesiąca nie pojawił się żaden nowy wpis na stronie -- wyjazd wakacyjny sprawił, że się trochę rozleniwiłem. Wygląda jednak na to, że się to już poprawia.
Niedługo powinny pojawić się jakieś ciekawe informacje i może uda mi się w końcu przygotować minirecenzję laptopa Hp Pawilon tx2650ew i ciut dłuższy wpis na temat serializacji plików XML w C#. W międzyczasie dłubię przy swoich projektach, jednak po pracy jest na nie zdecydowanie za mało czasu i nie mam pojęcia kiedy będę mógł coś zaprezentować.
Freedoku w wersji do drukuPlansze z freedoku można wydrukować, ale czy nadają się one do druku na ulotce, gazecie itp.? Nie bardzo. Wersja na stronie do druku jest specjalnie uproszczona (oszczędzanie tuszu / tonera) i drukowaniem zajmuje się tak naprawdę przeglądarka.
Potrzebowałem planszę do druku z 300 DPI, a to wymaga przygotowania grafiki w odpowiedniej rozdzielczości -- zwykłe przeskalowanie nie da wystarczająco dobrych rezultatów.
Napisałem program, który generuje plansze z freedoku dla zadanego DPI i boku planszy w cm, a efekt wyszedł całkiem pozytywny. Plansza o boku 7 x 7 cm przy 300 DPI wygląda tak:
Całość zaimplementowana w C#, przy okazji opiszę pewnie jakieś wskazówki odnośnie robienia podobnych rzeczy. A do czego mi potrzebne takie grafiki? W ciągu kilku tygodni powinna pojawić się na to pytanie odpowiedź ;).
Zdradzieckie DPI w plikach PNGBiblioteka GDI+ stara się być czasami sprytniejsza niż byśmy tego chcieli i podczas rysowania uwzględnia informację o DPI zawartą w pliku (jest to chunk pHYs), co czasami może przełożyć się na dziwne rezultaty. Jak dziwne? Weźmy jedną grafikę i narysujmy ją z DPI 72, 96 i 300, efekt jest taki:

Może się przez to okazać, że nasze narzędzia generujące grafiki będą dawać dziwne rezultaty. Na dodatek standardowo używane jest DPI z ustawień systemu (standardowo 96), które użytkownik naszego narzędzia może mieć zmienione.
Niektóre narzędzia przetwarzające obrazy zapisują błędnie informację o DPI, o czym przekonałem się parę dni temu, gdy 1/3 grafik testowych (które sam kiedyś tworzyłem) miała złe DPI.
Jak można temu zaradzić? Jako, że nas będą interesować tylko piksele, możemy zmienić DPI wczytanego obrazu za pomocą metody SetResolution i tak samo zrobić dla obrazu, który generujemy -- dzięki temu wszystkie będą miały takie samo DPI i problem powinien zniknąć.
iPod TouchNiedawno stałem się posiadaczem iPoda Touch (pierwsza generacja). Jako, że uznałem, że nowy sprzęt jest zbyt drogi, kupiłem używanego na allegro w bardzo dobrym stanie i atrakcyjnej cenie. Taki sprzęt można już upolować za ~350 zł.
Do niedawna patrzyłem na iPoda Touch jako na drogą zabawkę, która nie ma dużo więcej zastosowań niż przeciętny odtwarzacz, a w wygodę i sensowność grania nie bardzo wierzyłem. Okazuje się, że się myliłem i sprzęt bardzo pozytywnie mnie zaskoczył.

Fullmetal Alchemist BrotherhoodTym razem coś trochę innego -- chciałbym polecić anime Fullmetal Alchemist Brotherhood ;)
Przez lata oglądałem wiele różnych anime i zdecydowanie w moje gusta bardziej trafiają te trochę mniej ambitne i o lżejszej tematyce (nie, Pokemon się nie kwalifikuje ;>). Kilka lat temu oglądałem anime Fullmetal Alchemist, jednak pozostał spory niedosyt -- tylko do pewnego momentu było związane z mangą, później niestety było jakieś takie mniej spójne i było czuć, że czegoś brakuje.
W tym roku zaczęło powstawać nowe anime, tym razem oparte w pełni na mandze. Muszę przyznać, że zrobiło na mnie duże wrażenie -- począwszy od jakości animacji, kończąc na tempie akcji i spójności fabuły (choć tu zdarzają się drobne wpadki). W tej chwili jest już 20 odcinków i kolejne pojawiają się raz w tygodniu.
Najciekawsze jest to, że można oglądać je w pełni legalnie i za darmo za pośrednictwem serwisu youtube. Na dodatek dostępne są polskie napisy.
Na koniec czołówka dla zachęty ;)
Odtwarzanie dźwięku za pomocą MCIXion pisał ostatnio o odtwarzaniu dźwięku za pomocą PlaySound. Jak dla mnie, ta metoda ma jedną ogromną wadę -- nie pozwala na odtworzenie wielu dźwięków jednocześnie.
Okazuje się też, że dźwięk możemy odtwarzać za pomocą MCI (Media Control Interface). W MSDN można znaleźć szczegółowe informacje na temat użycia. W dalszej części prosty przykład, który potrafi coś odtworzyć.
Dwa nowe projektyPowoli pracuję teraz nad dwoma projektami, o których jeszcze nie było wspominane. Czas najwyższy to zmienić.
GraphIt (zalecana wymowa 'po naszemu' to po prostu grafit ;)) jest biblioteką dla .NET wspierającą rysowanie różnego rodzaju grafów i diagramów. Będzie stanowiła część mojej pracy magisterskiej i docelowo będzie udostępniona na licencji LGPL. Z powodu kilku problemów technicznych powstaje wolniej niż się spodziewałem, ale powinno się to już zmienić. Mam nadzieję, że w przyszły weekend będę mógł pokazać screeny z jakiegoś prostego użycia.
Jestem w trakcie okrajania Wombata, żeby stał się trochę lżejszy i łatwiejszy w użyciu. Trochę rzeczy w oryginalnym projekcie było zrobionych nie do końca dobrze, brakowało też m.in. obsługi dźwięku, którą trzeba w końcu dodać. Przy okazji pracuję nad większym odseparowaniem rzeczy związanych z konkretnym systemem operacyjnym i renderer jest przenoszony na OpenGL. Biblioteka wciąż będzie zamknięta, ale możliwe, że niedługo pojawią się jakieś małe gierki oparte na tej bibliotece (ale za wcześnie jeszcze na szczegóły).
Wszędzie dobrze, ale na localhost najlepiejStrony internetowe zdecydowanie szybciej implementuje się pracując na localhost, zwłaszcza z gotowymi pakietami WAMP, np. XAMPP. Niestety pojawia się kilka problemów, przez które nie jest to aż tak wygodne jakby się chciało.
Pierwszym problemem są subdomeny -- jeżeli pracujemy na czyimś kodzie, gdzie odwołania do plików graficznych/css/podstron zaczynają się po prostu od / będzie nieciekawie. Jeżeli nasza aplikacja będzie na http://localhost/test/, to plik /logo.png jest rozpoznawany jako http://localhost/logo.png. Niby możemy przenieść całą aplikację do głównego katalogu serwera, ale nie jest to zbyt wygodne przy dłuższej pracy.
Drugim problemem jest współpraca z innymi aplikacjami znajdującymi się na domenie, na której będzie docelowo znajdować się aplikacja. Najłatwiej jest ją zrealizować przez ciasteczka (np. sprawdzenie czy użytkownik jest zalogowany). Niestety (a właściwie dobrze) przeglądarki ze względu na bezpieczeństwo, nie pozwalają każdemu odczytywać ciasteczek -- musi się zgadzać domena.
Jak można sobie z tym łatwo poradzić? Odpowiedź na to pytanie znajduje się w dalszej części.
Wakacji początek i... koniecPrzez cały ostatni miesiąc miałem sporo roboty -- koniec semestru, projekty zaliczeniowe, egzaminy. Dzisiaj pojawiły się wyniki ostatniego z nich, więc oficjalnie można powiedzieć, że mam (zasłużone) wakacje :).
Skoro, jak głosił napis z plakatu pewnego filmu (ciekawe czy ktoś go jeszcze pamięta), everything that has a beginning has an end, moje wakacje właśnie dobiegły końca. Jutro zaczynam pracę w Nokia Siemens Networks i mam nadzieję, że będzie ciekawie.
Powinienem znaleźć też trochę czasu na napisanie ciekawszych wpisów, które od jakiegoś czasu czekają w kolejce ;). Czas też zabrać się za pisanie projektu związanego z pracą magisterską, żeby nie robić tego na ostatnią chwilę. Nie będzie to nic bezpośrednio związanego z gamedevem, a coś więcej na ten temat napiszę tu pewnie w sierpniu.
Extension methods w C#W prawie każdym projekcie można znaleźć statyczną klasę/klasy pomocnicze, które zawierają operacje na jakiś danych, ale nie są obiektem w klasycznym sensie. Przykład takiej klasy:
static class Helper
{
public static string SHA1(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
string hash = BitConverter.ToString(sha1.ComputeHash(buffer));
return hash.Replace("-", "");
}
}
Używamy tego tak:
string sha1 = Helper.SHA1(password);
Jak zrobić, żeby pisać mniej kodu i było wygodniej i czytelniej? W C# 3.0 zostały wprowadzone Extension methods, które nam w tym pomogą.