czerwiec 28th, 2007

Compo

Witam.
Dawno nie pisałem żadnej notki, więc pora coś nabazgrać, coby nikt nie mówił, że się obijam ;P
Chcialem w tym niusie zachęcić wszystkich zainteresowanych game developingiem do wzięcia udziału w konkursie Compo. W skrócie polega on na stworzeniu gry/efektu zależnie od narzuconego w danej edycji tematu. Zostaje też wyznaczony czas, w którym możemy oddawać prace.
Jednak tym razem jest inaczej - wygląda na to, że temat prac będzie dowolny (dyskusja na ten temat toczyła się na Warsztacie). Z kolei czas edycji wynika z samej jej nazwy: CAŁOWAKACYJNE Compo. Przez 2 miesiace można stworzyć coś konkretnego, a przy tym dobrze sie bawić i wiele sie nauczyc:).

Dlatego zachęcam wszystkich, którzy czują się na siłach (i tych, którzy sie nie czują, także - przynajmniej spróbujcie) do wzięcia udziału, taki konkurs to super motywacja, świetna zabawa, wspaniała atmosfera, a przy tym rywalizacja, chęć poprawienia swoich osiągnięć i bycia lepszym. Wreszcie satysfakcja z ilości uzyskanych pkt, czy nawet z wygranej:).

PS: Ja mam zamiar wziąć udział, mam już pomysł, myślę, że już dość dobrze zaprojektowany, na dniach zajmę sie jego stopniową realizacją.

czerwiec 21st, 2007

Picking

Witam.
Jakoże wczoraj nie miałem okazji pokodzić (imprezka;pp) postanowiłem dziś trochę nadrobić braki. Myślę, że udało mi się to. Mianowicie dorobiłem dziś choćby prymitywny system questów i dialogów. Ulepszyłem także walkę tak jak chciałem przez tzw. picking, czyli wybieranie przeciwnika za pomocą myszy. Największy problem leży tutaj w konwersji współrzednych myszy na wspolrzedne OGL. Z pomocą przychodzi tutaj funkcja gluUnProject(); lub gluProject() jesli chcemy to zrobić w drugą stronę;).

czerwiec 19th, 2007

Walka

No i udało mi się zrealizować walkę ;) a przynajmniej jej część odpowiadającą za atak Potwór>>Gracz. Kiedy więc dochodzi do kolizji pomiedzy graczem a potworem, nastepuje losowanie obrażeń z przedziału od 0 do maksymalnych obrażeń potwora, które są ustalone w strukturze. Następnie te obrażenia są odejmowane od aktualnego stanu hp gracza.
Oczywiście odejmowanie HP byłoby zbyt szybkie i “gra” mignęłaby nam tylko przed ekranem, gdyby doszło do kolizji, dlatego postanowiłem użyć wielowątkowości. I tak ataki są ustawione w osobnym wątku, gdzie znajduje sie takze funkcja Sleep();. Powoduje ona, że dany wątek zostaje uspiony na pewien okres czasu. W ten sposób ataki są cykliczne, ale nie za szybkie.

Trzeba jeszcze dorobić ataki w kierunku Gracz>>Potwór.:P Najpierw muszę jednak napisać wykrywanie, czy gracz kliknal w obszar potworka czy nie, jeśli tak - wtedy zostaje on uaktywniony (zaznaczony). Dopiero wtedy po zblizeniu sie gracza do tego potwora nastepuje atak.

Jeśli walka zostanie już zaimplementowana w całości, w nastepnej kolejnosci chciałbym się zająć obsługą questów i eventów. Może później opiszę tutaj system questowy, jaki chcialbym stworzyć. ;)

czerwiec 18th, 2007

“Ciało raz wprawione w ruch…”

Ork :) Witam:). Dziś dość przełomowy news, gdyż udało mi się zaprogramować podążanie orka za naszym bohaterem (może na screenie tego nie widać, ale uwierzcie - Ork zmienia swoje wspolrzedne, by dotrzeć jak najkrotsza drogą do naszej postaci).
Warunkiem, aby potwór za nami ruszył jest oczywiście to, abyśmy najpierw podeszli do niego na okresloną odległość (czyli po prostu, żeby stał się w stosunku do nas agresywny). Porusza sie on wolniej od nas, także jeśli zaistnieje taka potrzeba, można mu uciec :).
Jak wszystko pójdzie dobrze to dziś bądź jutro napiszę już system walki :) a raczej “system walki”.;P W założeniach polegać on będzie na tym, iż jeśli doszło do kolizji potwór<-->postać, to potwór atakuje nas losowymi obrażeniami (liczonymi od 0 do Max, który jest ustalony w strukturze postaci). Z postacią kierowaną przez gracza w najgorszym przypadku też tak będzie ;P natomiast mam inny pomysł i mam nadzieje, ze uda mi sie go zaimplementować. Otóż najpierw będziemy musieli kliknąć myszką na np. orka. Wtedy wokół jego tekstury pojawi się otoczka, która da nam znać, iż jest zaznaczony. No a dalej to tak samo - przy kolizji nastepuje losowanie obrazen.;> Chodzi po prostu o to, by postać gracza nie atakowała samoistnie, aby to gracz musiał zainicjować.

pozdrawiam.

czerwiec 17th, 2007

System Save&Load

Witam.
Dziś do projektu “The Dranthit” dodałem między innymi możliwość wczytania poprzedniego stanu gry. Zrobiłem to w dość prosty sposób, ale myslę, że na potrzeby równie prostej “gry” wystarczy w zupełności.
System ten polega na tym, iż przy pierwszym włączeniu gra tworzy plik save.dat, a przy kolejnych uruchomieniach aplikacji wczytuje stamtąd dane dotyczące np. położenia postaci.
Przy wyłaczaniu natomiast gra zapisuje tam aktualne dane.

Save nic nam jednak nie da, jesli nasze hp spadnie do 0 :). Jeśli tak się stanie, save.dat zostaje usunięty i zaczynamy rozgrywkę od nowa. Dzieje sie tak dlatego, że chciałbym, aby save służył tylko do zapisania stanu gry kiedy musimy np. gdzieś wyjść, i wznowienia jej po powrocie. Nie jest możliwe natomiast zapisanie gry przed np. walką i wczytania jej, gdy dana akcja się nie potoczy się po naszej myśli.
Przy okazji okomentowałem dziś sobie troszeczkę kod coby mi łatwiej się pracowało ;>, a także dodałem skromną obsługę błedów.

czerwiec 17th, 2007

Kolizje

Witam :>.
Wczoraj pisałem, że poprawiłem trochę funkcje kolizji. Natomiast wieczorem w łóżku wpadłem na jeszcze lepszy pomysł, który uprości mi pracę :). Postaram się przybliżyć Wam moją metodę, być może ktoś skorzysta.
Metoda, którą ja stosuje doskonale sprawdza się w grach 2D, gdzie postacie są określone jako kwadraty nałożone teksturą.
Zanim jednak przedstawię Wam moją funkcję, musimy zbudować typ wyliczeniowy. Oto on:

enum Kierunek
{
V_LEFT,
V_RIGHT,
V_UP,
V_DOWN
};

Co on określa? Określa kierunek, w jakim porusza się lub, lepiej, MA się poruszać dana postać. Tworzymy więc jeden taki typ:

Kierunek tKolizja;

Teraz potrzebujemy jeszcze struktury postaci. Dla naszego przykładu wystarczy taka zawierająca tylko współrzedne tekstury. Współrzędne to 8 elementów (X, Y). Po jednym na każdy bok kwadratu:

struct Character
{
GLfloat WspX1; // wspolrzedna gorna prawa
GLfloat WspX2; // wspolrzedna gorna lewa
GLfloat WspX3; // wspolrzedna dolna lewa
GLfloat WspX4; // wspolrzedna dolna prawa
GLfloat WspY1; // wspolrzedna gorna prawa
GLfloat WspY2; // wspolrzedna gorna lewa
GLfloat WspY3; // wspolrzedna dolna lewa
GLfloat WspY4; // wspolrzedna dolna prawa
};

Typ GLfloat to OpenGL’owska liczba zmiennoprzecinkowa.

Teraz możemy stworzyć naszą funkcję glCollisions():
bool glCollisions(Character Pierwszy, Character Drugi, Kierunek tKierunek)
Jak widać przyjmuje ona 3 wartości: “Pierwszy” to postać, która ma się poruszać w kierunku określonym w tKierunek, a my sprawdzamy, czy jest to możliwe. “Drugi” natomiast, to postać, którą sprawdzamy, czy nie stoi czasem na przeszkodzie postaci pierwszej - nie chcemy przecież, aby przez siebie przechodziły. Funkcja zwraca wartość bool - true, jeśli doszło do kolizji lub false, jeśli nic nie stoi postaci na przeszkodzie. I teraz zanim przejde do bloku funkcji, chcę uprzedzić, że można to było zrobić za pomocą np. instrukcji switch() i być może tak byłoby nawet wydajniej :>>. Ja zrobiłem na if’ach, proszę mnie za to nie bić ;P
Cała funkcja wygląda u mnie tak:
bool glCollisions2(Character Pierwszy, Character Drugi, Kierunek tKierunek)
{
if(tKierunek == V_LEFT)
{
if((Pierwszy.WspX2 >= Drugi.WspX1) && (Drugi.WspX1 >= Pierwszy.WspX2 - 0.02f) && (Drugi.WspY3 <= Pierwszy.WspY1) && (Pierwszy.WspY3 <= Drugi.WspY1))
return true;
}
else if(tKierunek == V_RIGHT)
{
if((Drugi.WspX2 >= Pierwszy.WspX1) && (Pierwszy.WspX1 >= Drugi.WspX2 - 0.02f) && (Pierwszy.WspY3 <= Drugi.WspY1) && (Drugi.WspY3 <= Pierwszy.WspY1))
return true;
}
else if(tKierunek == V_UP)
{
if((Drugi.WspY3 >= Pierwszy.WspY1) && (Pierwszy.WspY1 >= Drugi.WspY3 - 0.02f) && (Pierwszy.WspX2 <= Drugi.WspX1) && (Drugi.WspX2 <= Pierwszy.WspX1))
return true;
}
else if(tKierunek == V_DOWN)
{
if((Pierwszy.WspY3 >= Drugi.WspY1) && (Drugi.WspY1 >= Pierwszy.WspY3 - 0.02f) && (Drugi.WspX2 <= Pierwszy.WspX1) && (Pierwszy.WspX2 <= Drugi.WspX1))
return true;
}
return false;
}

