Platform játék
3D-s megjelenítés, véletlenszerű pályagenerálás, jutalmazó játékélmény
camera.h fájlreferencia
#include "global.h"
#include "floaters.h"
#include "player.h"
#include "map.h"
#include "particles.h"

Ugrás a fájl forráskódjához.

Makródefiníciók

#define cameraDeltaZDistanceStart   25
 
#define cameraDeltaZDistanceEnd   14
 
#define cameraDollyTime   3250
 

Függvények

void freeRenderMap ()
 A feldarabolós rajzoláshoz szükséges mátrixot szabadítja fel. Részletek...
 
void followPlayerWithCamera ()
 A játékost követi a kamerával, nem hagyja, hogy a pálya alá lásson. Részletek...
 
void menuCamera (int *getColumns, int *getRows)
 A menüben használt kamerát állítja be, visszaadja a columns-t és rows-t is. Részletek...
 
int getColumns ()
 Visszaadja, hogy hány oszlop látszik a pályából. Részletek...
 
bool cameraDollyZ (int deltaTime, bool restart)
 A kamera dollyzását végzi, a kamerát mozgatja A dolly állását staticban tárolja, ezért új dolly eseteén először egy restart = true-val kell meghívni,. Részletek...
 
intVector2D get2DPoint (vector3D point)
 Térbeli pontból síkbelit képez. A 3D-s pont koordinátái és a kamera alapján kiszámolja, hogy a kamera 2D-s szenzorán hol jelenik meg a pont. Geometriailag leírva, a két ponton (point, cameraPosition) átmenő egyenes egyenletének, és a 'szenzor' vízszintesének metszéspontja a keresett pontunk. A lent és a linken is látható egyenletet először a tér x-z, majd az y-z vetületére alkalmazzuk, és megkapjuk a térbeli pontunk megfelelő síkbeli leképezést. Ez interaktívan ábrázolva így néz ki: https://www.desmos.com/calculator/8qjvkptjmn. Részletek...
 
void drawCuboid (renderObject object, bool sides[])
 Lerajzol egy téglatestet A kamera modul lényege, a rajzolást végzi el az eddigi függvények segítségével. Részletek...
 
void drawMap (int deltaTime)
 Lerajzolja a teljes látható játékteret. A megfelelő rajzoláshoz figyelni kell a testek takarására, nem mindegy ezért, hogy milyen sorrendben rajzoljuk őket. A részecskéknél ezzel nincs probléma, azokat bármilyen sorrendben rajzolhatjuk. Ők a játékteret kitakarják, egymásnál viszont nem látszik, hogy melyik takrja melyiket, ezért azokat elég a játéktér után bármilyen sorrendben lerajzolni. A térképet alkotó kockáknál már nem ilyen egyszeű a helyzet. Azokat 4 irányból kell rajzolni, bal lentről, jobb lentről, bal fentről, illetve jobb fentről középre. Ha ebben a négy lépésben rajzoljuk őket (ezek között a sorrend nem számít) akkor mindig a legfesőket rajzoljuk utoljára, és így valósnak néz ki az eredmény. A játékos, a lövedékek, illetve az ellenségek viszont sajnos nincsenek egy négyzethálóhoz kötve. Így gyakran megesik, hogy az egyik felüket a pálya egyik kockája előtt, a másikat pedig az után, de még a kövektező előtt kéne rajzolni. Ezt nem tudjuk megcsinálni, hatalmas erőforrásba kerülne ez a majdnem pixelről pixelre történő szkennelés. A pályát továbbra is m^3-ént szeretnénk lerajzolni. Hogy ez megfelelően nézzen ki, minden köbméterben csak az abban a kockában lévő dolgokat szeretnénk megrajzolni. Ehhez fel kell "darabolnunk" a játékost, a lövedékeket, illetve az ellenségeket is. A darabolás azt jelenti, hogy egy mátrix minden cellájába beírjuk, hogy az adott kockában melyik, milyen tulajdonsággal rendelkező testek lógnak be. Rajzolásnál pedig a testeknek mindig csak az adott kockabeli részét rajzoljuk le. Mivel a kockákat jó sorrendben rajzoljuk, így a bennük levő "testekrészeket" is jó sorrendbe fogjuk rajzolni. A problémát megoldottuk. Részletek...
 

Makródefiníciók dokumentációja

◆ cameraDeltaZDistanceEnd

#define cameraDeltaZDistanceEnd   14

dolly end táv [m]

◆ cameraDeltaZDistanceStart

#define cameraDeltaZDistanceStart   25

dolly start táv [m]

◆ cameraDollyTime

#define cameraDollyTime   3250

[ms]

Függvények dokumentációja

◆ cameraDollyZ()

bool cameraDollyZ ( int  deltaTime,
bool  restart 
)

