SpringBall

W celach nauki Flasha i ActionScript’a stworzyłem prostą mini grę w dwie godziny, w której zieloną kulką trzeba zbić 20 czerwonych w jak najkrótszym czasie.

Sterowanie:
Przeciąganie niebieskiej kulki za pomocą lewego przycisku myszy.

Miałem napisać o projekcie z delfinem w roli głównej, ale zrobię to później, wspomnę tylko, że to projekt do pracy inżynierskiej.

EDIT: Po nauce rysowania w buforze dodałem smugę za kulkami (dla odmiany teraz są dwie zielone)

Porównanie metody Eulera oraz RK4 do integracji równań fizycznych

Swego czasu, tak jak opisywałem wcześniej na blogu implementowałem symulację materiału reprezentowanego przez ciała posiadające jedynie masę połączone sprężynami. Wynik był średnio zadowalający gdyż przy mocnym napięciu sprężyn materiał potrafił „eksplodować”, rezultat ten był spowodowany zastosowaniem „zwykłego” integratora Eulera, czyli inaczej mówiąc wzorów fizycznych pamiętanych ze szkoły średniej. Jako, że nie chciałem żeby materiał zachowywał się jak guma zacząłem poszukiwania rozwiązania tego problemu i natknąłem się na metodę Runge-Kutty rzędu czwartego, dodatkowo pokryło to się jakoś z zajęciami na uczelni na których omawialiśmy RK4 jak i inne metody. Ostatecznie zaimplementowałem ten algorytm posiłkując się tym artykułem: http://gafferongames.com/game-physics/integration-basics/
Wynik jest naprawdę dobry, można napiąć sprężyny bardzo mocno przez co już nie zachowuje się jak guma.
A jako, że ostatnio mieliśmy przygotować referat na zajęcia z Fizyki to ustaliłem z prowadzącym że zaprezentuję ten temat, bo już miałem z tym doświadczenia i pełną implementację. Na potrzeby prezentacji napisałem małe demko w którym można porównać zachowanie materiału z integratorem Eulera oraz RK4

Rezultat:

Do pobrania:

Żeby nie referat to pewnie powróciłbym do tego tematu później, bo w między czasie (teraz a początek semestru) zacząłem robić mini demko symulacji materiału kolidującego z dowolnymi złożonymi siatkami, aktualnie już działa, ale na CPU jest strasznie wolne i przeniosę implementację na GPU – a dokładnie OpenCL a dodatkowo chcę zrobić coś na wzór demka scenowego więc muszę jakoś to poskładać ładnie.

Sense: Skinning

W ramach projektu o którym niebawem napiszę zaimplementowałem do Sense algorytm skinningu. Aktualnie implementacja nie jest uniwersalna, ale do tego projektu wystarczy, tym bardziej, że skinning teraz wykorzystuje “kości” zrobione ze sprężyn :). Rezultat poniżej:

Skinning algorithm presentation

Więcej informacji o projekcie wkrótce, a jakby ktoś w komentarzu napisał żę informacja o algorytmie też by była fajna (ew. ktoś ma problem z implementacją itp.) to opiszę.

Wstępna implementacja GUI 3D z wykorzystaniem Stencil bufora

W tym wpisie chcę się podzielić sposobem implementacji podwalin GUI 3D w swoim frameworku “Sense” przy wykorzystaniu bufora Stencil. Wpis jest prawie artykułem i być może po rozwinięciu tematu taki kiedyś powstanie. Adresatami są osoby zainteresowane tzw. “silnikologią”, czyli pisaniem własnych silników do gier, jednocześnie mające doświadczenie w programowaniu i zaznajomione przynajmniej w minimalnym stopniu z jakimś API graficznym. Pierwsza część wpisu omawia sposób opakowania zdarzeń w system menadżera i jego słuchaczy. Ci co mają taką warstwę abstrakcji już zaimplementowaną (lub po prostu mają ją “gdzieś” :) ) powinni przejść do części opisującej sam system rozpoznawania obiektów pod myszą i przesyłania im zdarzeń.
Read the rest of this entry »

BioShoot

Wprowadziłem kilka poprawek:

  • Kolizje organizm-organizm,
  • kolizje organizm-pocisk.
  • śmierć gracza.
  • dwóch mobilnych “przeciwników”,
  • trochę ładniejsze mutowanie,
  • double-click lewym przyciskiem myszy ustawia cel do strzelania, czyli teraz można poruszać się i strzelać w różnych kierunkach
  • minimalna optymalizacja kodu

Przez te poprawki “gra” nabrała trochę sensu, natomiast brakuje jeszcze celu gry, a tym w zamierzeniu ma być na dojście do odpowiedniego miejsca lub wyeliminowanie wszystkich przeciwników.

Do pobrania

http://www.mi-ku.net/projekty/BioShoot/BioShootR2.zip

Screen shoot’y

BioShootR2 Screenshoot 1

BioShootR2 Screenshoot 2

Rapid Game Prototyping

W zasdzie nie chcę się powtarzać bo na ten temat wypowiedziały już się osoby bardziej zaznajomione z tematem więc dam linka który prowadzi do kolejnych ciekawych artykułów/informacji:

http://www.kloonigames.com/blog/general/articles-about-rapid-game-prototyping

Dla czego o tym temacie wspominam? Otóż na specjalizacji na studiach dostaliśmy zadanie własnie stworzenia prototypu gry w jak najkrótszym czasie. Czyli chcąc nie chcąc (bardziej chcąc :D ) musiałem coś zrobić. Oto wynik pracy która zajęła około 40 godzin:

Opis gry

Jako, że nie mielismy wyznaczonego jasno tematu prototypu to w grze jesteśmy sobie dziwnym organizmem w dziwnym świecie. Chodzi o to żeby zbierać mutatory (power upy) i nie dać się zabić w świecie w którym się znaleźlismy.

Dostępne mutatory:
Zielony – Ciało
Czerwony – Działko (oryginalna nazwa? )
Biały – Osłona
Niebieski – Głowa przy pomocy której możemy się poruszać

Sterowanie

LPM – Poruszanie
PPM – Strzelanie (jeżeli łyknęlismy mutator do strzelania)

Edytor
TAB x1 – tryb edycji świata
TAB x2 – tryb edycji mutatorów

W trybie edytora polecam pobawić się: LPM, PPM, Środkowy przycisk myszy, Del, Shift, Ctrl. Edytor jest w miarę intuicyjny więc się nie rozpisuje – polecam się pobawić. Przeciwnicy są zhardkodowani.

Co nie zostało zrobione

- Tarcie w kolizjach – teraz można się nieźle zaplątać:)
- kolizje między organizmami
- kolizje organizm -> “pocisk” <- co oczywiście chwilowo psuje cały efekt i nie pokazuje gameplayu - co w zasadzie miało być kwintesencją prototypu hehe, ale dodam w kolejnej wersji.
- te kolizje co są nie są oparte na żadnym drzewie ósemkowym itp. w związku z tym gra potrafi nieźle przyciąć kompa

Do pobrania

http://www.mi-ku.net/projekty/BioShoot/BioShootR1.zip

Screen shooty

BioShoot title screen

BioShoot screen shoot 1

Po zjedzeniu zielonego mutatora:
BioShoot screen shoot 1

Pod ostrzałem :)
BioShoot screen shoot 1

Z edytora świata:
BioShoot screen shoot 1

Technikalia

projekt został całkowicie napisany pod frameworkiem PopCap. Z frameworka wykorzystałem głównie: rysowanie przez Graphics, Image, XML, Dźwięki, Obsługę wejścia. Poza frameworkiem dopisalem kilka funkcji pomocniczych do Graphics’a i prostą fizykę sprężyn.

Technicznie trochę prze-engineerowałem jak to się mawia, mam pełny polimorfizm, możliwość dodawania nowych nodów, powerupów, kontrollerów dla organizmów(np. kolejne AI), możliwe jest też napisanie całkowicie innych broni i podpięcie ich w łatwy sposób, np zdalnie naprowadzanych pocisków itp. Wrogowie mogą być również mobilni. Dużo czasu też poświęciłem edytorowi który przynajmniej umożliwia edycje świata i powerupów bo w xmlu bym się zachetał to pisać.

Dźwięki zapożyczyłem ze Starcrafta, więc nie mam do nich praw….. aha odpalając gre lepiej mieć przyciszony dźwięk :P

Podsumowanie

W sumie całość nie jest jeszcze skończona, ale nie mogłem się powstrzymać przed umieszczeniem aktualnej wersji :) a obawiam się że teraz mogę nie mieć już czasu na tą gierkę. Gdy zaimplementuje kolizje pocisków z organizmami i co za tym idzie śmierć gracza to dopiero wtedy okaże się czy gameplay ma sens.

Miłej zabawy z niedokończonym prototypem :) :) :)

Programowanie gier & Biofeedback

Pod koniec zeszłego semestru musiałem wybrać specjalizację kierunku który studiuję (Informatyka na PJWSTK). Do wyboru miałem

  • Bazy danych
  • Programowanie aplikacji biznesowych
  • Sieci komputerowe
  • Multimedia
  • Robotyka
  • Multimedia – programowanie gier

W zasadzie tematyka każdej specjalizacji jakoś bardziej lub mniej mnie interesuje i miałem spory dylemat którą wybrać, w rachubę wchodziło też wybranie dwóch specjalizacji i realizowanie pracy inżynierskiej pod kątem obu. Po długim namyśle wybrałem jakże egzotyczną jak na polskie realia (chociaż ostatnio sytuacja się poprawia) specjalizację “programowanie gier”, gdyż ta bezpośrednio umożliwia mi realizację jednego z pomysłów które siedzą mi w głowie od dawna.

Pomysł

Chcę wykonać grę która będzie wykorzystywała specjalny “kontroler” służący do pomiaru aktywności umysłu, której celem będzie osiąganie stanu relaksu przez grającego. Pomysłów na realizację mam kilka, jeden (podrzucony przez jednego z prowadzących) uwzględnia dwóch graczy gdzie wygrywa ten który szybciej się zrelaksuje, inne pomysły to mini gry w których grający będzie musiał osiągnąć oczekiwany efekt audio-wizualny poprzez relaksację. Taka technika nosi nazwę Biofeedback’u, czyli sprzężenia zwrotnego utworzonego na podstawie odczytu i interpretowania jakiegoś sygnału generowanego przez człowieka i podawania informacji zwrotnych do jakiegoś zmysłu/zmysłów ludzkiego z komputera. Do pomiaru aktywności umysłu chcę wykorzystać metodę pomiaru rezystancji naskórka (galvanic skin response) która jest związana z opornością układu nerwowego, który z kolei pośrednio odpowiada aktywności umysłu.

Biofeedback służący do relaksacji ma poważne zastosowanie w np. w psychoterapii przy leczeniu między innymi ADHD. Może być też wykorzystywany przez ludzi żyjących w ciągłym stresie. W zasadzie zastosowań jest wiele, także mogę coś zrobić co się być może przyda innym.

Wstępna realizacja części sprzętowej

Jako, że do metody którą wybrałem potrzebne jest mi urządzenie komunikujące się z komputerem, a na czas testów nie chciałem projektować własnego układu opartego o mikrokontroler. Między innymi w związku z małym doświadczeniem na tym polu. To wpadłem na pomysł przerobienia analogowego joypada na moje potrzeby. Sposób był prosty, gałki analogowe działają na podstawie odczytanej rezystancji z potencjometru połączonego z gałką sterującą. To jak już pewnie wiecie zamiast potencjometru mechanicznego wystarczy podłączyć rezystancję “ludzką”, oczywiście wbudowane potencjometry mają o wiele mniejszą rezystancję niż skóra i wymagało to drobnych przeróbek, jednak wstępnie się udało. Elektrody na palce wykonałem z rzepów do których wszyłem splotkę przewodzącą prąd (to było najlepsze co mogłem zmontować z materiałów znalezionych w domu), które sprawdzają się całkiem nieźle. W ten oto sposób otrzymałem proste, działające jako tako urządzenie, które po wstępnych testach zachowuje się zgodnie z moimi przewidywaniami, czyli jest

  • nie dokładne – w związku małą rozdzielczość pomiaru, joypad przewidywał tylko 256 próbek, które do gier oczywiście w zupełności wystarczają, jednak tutaj przydało by się przynajmniej tą dwójkę podnieść dwie potęgi wyżej :)
  • nie stabilny odczyt – potrzeba kilka minut na stabilizację układu. To raczej w związku z moją przeróbką
  • Wymagana kalibracja dodatkowym potencjometrem wykonana pod użytkownika

W każdym bądź razie się nie zrażam bo jak na jeden dzień pracy wyniki są zadowalające. W oknie kalibracji joypada da się zaobserwować zmiany rezystancji układu nerwowego. Nawet nie wiedzialem jak bardzo potrafi organizm zareagować na pewne bodźce, np. plasknięcie się po twarzy powoduje gwałtowne przesunięcie wskaźnika kontrolera :) a słuchanie relaksującej muzyki powoduje powolny powrót wskaźnika na dawne miejsce. Kontynuacja relaksacji powoduje jeszcze większe przesunięcie wskaźnika co oznacza, że osiągnąłem większy spokój niż przed zastosowaniem wspomnianego bodźca. Wracając do samego urządzenia to finalnie postaram się zrobić własne na USB typu HID wykorzystujące jakiś mikrokontroler.

Wynik przeróbki joypada:
usb joypad modified to be a biofeedback device

Co dalej?

Pozostaje mi między innymi wymyśleć co dokładnie będzie tematem pracy inżynierskiej i zacząć powoli ją robić (o ile zostanie zaakceptowany :P ).

Sam pomysł biofeedbacku można rozwinąć i połączyć z wspomaganiem samej relaksacji poprzez w pewnym sensie wymuszanie odpowiedniej aktywności umysłowej poprzez pewne bodźce fizyczne, np. poprzez tzw. szumy dudnieniowe służące do synchronizacji półkul mózgowych do pracy w odpowiedniej częstotliwości.

Zainteresowanych odsyłam do poszukania w internecie informacji pod hasłami: biofeedback, gsr, hemi-sync. Swego czasu powstał komercyjny produkt, który w zasadzie odpowiada prawie 1 do 1 temu co chcę zrobić, można o nim poczytać na: www.relaksacja.pl. Do hemi-sync polecam programik Gnuaural. To chwilowo na tyle.

Sense: Camera

W związku z nowym pomysłem, dodałem do frameworka możliwość ładowania do tekstury danych z urządzenia przechwtyującego obraz. Aktualnie implementacje oparłem na bibliotece OpenCV i w zasadzie zamknęła się ona w kilku liniach kodu. Docelowo chcę skorzystać bezpośrednio z DirectShow, jednak strasznie dużo obiektów COM’owych trzeba utworzyć, zainiciować itp. Więc narazie przeżyje dodatkowe dll’ki w katalogu :)

Rezultat poniżej:

sense - camera #1

Binarek nie daje bo w sumie narazie nie ma po co, a sam kod jest dosyć niestabilny. W ogóle poziom entropii w kodzie frameworka wzrósł mi niebotycznie i nadchodzi czas żeby wkońcu posprzątać. Aktualnie dodałem flagę która kompiluje Sense w wersji lite bez shaderów, framebuffer’ów i całej reszty przez co pozwala na uruchomienie programu na starszych konfiguracjach – dzięki temu mogłem testować kamerkę którą mam w starym laptopie :)

A co do OpenCV, to natknąłem się na tą bibliotekę przy okazji biblioteki openFrameworks. Polecam zobaczyć galerię performance’ów bo ludzie porobili naprawdę interesujące rzeczy.

Luźne przemyślenia dotyczące efektywność pracy.