Omówię teraz jeden blok kiedy tKierunek ma wartość V_LEFT. Myślę, że resztę już zrozumiecie sami na podstawie tego jednego przykładu. Ja zajmę się wyjaśnieniem tylko ponizszego bloku kodu:
if((Pierwszy.WspX2 >= Drugi.WspX1) && (Drugi.WspX1 >= Pierwszy.WspX2 - 0.02f) && (Drugi.WspY3 <= Pierwszy.WspY1) && (Pierwszy.WspY3 <= Drugi.WspY1))

A więc: obiekt “Pierwszy” chcemy przesunąć w lewo, ale być może obiekt “Drugi” stoi mu na drodze - i to chcemy w tym kodzie sprawdzić. W pierwszym nawiasie sprawdzamy, czy lewa górna współrzedna obiektu pierwszego jest wieksza badz równa prawej gornej współrzednej obiektu drugiego. W drugim natomiast sprawdzamy, czy prawa gorna wspolrzedna obiektu drugiego jest wieksza badz rowna lewej gornej wspolrzednej obiektu pierwszego, jesli odejmiemy od niej wartosc 0.02. 0.02 dlatego, iż tyle wynosi u mnie jeden ruch po wcisnieciu np. strzałki. Sprawdzamy więc, czy obiekt nie jest za wysoko względem Drugiego.
Trzeci i czwarty nawias to w zasadzie analogia dwoch poprzednich.

I to by było na tyle. Mam nadzieję, że komuś się to przyda ;>

pozdrawiam,
M.

czerwiec 16th, 2007

The Dranthit.. zmiany kosmetyczne

Dziś pierwszy raz odkad zaczalem zabawe nad tym demkiem postanowilem trochę uporządkować kod :>> Ogółem poprawiłem troszeczke rendering, myslę, ze nie bedzie juz wrazenia iż mapa się porusza :). Dopracowałem funkcję kolizji - dzieki temu nie mozna wyjsc poza mape, ani najść na inną postać (teksture).
Teraz wszystkie elementy zwiazane z renderingiem np. gracza zgromadziłem w jednej i tej samej funkcji - dzieki temu kod jest czytelniejszy i łatwiej mi to wszystko ogarnąć :).

Wracając do renderingu, co się zmieniło: Każdy segment rysowany jest oddzielnie jako kwadrat z dodaną teksturą terenu. Wcześniej było tak, iż robiłem jeden wielki kwadrat i powielałem na nim teksturę. :> W sumie nie jestem pewien czy teraz jest wydajniej, natomiast uważam, że lepiej to wyglada :).

czerwiec 16th, 2007

Początek

Witam.
No więc zaczynam prowadzić tego bloga :>. Będę tu opisywał jakieś rozwiązania programistyczne, błędy, swoje wywody nt. programowania itd. Jednak szczególnie chciałbym tutaj przedstawiać nowości dotyczące mojego projektu, który aktualnie piszę.

Projekt ma nazwę “The Dranthit - Demo”. Na jego pomysł wpadłem już dawno temu, początkowo miał być to projekt konsolowy, jednak jak sie człowiek rozwija to mierzy coraz dalej. Tak więc piszę go przy pomocy języka C++ i biblioteki graficznej OpenGL. Może to budzić pewne zdziwienie, gdyż projekt ten jest dwuwymiarowy (2D), a OGL to biblioteka do grafiki 3D. Otóż uważam, że w ten sposób o wiele łatwiej będzie mi później przesiąść się już na grafikę 3D.

Ale co to w ogole za projekt? Otóż jest to “gra” (tzn. ma być ;P). Pierwsza wersja to jak wskazuje nazwa - demo, czyli pewne zwięczenie i ukazanie umiejetnosci i tego co mi sie do tej pory udalo osiagnac jesli chodzi o OGL. Nawet jeśli nic z tego nie wyjdzie to nie bede zalowal, nauczylem sie przy okazji pisania tego bardzo dużo. Ma być to bardzo prosty cRPG (aż trudno to zakwalifikowac do cRPG). Ogółem założenia co do dema są takie, że będzie 1 quescik, ze 3 potworki i tyle:D Do tego jakies potionki do leczenia, moze gdzies do podniesienia cos co nam zwiekszy atak. Jakiś system awansu, do tego przy wylaczaniu gry automatyczny zapis (przy ponownym wlaczeniu wczytanie). Ogółem ma to być prosta rzecz, nie zakładam dużo bo pewnie nie dam rady pozniej tego zaimplementowac :>>

No i to tyle tytułem wstepu :P