A kamera dollyzását végzi, a kamerát mozgatja A dolly állását staticban tárolja, ezért új dolly eseteén először egy restart = true-val kell meghívni,.

Paraméterek
mseltelt idő
kell-eújrakezdés?
Visszatérési érték
elérte-e a végállást? Minden frameban újraszámolja a rows&coulmns-t,

◆ drawCuboid()

void drawCuboid ( renderObject  object,
bool  sides[] 
)

Lerajzol egy téglatestet A kamera modul lényege, a rajzolást végzi el az eddigi függvények segítségével.

Paraméterek
testtéglatest adatai
boolmelyik oldalakat kell rajzolni? Végez egy plusz ellenőrést is, nem csak a paraméterben megadott tömb alapján nem rajzol oldalakat, azokat se rajzolja le, amiket a helyzetük miatt biztosan nem láthat a kamera.

◆ drawMap()

void drawMap ( int  deltaTime)

Lerajzolja a teljes látható játékteret. A megfelelő rajzoláshoz figyelni kell a testek takarására, nem mindegy ezért, hogy milyen sorrendben rajzoljuk őket. A részecskéknél ezzel nincs probléma, azokat bármilyen sorrendben rajzolhatjuk. Ők a játékteret kitakarják, egymásnál viszont nem látszik, hogy melyik takrja melyiket, ezért azokat elég a játéktér után bármilyen sorrendben lerajzolni. A térképet alkotó kockáknál már nem ilyen egyszeű a helyzet. Azokat 4 irányból kell rajzolni, bal lentről, jobb lentről, bal fentről, illetve jobb fentről középre. Ha ebben a négy lépésben rajzoljuk őket (ezek között a sorrend nem számít) akkor mindig a legfesőket rajzoljuk utoljára, és így valósnak néz ki az eredmény. A játékos, a lövedékek, illetve az ellenségek viszont sajnos nincsenek egy négyzethálóhoz kötve. Így gyakran megesik, hogy az egyik felüket a pálya egyik kockája előtt, a másikat pedig az után, de még a kövektező előtt kéne rajzolni. Ezt nem tudjuk megcsinálni, hatalmas erőforrásba kerülne ez a majdnem pixelről pixelre történő szkennelés. A pályát továbbra is m^3-ént szeretnénk lerajzolni. Hogy ez megfelelően nézzen ki, minden köbméterben csak az abban a kockában lévő dolgokat szeretnénk megrajzolni. Ehhez fel kell "darabolnunk" a játékost, a lövedékeket, illetve az ellenségeket is. A darabolás azt jelenti, hogy egy mátrix minden cellájába beírjuk, hogy az adott kockában melyik, milyen tulajdonsággal rendelkező testek lógnak be. Rajzolásnál pedig a testeknek mindig csak az adott kockabeli részét rajzoljuk le. Mivel a kockákat jó sorrendben rajzoljuk, így a bennük levő "testekrészeket" is jó sorrendbe fogjuk rajzolni. A problémát megoldottuk.

Paraméterek
mseltelt idő Ez a függvény elvégzi a részecskék, a pálya, illetve minden más test rajzolását is. A részecskék mozgatása innen van meghívva.

◆ followPlayerWithCamera()

void followPlayerWithCamera ( )

A játékost követi a kamerával, nem hagyja, hogy a pálya alá lásson.

◆ freeRenderMap()

void freeRenderMap ( )

A feldarabolós rajzoláshoz szükséges mátrixot szabadítja fel.

◆ get2DPoint()

intVector2D get2DPoint ( vector3D  point)

Térbeli pontból síkbelit képez. A 3D-s pont koordinátái és a kamera alapján kiszámolja, hogy a kamera 2D-s szenzorán hol jelenik meg a pont. Geometriailag leírva, a két ponton (point, cameraPosition) átmenő egyenes egyenletének, és a 'szenzor' vízszintesének metszéspontja a keresett pontunk. A lent és a linken is látható egyenletet először a tér x-z, majd az y-z vetületére alkalmazzuk, és megkapjuk a térbeli pontunk megfelelő síkbeli leképezést. Ez interaktívan ábrázolva így néz ki: https://www.desmos.com/calculator/8qjvkptjmn.

Paraméterek
Térvektortípusú pont
Visszatérési érték
Síkvektor típusú pont A visszaadott pontnak int koordinátái vannak, hiszen valamelyik pixel koordinátáit jelöli. Ez a függvény igazából egy camera obscura modellje.

◆ getColumns()

int getColumns ( )

Visszaadja, hogy hány oszlop látszik a pályából.

◆ menuCamera()

void menuCamera ( int *  getColumns,
int *  getRows 
)

A menüben használt kamerát állítja be, visszaadja a columns-t és rows-t is.