2012
05.12

Siema :)

Ostatnie dwa tygodnie były wyjątkowo pracowite. Po pierwsze, dlatego że pisałem grę na compo, po drugie że implementowałem algorytm wyszukiwania najkrótszej drogi. Ale po kolei:

  • Snakes

Snakes to gra tworzona na warsztatowe compo. Głównym celem było napisanie gry, która reprezentowana by była tylko za pomocą tekstu, bez żadnych grafik – liczył się pomysł i oryginalność. Moja gra niestety nie obfitowała w obecność tych dwóch czynników, dlatego dostałem tylko jeden punkt – ale zawsze to coś! Link do tematu na forum (i linku do paczki z resztą gier): [klik]

Załączam kilka screenów gdyby komuś nie chciało się ściągać, sterowanie i cała reszta jest w zakładce „Jak grać ?”.

Pobierz „Snakes”: [klik]

  • Nation

W ostatnim wpisie mówiłem o nowej grze, którą rozwijam od ponad miesiąca. Projekt ma się bardzo dobrze, wczoraj udało mi się, po długich godzinach szukania wrednego błędu, zaimplementować algorytm szukania najkrótszej drogi. Jestem na etapie tworzenia jednostek, ich przesuwania i walki.  Jak na razie, gra posiada ok. 2500 linijek kodu choć myślę, że finalny produkt będzie miał ponad 5000 (z czego większość będzie stanowiło AI).

Salut !

2 comments
2012
05.04

Hej !

Skończyło się jak zawsze: miałem napisać tydzień temu kilka informacji na temat nowej gry, a jak zwykle zapomniałem / nie chciało mi się. Tym bardziej nie chciało mi się ponieważ w między czasie postanowiłem napisać grę na Compo (link to tematu na warsztat.gd). Tak moi drodzy, po raz pierwszy postanowiłem wziąć w nim udział. W skrócie wygląda to tak:

Na długi majowy weekend Warsztat proponuje compo! Macie czas do końca niedzieli 6 maja na nadesłanie gry w której można wykorzystać wyłącznie tekst. Nie ma ograniczeń w wyborze technologii ani gatunku gry.

(cytat ze strony http://warsztat.gd)

Prace są w toku, obecnie zaczynam powoli kończyć projekt, dzisiaj jeszcze dorobi się menu, jutro jakieś poprawki i uroczyste wysłanie zip’a na forum :)

Compo nie jest jednak głównym tematem tego wpisu. Jest nim projekt rozwijany już ponad miesiąc na silniku Irrlicht:

NATION

 

Nation to gra strategiczna w 3D. Akcja dzieje się we współczesności, gdzie zaczynamy mając jednego osadnika (coś a’la Civilization :) ). Zadaniem gracza jest stworzenie dobrze prosperującego państwa i pokonanie przeciwnika. To tak w skrócie. W miastach będzie możliwość zbudowania budowli które będą wpływały zarówno pozytywnie (wzrost zadowolenia, dochodów, większy przyrost ludności) jak i negatywnie (zanieczyszczenia, mniejsze zadowolenie). Na mapie rozsiane będą różne surowce naturalne, które umożliwią budowę lepszych jednostek wojskowych.

Co już mam ?

  • tworzenie miast i budynków (obecnie zaimplementowanych jest 15 rodzajów i prawdopodobnie tyle zostanie – w każdym z miast będzie możliwość zbudowania tylko 5)
  • mapa (obecnie dostępne są 3 rodzaje kafli, planuję dodać więcej)
  • surowce strategiczne (ropa, żelazo itp.)
  • tworzenie farm i kopalni (oczywiście w miejscach występowania surowców strategicznych)
  • GUI (z tym że jeszcze brak mini-mapy)
  • ekonomia i inne zależności (właśnie jestem na etapie ustalania wpływu np. zadowolenia na dochody czy zanieczyszczenia na czas budowy poszczególnych budynków)

Co jeszcze jest do zrobienia ?

  • tworzenie obozów wojskowych, rekrutowanie, poruszanie i atakowanie jednostkami wojskowymi
  • AI
  • dyplomacja
  • mini-mapa
  • menu (to akurat najmniej ważne)
  • zmiana modeli i tekstur – obecne są robione na szybko i pokazywanie screen’a mogło by się skończyć zawałem serca u któregoś z moich czytelników (jeżeli takowi istnieją)

Kolejny wpis będzie zapewne o wynikach mojej gry na Compo. Gdy wrócę do kodzenia Nation, postaram się na bieżąco informować o postępach.

Pozdrawiam !

4 comments
2012
04.22

Hej !

Ta szybka notka będzie miała charakter czysto informacyjny. Ostatni wpis datowany jest na (o zgrozo) 23 marca czyli niemal dokładnie miesiąc temu. Dlatego, żeby ktoś nie pomyślał że porzuciłem prowadzenie strony, informuje, że po egzaminach gimnazjalnych (czyli za jakiś tydzień) postaram się zamieścić wpis o projekcie, który rozwijam już ładne kilka tygodni. Nie będę podawał żadnych szczegółów, ale powiem tylko tyle że jest to strategia 3D :)

Pozdrawiam !

Dodaj komentarz
2012
03.23

Dżem dobry.

Sporo czasu upłynęło od ostatniego wpisu. Może część uzna za wymówkę to co powiem, ale bierzmowanie + nawał pracy skutecznie zniechęcał do jakiejkolwiek pracy nad kodem :) . Jednak dzisiaj, w ten przemiły piątkowy wieczór postanowiłem zredagować wpis o Boxie2D i SFMLu. Wiem że wiele osób ma problemy z integracją tych dwóch bibliotek, a zwłaszcza z odmiennymi zasadami panującymi w każdej z nich. Zapraszam do lektury :)

Metry i piksele

SFML jak i wiele innych (jak nie wszystkich) bibliotek graficznych, używa jako jednostkę odległości piksele. To chyba oczywiste. W Boxie2D sprawa ma się trochę inaczej, ponieważ tutaj używa się metrów. Już mówię dlaczego. Głównym powodem używania takiej miary jest dokładność fizycznych obliczeń. Box2D najlepiej radzi sobie z liczbami z zakresu 0.1-10 ponieważ wtedy obliczenia są najdokładniejsze. A ponieważ nikt nie będzie używał grafik 10×10 pikseli, wprowadzono wspomniane już metry. Wzory na przeliczenie:

  1. 1 metr = 50 pikseli czyli metry = piksele*0.02
  2. 1 piksel to 0.02 metra czyli piksele = metry*50

Radiany i stopnie

Sytuacja podobna jak wcześniej: SFML i inne biblioteki graficzne używają najczęściej do obrotów stopni. Natomiast Box2D radianów… dlaczego ? A dlatego że silnikowi łatwiej operować na takiej jednostce (chociaż twórcy mogli się postarać i wprowadzić wewnętrzny przelicznik stopnie->radiany oraz funkcje z argumentami w stopniach). Wzory:

  1. Stopnie =  (180 * radiany / PI)
  2. Radiany = (PI * stopnie / 180)

Centrum obrazka

SFML jako domyślny środek obrazka uznaje punkt (0,0). Jednak jeżeli podamy takie dane Boxowi2D, dostaniemy w prezencie pokaz, który fizykę ma głęboko gdzieś. Powód jest prosty: Box2D żąda prawdziwego środka obrazka… jeżeli jego długość i szerokość wynosi 64px na 64px to musimy wyznaczyć środek dzieląc obie wartości przez 2. Dopiero taki wynik (32,32) możemy przekazać dalej do naszego silnika fizycznego.

Wielkość

To tak dla formalności tylko. Jeżeli ustawiliśmy centrum w punkcie 32×32, pamiętajmy, by długość i szerokość była liczona od centrum obrazka czyli 32×32 a nie prawdziwe wymiary (64×64)… beznadziejnie wytłumaczone. Na poniższym kodzie będzie to mam nadzieje lepiej widać :)

