Ahoj,
abych se naucil programovat v C++ a pouzivat knihovnu SDL programuju znamou hru Tetris (kdesi jsem cetl ze je dobre touto zacit). Pro spravu kolizi jsem si vytvoril nasledujici funkci, bohuzel nefunguje presne tak, jak bych si pral (viz nize).
bool Tile::update(long relapsedTime, Tile * obst, int count)
{
// cas uplynuly od posledniho volani teto funkce pricteme k casu uplynulemu
// od posledni akce (tj. pohybu o sirku ctverecku dolu)
elapsedTime += relapsedTime;
// pokud nastal cas pro pohyb (tj. celkovy cas od posledni akce je rovny,
// nebo o neco malo vetsi nez nastavena prodleva mezi akcemi
if (elapsedTime >= MS_FOR_UPDATE)
{
// signalizuje vyskyt prekazky (true - bez prekazky, false - prekazka)
bool canUpdate = true;
// kolize se spodnim okrajem hraci plochy
if (y + core->getImage(facing)->h >= BOARDY_MAX) canUpdate = false;
// projdeme kolizi se vsemi vykreslovanymi obrazky
for (int i = 0; i < count; i++)
{
// pro prubezne ukladani souradnic rohu
int d1X[10], d1Y[10];
// ziskame rohy vykresleneho obrazku a jejich pocet
int num1 = obst[i].getDots(d1X, d1Y);
// pro vsechny rohy
for (int j = 0; j < num1; j++)
{
// pokud tento okraj neni vodorovny (tj. rohy nemaji stejnou
// y-ovou souradnici), ignorujeme jej
// POSLEDNI OKRAJ (tj. okraj num1-1 - 0) JE VZDY SVISLY (viz.
// poznamka v souborech info)
if (d1Y[j] != d1Y[j+1]) continue;
// pro prubezne ukladani souradnic rohu
int d2X[10], d2Y[10];
// ziskame rohy soucasneho tile obrazku
int num2 = getDots(d2X, d2Y);
// pro vsechny rohy
for (int k = 0; k < num2; k++)
{
// prednacteme tuto hodnotu (usetrime volani funkci,
// zprehlednime kod)
int x1 = obst[i].getX();
bool temp = false;
// pokud roh lezi mezi krajnimi body okraje, pak muze dojit ke kolizi
if (x + d2X[k] > x1 + d1X[j] && x + d2X[k] < x1 + d1X[j+1]) temp = true;
if (x + d2X[k] < x1 + d1X[j] && x + d2X[k] > x1 + d1X[j+1]) temp = true;
// pokud roh s nasledujicim tvori usecku, na ktere lezi jeden z okraju, muze dojit ke kolizi
if (k < num2-1 && x1 + d1X[j] < x + d2X[k] && x1 + d1X[j] > x + d2X[k+1]) temp = true;
if (k < num2-1 && x1 + d1X[j] > x + d2X[k] && x1 + d1X[j] < x + d2X[k+1]) temp = true;
if (!temp) continue;
// pokud se roh nachazi vertikalne nad vymezenou useckou,
// zamezime pohyb
if (y + d2Y[k] == obst[i].getY() + d1Y[j])
{
canUpdate = false;
break;
}
}
}
}
if (canUpdate)
{
elapsedTime = 0;
y += TILE_WIDTH;
return true;
}
else { return false; }
}
return true;
}
Z pole obst lze volanim funkce getDots() ziskat souradnice rohu jednotlivych obrazku (tech, ktere jsou uz na obrazovce vykreslene), pomoci prosteho getDots() ziskame souradnice rohu aktualniho obrazku (tj. toho, ktery zrovna "pada"). Rohy jsou cislovane od leveho horniho po smeru hodinovych rucicek.
Tato funkce ve vetsine pripadu odvadi skvelou praci, existuje jedina vyjimka - pokud se hrana obrazku dotyka stejne dlouhe hrany obrazku druheho, kolize neni zaznamenana a obrazek projede skrz druhy. Je to tim, ze pri zjistovani jestli ten ktery bod lezi na urovni te ktere usecky pouzivam znamenka <, resp. > a ne <=, resp. >=. Z prosteho duvodu, jinak by kolize nastavala i pokud by obrazek padal tesne vedle jineho obrazku (protoze roh uplne vlevo nahore ma souradnice [0;0]).
Chci se zeptat, jestli jste nekdo nahodou neco podobneho neprogramoval, tak jestli neporadite jak jste kolize spravovali vy, prip. jestli vas neco nenapada ...
Diky Geralt