Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Programare » Altele » Battle ships!




Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 07 Sep 2009 17:01:22    Subiect: Battle ships!
Deliverance info:

Deliverance:

www.gamesrebirth.com/adrian/graphics/BattleShips.zip

Sau battle cubes... Dupa 2.5 L de cola, o noapte de nesomn si cam 16-20 de lucru in continuu am terminat un mic joculetz in spiritul clasicului "Avioanele". Si cum am considerat ca ar fi interesant poate si pentru altii sa studieze tehnicile folosite pun la dispozitie sursele complete, si un exe pentru cei curiosi si nerabdatori sa vada despre ce este vorba. Cand va uitati pe surse aveti in minte ca nu am intentionat sa realizez un design foarte bun ci am vrut sa termin cat mai repede fara multe batai de cap.

Pentru realizare am folosit OpenGL, FMOD, GLUT.

In arhiva se afla si un mic document explicand cele 3 tehnici poate mai interesante, folosite.
Iata despre ce este vorba, enjoy:

Detectia coliziunii

Pentru a oferi jucatorului posiblitatea de a alege pozitia de atac cu mouseul a fost nevoie de implementarea unei tehnici de detectie a coliziunii. Am procedat dupa cum urmeaza. Ca date de intrare am considerat pozitia mouseului, transformarea de modelare si proiectie curente iar ca iesire linia si coloana celulei ce urmeaza a fi atacata.
Desi puteam implementa detectia coliziunii intre un segment de dreapta si cele doua triunghiuri ale celulei am ales o varianta mai interesanta care actioneaza in spatiul ecranului. Astfel am transformat si proiectat fiecare patrat specific fiecarei celule, in spatiu proiectiv(sau eng(leza) clip space):

    pos[k] = lastFrameMatrix * pos[k];    

Pentru a efectua proiectia propriu zisa impartim x,y la w(de z nu avem nevoie):

    pos[k].x /= pos[k].w;
    pos[k].y /= pos[k].w;

Se obtin astfel coordonatele normalizate(eng. NDC coordinates). In continuare se transforma aceste coordonate in coordonate fereastra(in care se afla si mouseul):

pos[k].x = (pos[k].x+1.0f) / 2.0f * 800.0f;
pos[k].y = (pos[k].y+1.0f) / 2.0f * 600.0f;
            
clamp(&pos[k].x, 0.0f, 800.0f);
clamp(&pos[k].y, 0.0f, 600.0f);    

Se testeaza in contiunuare daca mouseul se afla intre extremitatile minime si maxime astfel calculate:

if (pointInQuad(mouseX, mouseY, pos[1].x, pos[0].y, pos[0].x, pos[2].y) && j>=5 && j<10)
{
    *ii = i;
    *jj = j;
    
    return;
}

Simularea Dinamicii

Am optat pentru a simula dinamica unei bile conform legilor fizice. A fost nevoie astfel sa gasim o lege de miscare pentru aceasta bila. Datele de intrare reprezinta conditiile initiale ale corpului fizic: pozitia initiala(x0), viteza initiala(v0) si acceleratia(a). Ecuatia arata astfel:

x(t) = x0+v0*t+(a*t^2)/2

Aceasta functie va avea ca rezultat un vector(pentru ca x0,v0 si a(cceleratia) sunt vectori).
Datele necunoscute din aceasta ecuatie sunt reprezentate doar de valorile lui v0 pentru x,y si z. Consideram a = (0.0f, -5.0f, 0.0f). Stabilim in cat timp sa ajunga proiectilul la destinatie(fie el tMax) si astfel avem:

x(tMax) = x0+v0*t+(a*tMax^2)/2

Cum tot noi stabilim pozitia finala adica x(tMax) reiese:

pozFinala = x0+v0*t+(a*tMax^2)/2

si de aici scoatem v0:

v0 = (pozFinala - pozInitiala - 0.5f*tMax*tMax*a ) / tMax

Avand toate necunoscutele stabilite sau calculate nu avem decat sa varien timpul intre 0.0 si tMax pentru a obtine animatia bilei

Inteligenta Artificiala

Algoritmul este foarte simplu: AI-ul stie despre jucator atat cat stie si jucatorul despre el(adica nu stie unde sunt nave care nu au fost atinse).
AI-ul va cauta la fiecare iteratie o pozitie adiacenta, libera, cu o pozitie deja lovita, profitand de faptul ca navele nu sunt discontinue si in jurul unui patratel al unei nave se afla cel putin alt patratel al aceleasi nave. Daca nu gaseste o astfel de pozitie atunci va ataca intr-o pozitie libera, aleasa in mode aleator

Ultima editare efectuată de Deliverance pe 07 Sep 2009 17:41:40; 3 editări în total


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 07 Sep 2009 17:18:21    Subiect: < fara subiect >
BacioiuC info:

BacioiuC:

Acuma ma uit si eu peste sursa, si revin cu intrebari! Poti posta totusi un .exe? Nu prea simt nevoia sa instalez ce imi trebuie Razz.


Status:
Înregistrat pe:
14 Mar 2009 23:58:07
Vârsta: 21 ani
Mesaje: 89
Locatie: Bucuresti
Game designer
Freelancer
 
    Postat la 07 Sep 2009 17:42:42    Subiect: Re:
Deliverance info:

Deliverance:

BacioiuC a scris:

Acuma ma uit si eu peste sursa, si revin cu intrebari! Poti posta totusi un .exe? Nu prea simt nevoia sa instalez ce imi trebuie Razz.


Am facut update la link. Initial gresisem linkul, care trimitea spre o versiune fara exe Very Happy.


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 

Pagina 1 din 1 [ 1 ]


Server time: 09:41:58 19.05.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2006 - 2012 Copyright 7thFACTOR Entertainment - All rights reserved