Problem z multi-touch w Nexus OneDzisiaj będzie trochę gdybania ;) Zrobiło się głośno o tym, że Nexus One 'gubi się' przy obsłudze multi-touch. Google obwinia HTC za użycie niskiej jakości ekranu dotykowego. Niestety wydaje mi się, że nie uda się tego rozwiązać w aktualizacji oprogramowania. Dlaczego? O tym w dalszej części.
Multi-touchOdkąd pierwszy raz miałem styczność z multi-touch, polubiłem tę technologię. Moim zdaniem świetnie sprawdza się w urządzeniach mobilnych, gdzie m.in. jest idealna do powiększania i zmniejszania zawartości ekranu.
A jak wygląda to po stronie developera? Sprawdziłem jak to jest w przypadku iPhone SDK -- są co najmniej dwa sposoby na realizację obsługi multi-touch.
Jeżeli interesuje nas obsługa powiększania to do tego celu powinna nadać się kontrolka UIScrollView, która ma już wbudowaną obsługę tego typu interakcji.
Dla osób, które potrzebują większej kontroli nad danymi, możliwy jest bezpośredni dostęp do danych o dotyku. W widoku możemy zaimplementować metody touchesBegan, touchesMoved, touchesEnded. Jako parametr dostajemy listę UITouch*, skąd możemy dowiedzieć się o aktualnym (locationInView) i poprzednim (previousLocationInView) miejscu dotyku.
Wystarczy tego pisania, idę sobie podotykać ;)
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.
Połowiczny fanboy AppleMuszę to przyznać -- zostałem po części fanboyem Apple i nawet nie jest mi z tym źle ;)
Kilka miesięcy temu kupiłem sobie iPoda Touch i od tamtej pory nie rozstaję się z tym sprzętem. Ciężko przekonać do niego kogoś, kto nie miał z nim dłuższej styczności -- to świetne urządzenie do przeglądania sieci, poczty i gier.
Dzisiaj Apple zaprezentowało nowe urządzenie -- iPad. W skrócie: to co iPod Touch tylko większe i więcej ;) Bardzo przypadł mi do gustu ten sprzęt i mam nadzieję, że niedługo stanę się jego posiadaczem.
A dlaczego tylko połowiczny fanboy? Mimo tego, że w ostatnich czasach miałem sporą styczność ze Snow Leopardem, nie mogę się przekonać do tego systemu. Zdecydowanie wolę Windows 7, tak samo jak preferuję mojego Tablet PC niż jakikolwiek komputer od Apple.
Dlaczego nie warto używać Dev-C++Często wracającym tematem na warsztacie są mniejsze lub większe problemy z działaniem / używaniem Dev-C++. Rozpoczyna się wtedy święta wojna zwolenników i przeciwników tego narzędzia. Jest to sytuacja o tyle dziwna, że o ile typowy flame w stylu Windows vs Linux lub DirectX vs OpenGL ma jeszcze jakiś sens i można podać sensowne argumenty dla każdej ze stron, o tyle bronienie Dev-C++ jest poważnym błędem i powinno być karalne.
Tak, Dev-C++ jest zły. Nie mówię, że taki był zawsze -- sam kiedyś z niego korzystałem, tak samo jak wiele innych osób, które są teraz jego przeciwnikami. Co sprawia, że to narzędzie wywołuje aż takie skrajne emocje?
Problem jest o tyle duży, że dużo początkujących programistów trafia na Dev-C++ jako polecane środowisko w tutorialu bądź książce. Ostatnio spotkałem się też z sytuacją, gdzie w jednym z Wrocławskich liceów używają tego archaicznego narzędzia.
Jeżeli dla kogoś jedynym powodem zostania przy Dev-C++ jest to, że go już poznał, to czas, żeby poznać coś nowego. To będzie musiało i tak prędzej czy później nastąpić, skoro nie jest od lat rozwijany. Zawsze można spróbować Visual C++ Express, Eclipse, Code::Blocks (na stronie jest stara wersja, aktualną można znaleźć tutaj) albo NetBeans.
Generowanie sudokuNajwiększym (choć wcale nie tak dużym) wyzwaniem podczas robienia sudoku jest generowanie planszy. Musimy zadbać o to, żeby plansz było dużo, żeby były poprawne (i miały jedno, unikalne rozwiązanie) i żeby można było wybrać poziom trudności. Okazuje się, że rozwiązanie jest bardzo proste i powinno zadowolić każdego.
Jak więc wygląda to proste rozwiązanie? Weźmy dowolną planszę o odpowiednim poziomie trudności i przeróbmy ją tak, żeby wyglądała na unikalną. Gracze nie powinni zauważyć różnicy. Jeszcze tylko trochę terminologii -- grupami pionowymi (poziomymi) będę nazywał grupy trzech kolejnych kolumn (wierszy) na planszy. Mamy więc trzy grupy pionowe i trzy grupy poziome. Sposób w jaki należy przerabiać planszę:
Zatem planszę można przerobić na 609 499 054 080 sposobów. Sporo, prawda? Oczywiście nie wszystkie są unikalne (np. gdy plansza ma dwie puste kolumny), ale jest tego wystarczająco dużo. Łatwo zauważyć, że plansza będzie wciąż poprawna i poziom trudności zostanie zachowany. Teraz wystarczy dla każdego poziomu trudności przypożądkować kilka plansz 'startowych' i mamy kompletny system generowania sudoku. Pozostaje tylko jedno pytanie -- skąd wziąć plansze startowe i jak ocenić ich poziom trudności? W sieci można znaleźć różnego rodzaju strony, które rozwiązują sudoku, niektóre z nich podają też ocenę trudności. Pozwala to już na dość dobre zbudowanie bazy plansz 'startowych' i zapewnienie, że żadne z nich nie są izomorficzne ;)
Nie takie iPhone SDK straszne jak je malująWspomniałem ostatnio, że będę pisał więcej w związku z projektami nad którymi powoli pracuję. Na razie nie ma co pokazywać, więc postanowiłem napisać kilka słów o tym jak wygląda praca przy pisaniu czegoś na iPhone i ewentualnie dać jakieś drobne wskazówki.
To co może na samym początku przestraszyć to Objective-C. Na szczęście nie jest to problem, bo bardzo łatwo jest łączyć ten język z funkcjami pisanymi w C/C++. Przez to stanowi on tylko spoiwo między aplikacją (a przynajmniej w moim przypadku) a urządzeniem. W tej chwili większość kodu Objective-C w moim projekcie to szkielet aplikacji OpenGL ES dostarczany z xcode -- nie jest tego dużo i w żaden sposób nie przeszkadza w normalnej pracy. Jeżeli potrzebna jest jakaś funkcjonalność z systemu, w sieci można znaleźć gotowe kawałki kodu.
Do uruchomienia swojego kodu na iPhone przygotowywałem się już od jakiegoś czasu -- przeniosłem rendering z Direct3D do OpenGL ES 1.0 i zrobiłem spory refactoring. Gdy położyłem już swoje ręce na odpowiednim sprzęcie, uruchomienie na symulatorze zajęło jeden dzień. Po tym jak zapłaciłem za dostęp do programu developerskiego wystarczył jeden wieczór (spędzony na generowaniu certyfikatów), żeby uruchomić na sprzęcie. Spodziewałem się, że zajmie mi to więcej czasu, ale na szczęście poszło dość sprawnie -- w sumie nic dziwnego, bo na razie nie robiłem nic zaawansowanego.
Aktualnie projekt ściągnięty z repozytorium kompiluje się bez problemów pod xcode jak i w Visual Studio pod Windows. Zdecydowanie wolę pracę z tą drugą platformą i taka przenośność jest bardzo wygodna. Przydaje się implementacja OpenGL ES pod windows, żeby mieć pewność, że obejdzie się bez problemów.
Żeby nie było, że smęcę bez sensu i tylko korzystam z tego co znajdę gotowe w sieci, poniżej zamieszczam dwa kawałki kodu w dziwacznym języku, które mogą się komuś przydać. Nic odkrywczego, ale od czegoś trzeba zacząć ;)
// ukrycie górnej belki aplikacji, do użycia w widoku [[UIApplication sharedApplication] setStatusBarHidden:YES];
// pobranie nazwy katalogu, w którym znajdują się zasoby
const char* getResourcesPath()
{
NSString* path = [[NSBundle mainBundle] resourcePath];
return [path UTF8String];
}
Postanowienia noworoczneZ końcem każdego roku miałem postanowienie, że w kolejnym będzie lepiej. Jakoś nigdy nie miałem konkretnej listy celów, które chcę osiągnąć, więc ciężko oceniać czy rok był udany czy nie.
Żeby mieć się z czego za rok rozliczać, garść postanowień:
Nie jest tego za dużo, ale przynajmniej będzie można łatwo to zrealizować. Mam nadzieję, że taka deklaracja planów choć trochę mnie zmotywuje do ich realizacji ;)
Podsumowanie rokuZa kilka dni zbliża się koniec roku i nic ciekawego już się raczej nie wydarzy, więc czas na małe podsumowanie ;)
Trochę się w tym roku działo, a kolejny zapowiada się jeszcze ciekawiej -- co z tego wyjdzie? Czas pokaże :)
Artykuł: Proste przetwarzanie obrazówWe Wrocławskim Portalu Informatycznym (WPI) pojawił się artykuł mojego autorstwa: "Proste przetwarzanie obrazów". W przygotowaniu są już kolejne artykuły (tym razem związane z tematyką programowania gier) i powinny pojawiać się mniej więcej raz w miesiącu.
Na potrzeby artykułu poduczyłem się trochę Javy (żeby zrobić aplety) i muszę przyznać, że nie było to zbyt przyjemne doświadczenie. Tak, jestem językowym rasistą i zdecydowanie wolę C# ;).