`Lepsiejsza` Konsolka

Korzystając z zamieszania przedsylwestrowego postanowiłem spróbować zrealizować to o czym ostatnio pisałem. Mianowicie chciałem sprawić aby tekst komendy wpisywany był w ostatniej linii konsoli, a pozostałe wiadomości wyświetlane były w normalny sposób.

Po długich bojach, kilku pomysłach i wielu zakomentowanych linijkach udało mi się osiągnąć cel :) Teraz pozostało już tylko wyczyścić kod ^^ Poniżej screen demonstrujący ten wspaniały efekt ;)

Asynchroniczna Konsola

Postanowiłem dorzucić do AGE konsolkę. Przypomniało mi się, że kiedyś widziałem artykuł Regedita odnośnie właśnie tworzenia asynchronicznej konsoli. Poszukałem chwilkę i znalazłem go tu: http://regedit.gamedev.pl/produkcje/artykuly/AsynchronicznaKonsola.php5 .

Przeczytałem artykuł i pomyślałem, że dodanie czegoś takiego będzie szybkie i wygodne - czyli tak jak lubię :P Zabrałem się więc za pisanie… Właściwie to muszę się przyznać, że bardziej powinno się to nazywać przepisywaniem ;) Sporo linijek kodu jest podobnych pomimo tego, że inaczej rozwiązałem niektóre kwestie.

Z różnic mogę podać zarządzanie kolorami. W mojej klasie konsoli możemy ustalać kolor tekstu i kolor tła osobno używając wartości z enuma który zawiera wartości:

  • COLOR_RED
  • COLOR_GREEN
  • COLOR_BLUE
  • COLOR_INTENSITY

Tak więc nie ma już podziału na kolory tła i kolory tekstu. IMO tak jest łatwiej :)

Kolejną “innością”, którą pozwoliłem sobie wprowadzić jest umieszczenie konstruktora klasy w sekcji private. Aby stworzyć obiekt należy wywołać statyczną metodę getConsole(), która zwraca wskaźnik na konsolę. Oczywiście jeśli jest wywołana pierwszy raz to tworzy obiekt konsoli.

Dlaczego tak to zrobiłem? Ano dlatego, że każdy proces może mieć tylko jedną konsolę, a takie rozwiązanie pozwoliło mi uprościć drugą statyczną metodę którą Regedit nazwał ReadThreadProc_s(). Nie muszę już jako argumentu podawać do wskaźnika obiektu konsoli ponieważ może ona sama go sobie wziąć za pomocą getConsole(). Mała rzecz a cieszy ;)

Reszta kodu jest bardzo podobna do tej, którą zademonstrował Regedit. Pomyślałem, że można by dodać jeszcze coś takiego, że wprowadzanie tekstu w konsoli będzie się odbywało “na dole” czyli w ostatniej linii, a otuput bedzie wyświetlany normalnie. Pokombinuję trochę i może coś z tego będzie :)

Napisane w Programowanie. Tagi: . Bez komentarzy

Po świętach

No i po świętach. Teraz tylko sylwester i znów do roboty ^^

Zapewne zauważyliście (zwłaszcza Xion [pewnie z radością :P ] ), że ostatnio niewiele pisałem. No ale w końcu były święta prawda? Czas radości i w ogóle… Albo po prostu wielkie sprzątanie z finałem przy stole.

Teraz ciężko mi jest jakoś wrócić do kodu. Nie mogę się skupić. Na dodatek znów dorwałem Ultimę Online w swoje łapy ^^’. To straszne jak ta gra uzależnia, ale to tylko jeśli gra się na dobrym serwerze - w innym wypadku można szybko się znudzić.

To tyle - chciałem napisać tylko, że jeszcze żyję i nie ma mnie dlatego, że gram w UO oraz HoM&M 3  :P

Kontrolki ciąg dalszy…