Przykład

Teraz, żeby zobaczyć jak wygląda to w praktyce, przedstawię kilka fragmentów kodu. Mają one za zadanie utworzenie sprite’a, stworzenie świata fizycznego, utworzenie ciała i uruchomienie symulacji.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//Inicjalizacja świata, SFML'owego sprita i Box2d'owego obiektu. Zakładany obrazek ma wymiary 100x100:

b2World* mWorld;

b2AABB worldAABB;
worldAABB.lowerBound.Set( -3000.0f, -3000.0f );   //Wielkość świata
worldAABB.upperBound.Set( 3000.0f, 3000.0f );
mWorld = new b2World(worldAABB,b2Vec2(0,2.0),true);   //Tworzenie świata z grawitacją 2

sf::Image* mImage = new sf::Image;    //Ładowanie obrazka
mImage->LoadFromFile("Sciezka/do/twojego/obrazka");
sf::Sprite* mSprite = new sf::Sprite(mImage);   //Tworzenie sprita
mSprite.setCenter(50,50);   //Ustawiamy centrum obrazka (zakładam że obrazek ma wymiary 100x100)

b2BodyDef bodyDef;   //Tworzymy obiekt fizyczny Boxa2D
b2Body* body = mWorld->CreateBody(&bodyDef);
b2PolygonDef shapeDef;
shapeDef.SetAsBox(50*0.02f, 50*0.02);    //Ustawiamy wielkość obrazka licząc szerokość i wysokość od centrum (przeliczamy piksele na metry, 1 piksel to 0.02 metra)
shapeDef.density = 1.0f;
shapeDef.friction = 0.3f;
b2MassData mass;   //Ustawiamy masę
body->CreateShape(&shapeDef);
body->SetMassFromShapes();

///------------------------------------------------------------------------

///Teraz w pętli głównej dajemy coś takiego:

b2Vec2 pos = body->GetPosition();            //Pobieramy pozycję fizycznego obiektu
float rot = body->GetAngle();                //Pobieramy kąt rotacji obiektu
mSprite->SetPosition(pos.x*50,pos.y*50);        //Ustawiamy pozycje sprita
mSprite->SetRotation(-(180*rot/PI));            //Ustawiamy rotację sprita (przeliczamy radiany na stopnie)

float32 timeStep = 1.0f / 60.0f;
int32 iterations = 10;
mWorld->Step(timeStep, iterations);            //Symulacja świata

Zakończenie

Tak dobrnęliśmy do końca. Jeśli masz jakieś uwagi lub inne wskazówki godne dodania do tego wpisu, pisz śmiało :)

Pozdrawiam !

Dodaj komentarz
2012
03.03

Cześć :)

Po kilku dniach poprawiania błędów i dodawania nowych ficzerów, postanowiłem upublicznić kolejną betę gry Castle.

Lista zmian i nowości:

  • nowy typ pocisku: bomba (eksploduje gdy naciśnie się spację)
  • dodano chmury
  • zmieniono grafikę beczki z prochem
  • usunięto napisy na paskach mocy i kąta wystrzału pocisku
  • poprawiono kilka literówek
  • poprawiono wygląd tekstu na panelach, które pojawiają się gdy gracz zwycięży
  • poprawiono kamerę (podczas wystrzału nie widać przeskoku, wszystko odbywa się płynnie)
  • poprawiono jednostkę zarabianych pieniędzy
  • dodano log (w razie jakiś problemów z grą, proszę mi go przesłać)
  • dodano dym towarzyszący wystrzałowi pocisku

Dziękuje wszystkim, którzy wskazali mi błędy oraz pomocne sugestie co do rozwoju gry. Szczególne podziękowania dla m4tx’a :) .

Download: [klik] (w paczce gra i edytor)

 

Kolejna beta gry już wkrótce ! Pozdrawiam !

2 comments