Pocket GPW 1.4
Nowa odsłona programu Pocket GPW po zmianach na serwisie m.gpw.pl
Aplikacja dostępna jest na portalu Codeplex.
Od aktualnej wersji za wszelkie developerskie zmiany odpowiada Piotr Polewczak, który podjął się aktualizacji oprogramowania, ze względu na to iż ja zaprzestałem tworzyć oprogramowanie na Windows Mobile.
Pocket Demotywatory 2.3
Kolejna, lekko spóźniona odsłona Pocket Demotywatory w wersji 2.3.
Tak naprawdę wersja ta jest dostępna we wszystkich lokalizacjach od paru ładnych tygodni ale ostatnio ze względu na Windows Phone 7 brakowało mi czasu na pisanie postów.
Aktualną wersję można pobrać z:
Zmiany w wersji 2.3:
- podłączenie do API demotywatorów
- dodanie możliwości losowania
- usunięcie poczekalni (zawartością naruszała zasady Windows Marteplace)
Tą wersją prawie na 100% kończę historię Pocket Demotywatorów. Kolejna wersja demotów pojawi się na telefony Windows Phone 7.
Pocket Demotywatory 2.2
Kolejna odsłona Pocket Demotywatory. Niestety nadal niedostępna w Windows Marketplace (Demotywatory.pl to podżegający do nienawiści, dyskryminujący – porno serwis).
Za to dostępna w starym dobrym Freeware Pocket PC i na dole tej strony.
Zmiany w wersji 2.2:
- dodany wybór umiejscowienia cache-a
- dodane skróty (na podglądzie) dla urządzeń bez ekranów dotykowych (klawisze od 1 do 7)
- poprawka na brak obrazków na liście (zniknęły po ostatnich zmianach na demotywtory.pl)
- poprawka na wysyłanie demotów

Klienta w postaci pliku CAB można pobrać tutaj.
PS: Cały czas mnie nurtuje pytanie jak Microsoft wespół z Apple w dobie otwartej sieci rości sobie prawo do decydowania co jest dla nas dobre a co nie.
“Windows Mobile Game Development”
Na rynku wydawniczym pojawiła się ciekawa pozycja związana z programowaniem gier na platformę Windows Mobile: “Windows Mobile Game Development”. Choć książek o samej platformie WM jest dość sporo, to jednak o programowaniu gier jest jak na lekarstwo.
Mimo, iż nadchodzi Windows Mobile 7 trzeba pamiętać, że Microsoft przez jeszcze nie określony czas będzie wspierał niższe platformy przez co książka jest wciąż na czasie. A muszę przyznać, że dawno nie czytałem tak dobrej książki.
Kto kiedykolwiek próbował pisać grę pod Windows Mobile, ten wie że jest to arcytrudne zadanie, zaczynając od wyboru odpowiednich technologii poprzez tworzenie interfejsów na co najmniej kilkanaście dostępnych rozdzielczości a kończąc na optymalizacji kodu. Ta książka pomoże ci w dokonywaniu odpowiednich wyborów; odpowie na pytanie dlaczego nie powinieneś używać DirectX, dlaczego GDI nie jest złym wyborem, jak odtworzyć kilka symultanicznych dźwięków w grze oraz jak sobie poradzić z synchronizacją czasową.
Na książkę składa się czternaście rozdziałów:
- Windows Mobile and .NET
- Mastering the User Interface
- GDI Graphics
- Taming the Device with the Game Engine
- Timing to Perfection
- Exploring User Input
- Sounding Out with Game Audio
- Game in Focus: GemDrops
- Common Game Components
- A New Window on the World with Open GL ES
- Creating 2D Games with OpenGL
- The Ins and Outs of the Third Dimension
- Further OpenGL Features and Techniques
- Distributing Your Game
Na początku autor wprowadza nas w arkana GDI i zegarów poprzez obsługę dźwięku i zdarzeń użytkownika związanych z interfejsem do Open GL ES. Książka zawiera bardzo dużo przykładów oraz porównuje różne technologię (np. obsługi dźwięków). Jednocześnie autor buduje z czytelnikiem silnik gry, który później użyty jest do zbudowania gry GemDrops.
Książka można kupić w Amazon w cenie 35,99$ lub bezpośrednio u wydawcy Apress w postaci eBooka w cenie 34,99$.
Windows Phone 7 Series – zagubiony klawisz Menu
Rozważmy hipotetyczną aplikację:

Załóżmy, że kontrolki tej aplikacji mają jakiś głębszy sens i wypełniają całą wielkość ekranu. W kolejnej iteracji projektu pojawia się jednak potrzeba dodania Application Bar z bardzo logicznych powodów.
Po dodaniu odpowiedniego kodu do App.xaml i uruchomieniu oto co nam się ukazuje:

Ale chwila, gdzie zniknął Button 8! Ratujemy się szybkim przeglądem helpa i odnajdujemy property Opacity. Uszczęśliwieni tym faktem dodajemy go z wartością 0.5:

Zasadniczo wszystko super. Ale Button 8 nie można kliknąć. Wracamy kilka iteracji wstecz i zmieniamy design aplikacji przeklinając pod nosem.
Wniosek nasuwa się dość oczywisty. Jeżeli projektujesz aplikację, już na początku zastanów się czy będziesz potrzebował Application Bar-a. Bo jeśli tak to załóż, że dolne 80 px jest niedostępne a property Opacity jest bardziej bajerem niż użyteczną właściwością (no chyba że tło twojej aplikacji to wypasiona grafika).
Tak czy inaczej. W WP7S brakuje mi klawisza Menu na urządzeniu tak jak ma to miejsce w Android. Chciałbym aby Application Bar był nie widoczny a po naciśnięciu Menu pojawiał się z całą okazałością. Albo żeby był cały czas na ekranie bez magicznego Opacity. Ale to ja chciałbym decydować. A teraz zdecydował Microsoft i w 90% aplikacji stracimy na dole spory kawałek ekranu (w panoramie stracimy z prawej strony).
Windows Phone 7 Series – API kamery
API kamery w narzędziach CTP dla Windows Phone 7 Series nie zostało oficjalnie opublikowane i jeszcze nie możemy z niego korzystać. Jednakże przeglądając dump-a emulatora WP7S znalazłem plik o nazwie GAC_CaptureApiManaged_v1_0_0_0_cneutral_1.dll (znajduje się w ścieżce \SYS\MediaApps).
Szybki przegląd Reflector-em ukazuje nam klasy od obsługi kamery. Próba podpięcia referencji w projekcie i odpalenie kończy się niepowodzeniem, jednak zainteresowani mogą sobie przejrzeć jak będzie można obsługiwać kamerę.
Obiekty alfabetycznie:
// nazwa mówi za siebie
public class AutoFocusCompletedEventArgs : EventArgs
{
// Methods
public AutoFocusCompletedEventArgs(bool succeeded);
// Properties
public bool Succeeded { get; internal set; }
}
// bazowa klasa kamery
public abstract class Camera : IDisposable
{
...
}
// j.w. (fajnie że będziemy mieli dostęp do obydwu kamer - spodziewajmy się masy "lusterek" w Marketplace)
public enum CameraSource
{
PrimaryCamera,
SelfPortraitCamera
}
// jedna z ciekawszych klas, ponieważ wynika z niej że nie będziemy obsługiwać kamery w Silverlight w taki sposób jak to się robi w wersji pełnej - enumerując urządzenia i "rysując" VideoBrush a uzyskamy dostęp do MediaElement, który będzie wyświetlał kolejne klatki
public class CameraVisualizer : UserControl
{
// Fields
private Camera cameraSource;
private MediaElement displayMediaElement;
private Binding heightBinding;
private bool isLoaded;
private Binding widthBinding;
// Methods
[SecuritySafeCritical]
public CameraVisualizer();
public void OnLoaded(object sender, EventArgs ea);
public void SetSource(Camera camera);
}
// tutaj także wszystko jasne
[StructLayout(LayoutKind.Sequential)]
public struct CaptureResolution
{
public int Width { get; internal set; }
public int Height { get; internal set; }
}
// klasa dostępności danych
public class ContentReadyEventArgs : EventArgs
{
// Methods
public ContentReadyEventArgs(string relativePath);
// Properties
public string RelativePath { get; internal set; }
}
// no proszę nawet o fleszu nie zapomnieli
public enum FlashMode
{
Off,
On,
Auto,
RedEyeReduction
}
// ogólny błąd zgłaszany w przypadku wyjątków kamery
public class OperationFailedEventArgs : EventArgs
{
// Methods
public OperationFailedEventArgs(Exception exception);
// Properties
public Exception Exception { get; internal set; }
}
// i teraz najciekawsze dwie klasy
public sealed class StillCamera : Camera
{
// Fields
private Guid _captureId;
private bool _isCapturing;
private object _lock;
private EventHandler ImageAcquired;
private EventHandler ImageSavedToDisk;
private EventHandler ThumbnailSavedToDisk;
// Events
public event EventHandler ImageAcquired;
public event EventHandler ImageSavedToDisk;
public event EventHandler ThumbnailSavedToDisk;
// Methods
public StillCamera();
public StillCamera(CameraSource source);
public void CaptureImage();
internal override void RouteEvent(CaptureEvent eventId);
// Properties
public FlashMode FlashMode { get; set; }
}
public sealed class VideoCamera : Camera
{
// Fields
private object _lock;
private Guid _recordingId;
private EventHandler RecordingStarted;
private EventHandler RecordingStopped;
private EventHandler ThumbnailSavedToDisk;
// Events
public event EventHandler RecordingStarted;
public event EventHandler RecordingStopped;
public event EventHandler ThumbnailSavedToDisk;
// Methods
public VideoCamera();
public VideoCamera(CameraSource source);
internal override void RouteEvent(CaptureEvent eventId);
public void StartRecording();
public void StopRecording();
// Properties
public bool IsRecording { get; private set; }
public bool LampEnabled { get; set; }
}
Wnioski:
- do osadzenia podglądu kamery w silverlight należy użyć CameraVisualizer który dostarczy nam widok taki jak dostarcza obecny CameraCaptureDialog z Microsoft.WindowsMobile.Forms
- do pobrania pojedynczej klatki należy użyć StillCamera i podpiąć się pod event ImageSavedToDisk – co ciekawe nie działa to tak jak opisywano to na MIX2010, że uzyskamy dane klatki, tylko musimy je sami odczytać z pamięci urządzenia; odrobinę jest to niespójne skoro do pamięci nie możemy się dostać!
- do nagrania należy użyć VideoCamera który podobnie jak StillCamera zapisze nam odpowiedni w tym przypadku film na dysku
Wszystko ładnie i pięknie ale brakuje mi dostępu do czystych klatek z kamery. A nie wyobrażam sobie dobrej aplikacji Augmented Reality bez takowego dostępu. Póki co jednak jest to wersja CTP i oby ta biblioteka uległa zmianie.
Windows Phone 7 Series – kolejna porcja złych wieści
Jeżeli wydawało ci się, że horror się skończyły to mam dla ciebie złych wiadomości ciąg dalszy:
- Brak natywnych odwołań. Zapomnij że istnieje DllImport. Żadna aplikacja wykorzystująca natywne odwołania nie przejdzie certyfikacji Marketplace. A jak wiesz w WP7S jest to jedyna metoda dystrybucji oprogramowania. Niby nic a jednak. Microsoft ma predyspozycje do ukrywania pewnych fajnych funkcji w swoich bibliotekach i często tylko DllImport pozwalał na ich wydobycie i używanie w aplikacjach. Kolejna sprawa to bluetooth, który obecnie tylko da się obsługiwać przez natywne odwołania. XNA nie wspiera grania po BT a więc jak sobie Microsoft wyobraża grę po sieci skoro …
- Brak socketów. Tak nie przesłyszałeś się. SL ani XNA nie wspiera jakichkolwiek działań po sieci. A notyfikację są do tego zbyt wolne. Odwołania HTTP będą działać bo na nich opiera się sieć w Silverlight ale nic poza tym. Nie napiszesz alternatywnego programu do obsługi poczty; FTP-a ani czatu.
- Nie dość, że nie ma multitaskingu, to nie będziesz miał kontroli na tym kiedy twoja aplikacja jest uruchamiana albo zamykana. A więc zapomnij o evencie OnClosing – nie uda ci się oszukać systemu. Po zadanym czasie twoja aplikacja zostanie automatycznie zabita.
- Brak SQL CE. To już zaczyna być śmieszne. Ale Windows Phone 7 Series nie posiada obsługi SQL-a. Nie przechowasz żadnych danych lokalnie, no chyba że na plikach XML w isolated storage (sic!) albo jakimś innym silnikiem bazy np SQL Lite.
Jaka wizja WP7S wynika z tych wszystkich ograniczeń? Otóż Microsoft ma wizję telefonu, który jest bardzo cienką końcówką zdarzeń w chmurze. Jeżeli piszesz aplikację biznesową na telefon nie obędzie się bez serwisu w chmurze. Czyli dodatkowych kosztów, bo ktoś będzie musiał zapłacić za development i hosting.
W idealnym świecie mamy cały czas dostęp do internetu, który jest za darmo. Ale ja mieszkam w Polsce i nie dość że dużo płacę za internet na komórce to jeszcze dobry zasięg kończy się wraz z tablicą miasta. Wizja telefonu giganta jest ciekawa, ale dlaczego ogranicza możliwości, które zawsze były dostępne w ich telefonach?
Windows Phone 7 Series – File Explorer
A propos ostatnich rewelacji o braku File Explorer-a w Windows Phone 7 Series – mała próba pobrania plików i katalogów z głównego katalogu telefonu.
Snippet użyty w screencaście:
try
{
foreach (string s in System.IO.Directory.GetFiles(@"\"))
Debug.WriteLine("File: " + s);
}
catch (Exception ex) { }
try
{
foreach (string s in System.IO.Directory.GetDirectories(@"\"))
Debug.WriteLine("Directory: " + s);
}
catch (Exception ex) { }
MIX10 i Windows Phone 7 Series – moje wrażenia
MIX10 oficjalnie się zakończył. Właściwie powiedziano już wszystko i znam odpowiedzi na prawie wszystkie nurtujące mnie pytania. Postaram się w skrócie podsumować to wszystko co powiedziano na MIX-ie oraz dodać kilka swoich przemyśleń.
A więc po kolei.
Po pierwsze udostępniono Windows Phone Developer Tools CTP, które zawiera:
- Visual Studio 2010 Express for Windows Phone CTP
- Windows Phone Emulator CTP
- Silverlight for Windows Phone CTP
- XNA 4.0 Game Studio CTP
Wbrew pozorom ta informacja niesie ze sobą podprogowy przekaz
Otóż na 99% możemy się spodziewać Visual Studio 2010 Express w wersji dla deweloperów Windows Phone. Co jest rewelacyjną informacją dla osób, które do tej pory nie mogły sobie pozwolić na “pełną” wersję Visual Studio (Express nie wspiera pisania aplikacji pod WM). A więc prawie na pewno przybędzie chętnych do spróbowania swoich sił.
Po drugie sam nowy system operacyjny jest dość kontrowersyjny:
- nie obsługuje multitaskingu a więc aplikację nie będą mogły chodzić w tle
- nie ma opcji kopiuj / wklej – Microsoft tłumaczy się zaawansowanym systemem rozpoznawania informacji na ekranie (np. numerów telefonu). Ale nijak nie potrafię sobie wyobrazić sytuacji kiedy chcę przekleić np kawałek tekstu strony internetowej i wrzucić to na Blipa.
- nie ma kart pamięci – jakoś nie wyobrażam sobie sytuacji gdzie ładuje do pamięci Auto Mapę , która ma 1GB danych i trzymam to non stop w telefonie
- nie masz dostępu do plików – nie żebym był jakiś strasznym fanem tego rozwiązania ale nie wyobrażam sobie sytuacji gdzie nie mogę ręcznie posprzątać plików w pamięci a pisząc programy telefon można zaśmiecić bardzo szybko
Po trzecie zmiany dotkną Marketplace:
Zostaną usunięte ograniczenia geograficzne. W końcu! Jakbym miał jeszcze raz w życiu wrzucić Tangram Pro osiem razy w języku angielskim tylko dlatego, że to inny kraj to chyba bym sobie darował.
Po czwarte – zajmijmy się konkretami:
Zestaw nowych bibliotek .NET dla Windows Phone 7 Series jest w wersji 4.0 – oczywiście mowa o podstawowym zestawie. A więc tu bez zmian – Microsoft zachował się tak jak przy poprzednich wersjach i udostępnił prawie identyczne zestawy.
Poza nim dostajemy zestaw bibliotek XNA w namespace Microsoft.XNA. Muszę przyznać, że odrobinę bawiłem się XNA na emulatorze i wyniki są naprawdę genialne. W tym się naprawdę bardzo prosto pisze gry. Koniec ze sztuczkami graficznymi GDI. Dostajemy prawdziwe narzędzie do pisania gier.
Plus zestaw silverlight z namespace Microsoft.Phone.Controls. Tutaj nie ma rewelacji. Oczywiście CTP nie jest wersją ostateczną, ale aktualny zestaw kontrolek nie powala. Brakuje mi wielu rzeczy i mam nadzieję, że to się zmieni. Co jest ciekawe w Application.Resources dostajemy domyślny zestaw styli telefonu a więc odpada nam karkołomna sztuka ustalania standardu. Na pewno zyskają na tym interfejsy i iPhone z Androidem mogą się zacząć bać, choćby z tego powodu że SL na telefonie wspiera IIS Smooth Streaming, DRM i tym podobne “dobra”.
API telefonu dostępne jest w bibliotekach Microsoft.Device. Obecnie widać akcelerometr i wibrację. Na pewno jest jeszcze obsługa kamery z dostępem do “czystych” klatek oraz kompas.
Kolejna ciekawostka. Dodano bibliotekę Microsoft.Phone.License która zawiera w sobie jedyną klasę License a w niej metodę IsTrial(). Marketplace otrzyma możliwość udostępniania aplikacji w wersji trial i wtedy powinniśmy sprawdzić wartość tej metody. Zastanawia mnie tylko jak się Microsoft zabezpieczył się przed podmianą tej biblioteki na taką która zawsze będzie zwracać false.
Na zakończenie otrzymaliśmy Microsoft.Phone.Notification do obsługi notyfikacji oraz Microsoft.Phone.Tasks która ma obsługiwać odpalanie map Bing, okna kamery, przeglądarki internetowej oraz odpowiada za obsługę pseudo funkcji wklej, bo na przykład pozwala zapisać adres email klasą SaveEmailAddressTask.
Na marginesie nie ma bibliotek System.Windows tak jak wcześniej zapowiadano a więc nie ma klasy Clipboard do obsługi schowka.
A tych wszystkich, których zastanawia brak File Explorera w telefonie przy jednoczesnym istnieniu biblioteki System.IO czeka niemiła niespodzianka. Ale to już sprawdźcie sami
Podsumowując
Nawiązując do jednego ze swoich poprzednich postów Windows Phone 7 Series – lista życzeń programisty spełniły się dwa z moich trzech życzeń. SL jest w wersji 4. Za Expression Blend będę musiał w Polsce zapłacić pewnie z 2 tysiące złotych (pomijajjąc fakt, że u nas jest on dużo droższy niż np w USA) oraz system posiada API do kamery, akcelerometru i kompasu. Myślę, że to niezły wynik.
W jakich kolorach maluje się przyszłość power userów? W tym momencie trudno odpowiedzieć na to pytanie. Jeżeli jesteś “kucharzem” ROM-ów i zapalonym tweakerem to zapewne porzucisz Windows Mobile i przerzucisz się na Androida.
A co do deweloperów – na odpowiedź musimy zaczekać do pierwszych wyników sprzedaży telefonów z Windows Mobile 7. Jeżeli się okaże, że telefony sprzedają się rewelacyjnie to nic tylko pisać aplikację i zarabiać kasę. Jeżeli jednak okaże się, że Microsoft się pomylił to nie pozostanie nam nic jak tylko przerzucić się na Androida / iPhone-a.