Po niedawnych zmianach w sposobie pozycjonowania kontrolek na oknie przestały działać Layouty, napisane przeze mnie wcześniej. Postanowiłem ten stan rzeczy zmienić pomimo tego, że wydawało mi się to ( przy aktualnym pozycjonowaniu ) dość trudne. Okazało się jednak, że strach ma wielkie oczy ponieważ nie tylko nie było to trudne, ale wręcz dziecinnie proste! Tak więc znów można layoutować okienka.
Oczywiście nie zapomniałem także o wczytywaniu GUI z pliku. Tam też można tworzyć layout’y i ustawiać zachowanie kontrolek. Okienko z prawej strony zostało stworzone za pomocą takiego kodu:
progressBar pb
{
	value:		90%
}

checkBox cb
{
	title:		Check Box
	checked:	true
}

trackbar tb
{
	min:		100
	max: 		120
	value:		110
}

editbox edit2
{
	title:		100
}

button applyButton
{
	title:		Close
	policy:		minimum
	maxsize:	0, 22
	minsize:	75, 22
}

# LAYOUT SETUP

hlayout hLay
{
	spacing:	8
	addchild:	edit2
	addchild:	applyButton
}

vlayout vLay
{
	margin:		8
	addchild:	tb
	addchild:	hLay
	addchild:	cb
	addchild:	pb
}

window testWnd
{
	title:		Test Window
	position:	50, 50
	size:		200, 200
	layout:		vLay
}
Kod jest chyba na tyle prosty i intuicyjny, że nie muszę niczego tłumaczyć ^^ Powiem tylko, że jeśli wystarczą nam domyślne ustawienia kontrolki i nie chcemy definiować jakichś specyficznych możemy pominąć blok { … }. Przykładowo deklaracja progress bar’a z ustawieniami domyslnymi wyglądałaby tak:

progressbar testProgressBar

To tyle na razie, później może zajmę się usprawnianiem i ulepszaniem jeszcze czegoś innego :P

Napisane w Programowanie. Tagi: , . Bez komentarzy

Nowości w AGE

Ostatnio nie posiadam za wiele czasu na kodowanie. Z tego też powodu poniższa lista nie grzeszy długością :)

  • Wczytywanie GUI z pliku tekstowego ( opisane tu ) .
  • Ustawianie czcionki dla GUI ( również z pliku TTF ).
  • Ulepszone ustawianie koloru dla GUI i lekka zmiana sposobu wyświetlania okna.
  • Możliwość zrobienia screenshot’a z tego co jest na ekranie w formatach: BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR oraz PFM. Funkcja przyjmuje tylko nazwę pliku i na jej podstawie determinuje format ( z rozszerzenia ).
  • Poprawione kolejne małe bugi.

Mam nadzieję, że w święta będę miał więcej czasu na pogrzebanie przy AGE ;) Prawdę mówiąc po woli kończą mi się pomysły na to co można usprawnić. Niedługo pozostanie mi albo oznaczyć to co mam wersją `0.1 Beta` albo zacząć dodawać coś zupełnie nowego :P

Zawsze można też najpierw oznaczyć `0.1 Beta`, a potem zacząć dodawać nowe rzeczy ;)

Napisane w Programowanie. Tagi: . Komentarzy: 2 »

Ładowanie Kontrolek

Zmieniając nieco znane przysłowie, tak aby pasowało do sytuacji i ogólnie do kodzenia:

“Kto nie ma w głowie, ten ma w palcach”

Dlaczego o tym mówię? Chyba nie trudno się domyślić. Skutki zakodowania czegoś na szybko i bez przemyślenia są dość łatwe do przewidzenia. W celu poprawienia ładowania kontrolek tak, aby można było dodawać właściwości specyficzne dla danej kontrolki ( takie jak np. zaznaczenie w CheckBox ) musiałem zdrowo przeorganizować to co do tej pory napisałem.