Współ autorka serii Head First, Kathy Sierra dawno temu umieściła na swoim blogu wpis zawierający jej ulubione grafy i rysunki. Generalnie polecam poczytać i obejrzeć, wiele z przedstawionych grafów/wykresów uważam za bardziej niż trafne. Jednak teraz chciałem się skupić na jednym przedstawiającym “krzywą Twitter’a”, o to ten graf:

Twitter Curve by Kathy Sierra

Na rysunku widać bardzo ładnie które usługi w jakim stopniu nas rozpraszają. Skalę dolnej osi trzeba by było oczywiście przeskalować indywidualnie, jednak i tak wiadomo o co chodzi.

W raz z rozpowszechnianiem się szerokopasmowego dostępu do Internetu, zaczęły powstawać usługi umożliwiające nieprzerwaną komunikacje, jedną z takich usług jest przedstawiony Twitter, który zdobywa coraz większą popularność. Jednak zamiast Twittera można podstawić inne podobne usługi/serwisy, np. serwisy społecznościowe które w większości mają takiego “Twittera” wbudowanego (np. Facebook Wall).

Wracając do rysunku. Znajduje się na nim również linia określająca “Brain Trashing threshold” (bardzo fajne określenie IMO :) ), której punkt przecięcia z krzywą zrzutowany na dolną oś daje wartość około 15 minut – osobiście umieściłbym ją trochę niżej bo przy rozpraszaniu się co 15 minut podczas programowania to niewiele bym napisał :)

Jak to się ma do tematu posta. Otóż tego typu “przeszkadzajki” są jednym istotnym czynnikiem (jednym z wielu oczywiście) wpływającym na pracę, potrafią bardzo skutecznie dekoncentrować i odciągać od realizowanej czynności na długi czas. W związku z tym trzeba się od nich “odciąć”. Jeżeli ktoś nie ma na tyle silnej woli w danej chwili to może zastosować prostą technikę zobrazowaną na poniższych zdjęciach:

Network cable unplug 1

Network cable unplug 2

Oczywiście ta metoda ma wady gdyż bardzo dosłownie odcina wszystkie usługi, jednak jak BTT osiąga krytyczny pułap to bardzo dobre rozwiązanie, tylko czasem wymaga pobrania jakiejś dokumentacji do czytania offline :)

LanFriends 0.3.1

Wprowadziłem kilka małych poprawek, oto one:

Zmiany w stosunku do wersji 0.3.0

  • Logowanie do pliku “log_release.txt” oraz do nowej zakładki “Log” zdarzeń zmiany stanu, dodania oraz usunięcia urządzenia z listy. Logowanie zmiany statusu urzadzenia może być wyłączone w oknie “Settings”
  • Możliwość maksymalizacji okna
  • Zapisywanie pozycji i rozmiaru okna w ustawieniach
  • Ustawienie “Skin” już działa. Można tworzyć dodatkowe katalogi z tematami graficznymi (ikonki oraz plik QT CSS “style.css”) – w kolejnych wersjach dorzucę przykładowy skin z plikiem “style.css”
  • Kilka drobnych zmian

Do pobrania

W zasadzie LanFriends już prawie jest tym czym chciałem żeby był, ale oprócz dokończenia aktualnych funkcjonalności dopiszę jeszcze chata, po to żeby w przypadku braku połączenia z internetem w sieci można było się komunikować, bo zakładająć że ludzie w sieci używają LanFriends to nie będą musieli korzystać z dodatkowego – “zbędnego” archaizmu jakim są na owe czasy komunikatory umożlwiające komunikację offline, np. NetMeeting.

Co ciekawe po umieszczeniu aplikacji w serwisie download.com, inne serwisy takie jak Softpedia umieściły automatycznie LanFriends na swojej liście – oczywiście to raczej roboty sieciowe zajęły się wyszukiwaniem, ale screenshoty musiał już zrobić człowiek :).

Link do LanFriends 0.3.0 na Softpedii
Link do LanFriends 0.3.0 na download.com