Tetris - kolize – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Tetris - kolize – C / C++ – Fórum – Programujte.comTetris - kolize – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Geralt
~ Anonymní uživatel
21 příspěvků
18. 8. 2007   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Geralt
~ Anonymní uživatel
21 příspěvků
19. 8. 2007   #2
-
0
-

Nikdo jste nikdy neprogramoval tetris nebo neco pdobneho ???

Nahlásit jako SPAM
IP: ...–
mephi0
Expert
19. 8. 2007   #3
-
0
-

ja som to robil len porovnavynim lavych hornych bodov.
vyzeralo to nejak takto:
pohyb
kolizia ? !pohyb : pokračuj
vykresli

asi som veľmi nepomohol :) napiš pls na icq, tvoje som nenašiel

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Jonyzz0
Návštěvník
20. 8. 2007   #4
-
0
-

Podle mě na to jdeš příliš složitě. Taky jsem jednou programoval tetris ale hrací plochu jsem měl uloženou do 2D pole, kde každá hodnota v poli vyjadřovala, zdali se na daném místě kostka nachází (popřípadě, podle hodnoty, jakou má barvu). Testování kolízí pak probíhalo docela snadně, stačilo otestovat, zdali je na daném místě v poli hodnota větší než 0 (kostka tam je), a podle toho posunout padající kostky směrem dolů.

Návod jak naprogramovat tetris je například na http://www.builder.cz/art/cpp/allegroXIV.html
Je tam sice použito místo SDL použito Allegro, ale ten princip fungování hry je tam popsanej dobře.

Nahlásit jako SPAM
IP: ...–
Tomas_D
~ Anonymní uživatel
3 příspěvky
20. 8. 2007   #5
-
0
-

No jestli to chceš dělat efektivně a né takovej pokus/omyl. Tak by sis mohl udělat nejdřív Engine kterej bude podporovat detekci kolizí. Pak tu základní animaci tý hry uděláš za 1-3hodiny. A další 0.5 - 1.5hodiny k udělání vstupu. Jde oto že to můžeš požít třeba když budeš dělat tak Engine PackMana a uděláš ho taky hned. Dobře to je vysvětleno v této knize http://knihy.cpress.cz/knihy/pocitacova-literatura/programovani/naucte-se-programovat-pocitacove-hry-za-24-hodin/ Je to teda Win32, ale to co ti dá je skoro k nezaplacení.

EDIT: Taky je dobrý si předem promyslet jak to budeš psát, třeba na papír si sepsat kroky či rozepsat OOP, ale příště. :)

Tak Good luck :)

Nahlásit jako SPAM
IP: ...–
Geralt
~ Anonymní uživatel
21 příspěvků
20. 8. 2007   #6
-
0
-

To Jonyzz: s temi kostickami to bude celkove jednodussi, prepisu to ... jinak navod jak programovat tetris nechci, programuju ho predevsim proto, abych se to naucil, ne opsal :):)

To Tomas_D: je fakt ze do detajlu to rozmyslene nemam, ale protoze uz jsem (v jinych jazycich) par her programoval, tak urcitou celkovou predstavu o engeenu mam ... jinak mam doma na stole knihu Vyvoj her v jazyku Java od Brackeena, tak nevim jestli by ty 300 za tu druhou nebyly vyhozene penize ...

To all: myslite ze je kniha Naucte se programovat pocitacove hry za 24 hodin rozumna investice, ze v ni najdu neco noveho a prinosneho?

Diky Geralt

Nahlásit jako SPAM
IP: ...–
mephi0
Expert
20. 8. 2007   #7
-
0
-

To all: myslite ze je kniha Naucte se programovat pocitacove hry za 24 hodin rozumna investice, ze v ni najdu neco noveho a prinosneho?



nie, nie je to rozumná investícia.

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Tomas_D
~ Anonymní uživatel
3 příspěvky
21. 8. 2007   #8
-
0
-

Tu knihu napsal profik, chtěl to napsat pro začátečníky a dát jim co nejvíc, mohl by jí napsat o DirectuX, ale to by asi musel napsat půl knihy jenom otom jak DX vznikl a vše by bylo složitější, tak to všechno vysvětluje na Win32 API. No a když už DX znáš nebo se ho pak doučíš, tak to co ses v ní naučil využiješ. Opravdu je v ní nádherné ukázané jak má hra fungovat, aby jsi se mohl pak pustit do něčeho většího.
Já teda nevim co je v té knize o Javě, ale jestli se chceš s hrama dál zabývat tak bych do ní šel. Akorát před ní doporučuju se na Window API podívat aspoň z on-line kurzu. Třeba zde: http://builder.cz/serial91.html neřikám přečíst to celý!.

Tak opět good luck :)

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 275 hostů

Podobná vlákna

Kolize — založil Dusan

Kolize — založil "Andrje"

Kolize — založil milanmichal

Kolize v DelphiX — založil spartan13

Kolize v konzoli — založil :D

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý