Ne znam kako su to radili u Westwood Studios-u, ali mogu da ti kažem kako sam ja to radio u svom RTSu - siguran sam da su osnovni koncepti u dlaku isti u svim RTSovima.
Ali možda bi trebalo prvo da počnemo od jednostavnijeg primera - Pong.
U ovoj igri su reketi levo i desno predstavljeni
jednom jedinom varijablom - Y položaj reketa na ekranu. Loptica je predstavljena pomoću 4 varijable - X položaj lopte, Y položaj lopte, promena položaja X u jednom ciklusu, promena položaja Y u jednom ciklusu. Širina reketa i njihove Y pozicije su verovatno bile hardkodirane u ono doba. Igra se zasnivala na tome da se u svakom ciklusu apdejtuje pozicija lopte, proveri da li je udarila u zid, proveri da li je udarila u levi reket, proveri da li je udarila u desni reket, proveriti da li je prošla kroz levu gol liniju, pa onda da li je prošla kroz desnu gol liniju, eventualno odbiti loptu ako je potrebno, primiti delta koordinate reketa od igračkih upravljača, apdejtovati Y pozicije reketa, i početi sledeći ciklus.
25 godina kasnije, C&C prati potpuno isti koncept, samo je sve dovedeno na novi nivo složenosti. Svaka jedinica je u memoriji kompjutera predstavljena gomilom varijabli. Sve vreme, bez obzira da li je na ekranu ili nije. Nikakvih "specijalnosti" tu nema. E sada, kako se ove varijable skladište, to je drugo pitanje. U poslednjih 10ak godina svi podaci u kompjuterskim igrama skladište se u vidu klasa. Ne znam da li ti treba objašnjavati pojam klase, pa te neću potencijalno vređati objašnjenjem. Ali bitno je znati ovo: po izgradnji nove jedinice odvaja se deo RAM memorije za skladištenje podataka o toj jedinici i programu se daje adresa te memorije da je ima u vidu. Kada jedinica zagine, oslobađa se odgovarajući deo memorije. Programeri vole da ograniče maksimalan broj jedinica (meni se u C&C2 desilo da dođem do granice), ali ne toliko zbog problema sa memorijom koliko zbog toga što previše jedinica preterano usložnjava i usporava program.
Na primer, neke varijable koje se koriste za opisivanje stanja jedinice u RTSu koji koristi bitmape:
- pozicija (xyz)
- trenutan vektor kretanja(bilo u delta xyz ili u formatu theta-phi-speed) i facing jedinice
- trenutni hit pointsi jedinice
- (vrlo bitno) pokazivač na VRSTU jedinice (bilo bi ekstremno nepraktično skladištiti podatke o maksimalnoj brzini grizli tenka u svakoj jedinici, jer svi imaju istu maksimalnu brzinu. Zato odvojiš mali deo memorije za opisivanje konstantnih vrednosti za određene VRSTE jedinica)
- trenutno stanje oružja, koliko ostaje cooldowna (vremena dok jedinica ne može ponovo da zapuca)
- privremene AI varijable (poslednji A* path, mod, koordinate na koje je poslana ova jedinica, trenutno AI stanje i skript koji se izvršava)
- nivo trenutnog iskustva, goriva, municija, štagod...
Ako se imalo baviš programiranjem predlažem ti da pokušaš da napraviš klon Ponga. Ja sam to (dokazano) jednom prilikom uradio za 25 minuta još dok sam bio relativni početnik. Mislim da će ti to objasniti neke stvari koje si hteo da pitaš.
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan