View previous topic :: View next topic |
Author |
Message |
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Tue Nov 13, 2007 10:16 pm Post subject: |
|
Debugo, neko citu tev nevar pateikt. Debugerim ir jābūt programmētāja labākajam draugam.
Kur tev tajā kodā it iterators palielina vertību? (tipa for (int i=0; i<N; ...) - ... daļa).
Nedrīkst salīdzināt jau no vektora izņemta iteratora vērtību ar dajebko citu (tb notiek tas Bullet.erase(it) un tu salīdzini while (it != itend).
Kā arī ņem vērā Storm pseidokodu. Sadali savu to ciklu divās daļās - updeitā un zīmēšanā - citādi tu esi piesaistījis updeitu programmas freimreitam. Un tas, kā tika izlemts tai citā topikā, nav labi.
Nav jēgas programmēt C++, ja neizmanto klases un to iespējas. Klase nav tikai dati. Klase ir arī metodes kā operēt ar datiem. Padari tos datus privātus un atļauj ar tiem operēt tikai caur klases metodēm (getteri/setteri neskaitās).
Kā arī izskatās, ka tu tur atmiņu līko - bēc Bullet.erase(it) izsaukšanas, kurš atbrīvos it atrodošos Bullet* pointeri? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Tue Nov 13, 2007 10:27 pm Post subject: |
|
ok, mēģināšu veidot mūsdienīgu dzini un atdalīt zīmēšanu no updeita.. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Storm
Joined: 11 Apr 2006 Posts: 742
|
Posted: Tue Nov 13, 2007 10:32 pm Post subject: |
|
Taadaa gadiijumaa, ja nav nosleepums, kad tad taa iztiiriishana notiks? kaa tu zinaasi ka jaaiztiira? Paarbaudiisi katru gaames updeitu vai visas lodes beigtas? XD |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Tue Nov 13, 2007 10:36 pm Post subject: |
|
Kur nu mūsdienīgu.. Pat vecajam 92.gada Wolfenstein 3D updeits ir atdalīts no zīmēšanas.
Tas ir jebkuras programmas pamatā, ne tikai spēļu - katram koda fragmentam vajadzētu būt pēc iespējas vienkāršam (iespēju robežās). Tam būtu jādara tikai viena konkrēta lieta. Nevajag visu samest vienā katlā (ciklā/funkcijā/klasē). Tādējādi pašam tikai vieglāk būs labot konkrētas lietas (tb gribēsi labot updeita kodu, nevajadzēs aizdomāties par to, lai nesalauztu renderēšanas kodu), kā arī mazāk iespēju ielaist bugus.
Taču diemžēl reāli tas ne vienmēr ir tik vienkārši un skaisti... Taču to paturēt prātā un censties tādu kodu rakstīt nenāk par ļaunu. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Tue Nov 13, 2007 10:40 pm Post subject: |
|
Storm: iztīrīšana būs starp līmeņiem easy, eh?
bubu: man spēlētāja klases viena funkcija (OnFrameMove) ir vienā bleķī, bet tāpat viss diezgan normāli saprotams _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Storm
Joined: 11 Apr 2006 Posts: 742
|
Posted: Tue Nov 13, 2007 11:13 pm Post subject: |
|
Nebuus saprotams ja buus piemeeram 8000 rindinjas gaamee
Par atminju... Ok, buleti, bet tev taks veel buus kaadi objekti ko lietosi? tos arii, piekaast, liimenja beigaas? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Tue Nov 13, 2007 11:16 pm Post subject: |
|
nu ložu skaits jau bieži var mainīties, citi objekti jau tā nemainās! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Storm
Joined: 11 Apr 2006 Posts: 742
|
Posted: Tue Nov 13, 2007 11:24 pm Post subject: |
|
Pretinieki saus lodes? Tu sausi lodes. Partiklju effekti? Kad pataisi par beigtu kaadu nabagu un aizskrien taalaak vai tev veel vajag glabaat to objektu? Un padomaa cik taadu objektu buus... un visi saus, duumii kuupees, etc un memorys tik pildiisies... nu nezinu gan kas taa par speeli tad Ok, platformers, bet taalaak? Nebuus vieglaak ja tas viss jau buus iegaajies un automaatiski domaasi uz prieksu un rakstiisi kodu saprotamu, komenteetu(loti silti iesaku... laikam kad tev buus vairaak nekaa tie paaris k rindinju...), un taadu kas netaisa bardaku atminjaa?
P.S Cik es zinu (kaut kaa fenomenaali arii par c++ ) tad Vectori ir vairaak domaati prieks random piekljuusanas, ar leenaaku izniicinaasanu un ievietosanu, kameer lists vairaak domaats prieks aatras lineaaras piekjuves un aatraakas ievietosanas un elemenu izniicinaasanas... Pie kuriem tu pieskaiti lodes? |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Tue Nov 13, 2007 11:41 pm Post subject: |
|
lists toties ir drausmīgi nedraudzīgs pret procesora kešatmiņu, kurai savukārt patīk lineārs piekļuves veids (vektors). lists arī šausmīgi fragmentē heap-atmiņu, ja bieži liek iekšā/ārā elementus. Uz katru ielikšanu - new izsaukums, uz katru izņemšanu - delete izsaukums.
Ja lodes ir jāvāc ārā/iekšā no tā vektora, tad kā es darītu - izdalītu atmiņu noteikta daudzuma elementiem vektorā ar reserve (piemēram 1000). Tad kad vajag ielikt elementu vektorā, tad vienkārši push_back taisītu. Un ja elementi paliks vairak par 1000, tad vektors pats automātiski visai jaukā veidā resaizosies divreiz lielāks. Un ja vajadzetu izņemt i-to elementu, tad paņemtu pēdējo elementu, ieliktu i-tā vietā, un izmestu pēdējo vektora elementu ārā (pop_back).
Tādējādi saglabātos visas jaukās īpašības:
1) lineārs piekļuves veids iterējot visam cauri.
2) gandrīz O(1) ielikšana, paretam palielinot vektora izmēru (bet tas notiksies visai ātri, ja vien nebūs miljons lodes)
3) O(1) elementa izņemšana. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Nov 14, 2007 3:45 pm Post subject: |
|
hmm...
šis..
Quote: | Un ja vajadzetu izņemt i-to elementu, tad paņemtu pēdējo elementu, ieliktu i-tā vietā, un izmestu pēdējo vektora elementu ārā (pop_back). | ir ideāls variants
BET.. ja man būs tikai 1 lode, un tā būs jādzēš? tai lodei būs jāgaida?
un jāņem vērā tas, ka izšautā lode nākamajā updeitā jau ir jādzēš! ko gan tad? _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Nov 14, 2007 4:59 pm Post subject: |
|
Ja i == masīva_garums, tad nevajag darīt to ņemšanu ārā un likšanu i-tā vietā. Pietiks tikai ar pop_back, lai izvāktu no masīva. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Nov 14, 2007 5:36 pm Post subject: |
|
oh.. kā es pats to neiedomājos
nu ok, tas izskatās normāli :)
bet.. kādu laiku pamocījies, tā arī nesapratu, kas ir masīva_garums starp iterator'iem? ja i ir tagadējās atrašanās vietas iterators...
ar it == Bullets.end() nesanāk... _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tenjou
Joined: 22 Nov 2005 Posts: 275
|
Posted: Wed Nov 14, 2007 6:14 pm Post subject: |
|
.capacity()
kautgan... |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Nov 14, 2007 6:14 pm Post subject: |
|
masīva garums ir elementu skaits tavā vektorā. Vektoram ir size() metode, kas atgriež šo skaitli.
Īstenībā tur vajadzēja i == pēdējā_elementa_indekss, jo pēdējā_elementa_indekss = masīva_garums-1. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Nov 14, 2007 7:34 pm Post subject: |
|
em... nu ok, izveidoju tur kkā... izskatās, ka darbojas varen labi
Code: |
std::vector<Bullet*>::iterator it = Bullets.begin();
std::vector<Bullet*>::iterator itend = Bullets.end();
while (it != itend)
{
Bullet* bb = *it;
bb->Position+=bb->Velocity;
if (bb->TimeLeft > 0)
{
bb->TimeLeft -= 1;
for (int i = 0;i<SceneBoxCnt;i++)
{
bool bcol = PointBoxCollision(&SceneBoxes[i],bb->Position.x,bb->Position.y);
if (bcol){bb->Active = false;}
}
}
else
{
bb->Active = false;
}
if (it == itend)
{
Bullets.pop_back();
break;
}
Bullet* bbb = Bullets.back();
if (bbb->Active == false)
{
*it = bb;
Bullets.pop_back();
return;
}
it++;
}
|
ja kkas lieks kodā, tad sakiet droši _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
|