Nie ma jednak tego złego co by na dobre nie wyszło - zawsze to jakaś nauczka :) Na szczęście mam już duże doświadczenie w poprawianiu i przeorganizowywaniu kodu bo mój styl programowania można określić jako eksperymentalny lub też improwizacyjny. Można go podzielić na 2-3 fazy:

  1. Zakodzenie czegoś byle działało w celu sprawdzenia co będzie potrzebne i jak to będzie mniej więcej wyglądać.
  2.  Wstępne zakodzenie wersji finalnej. Jeśli jest dostatecznie dobra to faza 3 jest pomijana.
  3. Olanie wstępnej wersji finalnej i napisanie wszystkiego od nowa tak jak być powinno.

Na szczęście często kończę już na 2 fazie. ;)

C#

Od jakiegoś czasu zastanawiałem się co takiego fenomenalnego jest w C#, że wszyscy go chwalą. No dobra, nie wszyscy, ale wielu. Postanowiłem więc sprawdzić to na własnej skórze.

Ściągnąłem i zainstalowałem Microsoft Visual C# Express Edition 2008. Po odpaleniu na pierwszy rzut oka jedynym szczegółem, który odróżnia VC# od VC++ jest kolor zielony splash screen’a podczas gdy ten z VC++ jest żółty ^^

Postanowiłem stworzyć nowy projekt w celu testów. Kiedy moim oczom ukazała się wreszcie forma na której mogłem umieścić kontrolki, zaszalałem… Umieściłem jeden przycisk. Na początek chciałem sprawić aby po wciśnięciu przycisku pojawił się mały prosty Message Box. Dzięki świetnemu uzupełnianiu składni okazało się to prostsze niż napisanie “Hello world” w konsoli ^^

W dalszej części testu pomęczyłem jeszcze kilka innych kontrolek sprawdzając z czym się je zajada ;) Jako, że nic mądrego nie mam na ten temat do powiedzenia - przejdę do następnej kwestii :P

Teraz chciałbym się pozachwycać trochę uzupełnianiem składni i “zgadywaniem” przez VC# tego co chcę wpisać. Bardzo fajną rzeczą podczas powoływania do życia nowego obiektu za pomocą new jest automatyczne zgadywanie konstruktora. Polega to na tym, że po wpisaniu operatora new i spacji od razu pojawia się okienko z podpowiedziami z zaznaczonym konstruktorem klasy znajdującej się po lewej stronie `=` (który oczywiście jest przed new ;) ).

Następnym udogodnieniem, które bardzo mi przyspieszyło pisanie aplikacji testowej było zgadywanie nazw zmiennych. Jeśli na przykład używałem ostatnio zmiennej o nazwie “zmienna” to wpisując “z” w edytorze od razu pojawi się okienko z podpowiedzią i zaznaczoną nazwą: “zmienna” (nawet jeśli w porządku leksykograficznym nie będzie to pierwsza zmienna na `z`). To pomaga zwłaszcza podczas korzystania ze struktur. Wpisując pierwszą literę nazwy obiektu jakiejś struktury od razu pojawi się okienko `dobrą` podpowiedzią (jeśli już wcześniej użyliśmy tej nazwy) - wtedy wystarczy już tylko wcisnąć `.` i do edytora zostanie wpisana cała nazwa obiektu razem z kropką i dodatkowo wyświetlone zostaną elementy struktury (co już raczej nikogo nie dziwi ;) ).

Jako ostatnią rzecz, która mnie  w VC# zachwyciła wymienię tą, która zaskoczyła mnie jako pierwsza. Jest nią szybkość kompilacji kodu. Tak niesamowite tempo kompilacji po prostu wgniotło mnie w fotel!

Istnieje jednak pewna sprawa, która jest trochę irytująca i jak dla mnie trochę brzydko wygląda w kodzie. Chodzi mi o dodawanie `private` lub `public` przed każdą zmienną i metodą.

Podsumowując: Moja ocena C# jest bardzo pozytywna. Dla programistów C++ prawdopodobnie pomocna będzie ta strona.

BTW: dzisiaj czytałem art o tworzeniu zegara analogowego w C#. Artykuł byłby całkiem w porządku gdyby nie fakt, że autor bardzo beztrosko podchodził do pamięci zarówno komputera jak i czytelnika. Powinienem tutaj wyjaśnić co miałem na myśli mówiąc o pamięci czytelnikowej. Otóż chodziło mi o to, że autor artykułu używał 1000 zamiennych, kiedy tak na prawdę mógł pracować na zaledwie kilku.

Szczytem tej techniki było zaimplementowania przesuwania okna przez złapanie okna w dowolnym punkcie i przesuniecie myszki. Autor użył do tego 5 zmiennych podczas gdy mi wystarczyły tylko dwie.

PS.: Musiałem napisać o tym arcie żeby mi ulżyło bo strasznie mnie to piekło ;)

Odwiedziny

Dzisiaj odpaliłem sobie statystyki mojej strony, żeby jak zwykle popatrzeć z jakich stron wchodzono na mojego bloga lub jakie frazy wyszukiwarki wpisywano celem znalezienia informacji ( czasem mozna sie posmiac ;) ).

Jednak moją uwagę przykuł wykres odwiedzin strony. Jak dotąd średnio na dzień miałem około 50 wejść ( z czego większość w godzinach 21-23:59:59.9999 ;) ) i wykres był w pewnym sensie stały ;) Taki stan rzeczy zmienił się troszkę kiedy wczoraj umieszczono link do mojego bloga w newsie www.gamedev.pl. Otóż w dniu wczorajszym stronę odwiedziły 774 osoby! A dzisiaj do godziny 12:40 stronę odwiedziło już 126 osób.

Strasznie popsuło to wykres :P teraz poprzednie dni wyglądają jakby prawie nikt nie wchodził ;)

The best Blog in the world ;)

A przynajmniej najlepszy wg społeczności warsztatowej. Wzmianka o tym znalazła się nawet w tym newsie na warsztacie. Jestem tym faktem na prawdę zaskoczony ponieważ autentycznie nie sądziłem, że mogę rywalizować z blogami Xiona i Regedita (które IMO reprezentują na prawdę wysoki poziom), a co dopiero z nimi wygrać. Jednak warsztatowicze orzekli i nie będę się kłócił ;)

Doceniam to że pozytywnie oceniliście mojego bloga i nie zawiodę was - będę pisać do końca świata i jeszcze dłużej :P

Ok z tym pisaniem trochę pojechałem… tak czy inaczej dziękuję za pozytywne oceny ^^

Window Manager i Control Loader

Free Image Hosting at www.ImageShack.us

Dzisiaj wziąłem się za pisanie i skończyłem prostego menadżera okien. Właściwie to jest on na prawdę bardzo prosty ponieważ potrafi jedynie rozpoznać do którego okna wysyłać komunikaty i przesuwać aktywne okna na wierzch. Napisanie czegoś takiego nie było specjalnie dużym wyzwaniem ;)

Napisałem także małe co nieco do wczytywania kontrolek z pliku. Właściwie to do tworzenia kontrolek na podstawie opisu w pliku. Format jest dziecinnie prosty, przykładowo chcąc stworzyć okienko z jednym przyciskiem trzeba napisać:

window NazwaOkna
{
	title: Tytuł Okna
	position: 100, 100
	size: 250, 200
}

button NazwaPrzycisku
{
	title: Tekst Przycisku
	position: 10, 10
	size: 100, 22
	parent: NazwaOkna
}

Można pokusić się o stwierdzenie, że obsługa jest intuicyjna ;) Aktualnie ustawiać można jedynie te opcje, które są ogólne dla wszystkich kontrolek. Moim następnym krokiem będzie dodanie możliwości ustawienia wartości specyficznych dla konkretnych kontrolek takich jak na przykład definiowanie czy Check Box jest zaznaczony czy też nie.

Napisane w Programowanie. Tagi: , . Komentarzy: 12 »