Zaawansowane rysowanie tekstu w C#Pisząc różnego rodzaju aplikacje (i gry), chcielibyśmy czasami mieć większa możliwość dostosowania parametrów rysowanego tekstu niż tylko krój, rozmiar i kolor. W .NET jest to bardzo proste -- pokażę dzisiaj jak łatwo można to osiagnać za pomocą GraphicPath.
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ąć.
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ą.
Compo 3hW 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:
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.
Internet Explorer, png i gammaKiedyś podczas testowania strony w IE okazało się, że pojawił się bardzo dziwny błąd -- obrazy zapisane w plikach png i plikach jpg miały inne odcienie.
Layout został pocięty na mniejsze części i w zależności od zawartości zapisywałem je w odpowiednim formacie (większość grafik przygotowuję w Paint.net). Niestety okazało się, że rezultaty są dziwne:

Bardzo prymitywnym rozwiązaniem było przerobienie wszystkiego na tylko jeden format, ale przez pewien czas się sprawdziło. Przyszedł jednak taki moment, że potrzebowałem nałożyć obraz z przezroczystym tłem (png) na główne tło (jpg) i trzeba było rozwiązać problem.
Jak się okazało, problemem jest chunk gAMA, który jest zapisywany przez Paint.net w plikach png. W GIMP-ie możemy po prostu go nie zapisać i wszystko będzie poprawnie. Nie wiem jednak jak jest w przypadku pozostałych programów graficznych. Chunk ten jest też dodawany gdy zapisujemy obraz w .NET metodą Bitmap.Save, której prawdopodobnie Paint.net używa.
Jeśli mamy już "felerne" pliki, to rozwiązanie jest bardzo proste -- wystarczy pobrać program TweakPNG, a w nim z plików png usunąć chunka gAMA. Zawsze można też otworzyć plik w GIMPie i zapisać bez niego ;)