Hei,
latailin tässä pari päivää sitten Visual Studio 2008 Expressin ja XNA Frameworkin, ja ihan kätevältä vaikuttaa. Toiminallisuutta saa tehtyä nopeasti, ja tutoriaaleja löytyy netistä ja tulipa mukana pätevän oloisen platformet-projektin sourcet kommentoituna.
Lähdin tekemään tuolla nyt sitten erään toisen henkilön kanssa TK-kloonia. Toteutettuna on nyt Player ja Bullet -classit yhdessä yksinkertaisen pelimoottorikoodin kanssa. Game-luokka luo oliot aina bulletteja myöten ja suorittaa update- ja draw-metodien kutsut luoduille olioille.
Lähdin nyt miettimään että kuinka tekisin Weapon-luokan toteutuksen. Tekisinkö Bullettien hallinnan täysin Weapon-luokan sisälle, vai olisi fiksumpaa että Weapon-luokka kutsuisi ampumisen yhteydessä takaisin Game-luokaa tekemään luodit ja hallitsemaan niitä (kuten nykyään on)? Vai kannattaisiko tehdä kokonaan erillisen luokan tyyliin BulletManager joka huolehtii luotien piirrosta, törmäystarkistuksista ja poistoista?
Suunnittelumalleista (Design Patterns) on tarkoitus ollut lukea joku pätevä kirja jo vaikka kuinka kauan, kyllähän sellainen hommata pitäisi... Ikävä vain ettei paikallisissa kirjastoissa ole, eli varmaankin ostaa pitäisi. Osaisiko joku jotain pätevää sanoa? Peliohjelmoinnin opettaja joskus yhtä mainosti, mutta ei enään muista mikäs se olikaan...
JTS: kerrohan kokemuksiasi XNA:sta tällä foorumilla kun olet tutustunut lisää. Itse aloin vähän aikaa sitten opetella SDL_DotNetia C#:in kanssa, ja sekin vaikuttaa hyvältä tavalta tehdä pelejä. Muut harrastukset vain rajoittavat tuota koodauksen etenemistä.
Varsinaiseen kysymykseesi hyvistä kirjoista en osaa vastata. Olen peliviritelmissäni pyrkinyt mahdollisimman puhtaaseen model-view-controller -malliin eli graafinen käyttöliittymä (view), pelimoottori (controller) ja kentät ja yksiköt (model) mahdollisimman erillään toisistaan, niin että yhden osan muuttaminen ei aiheuta hirveää muutostarvetta kahteen muuhun.
Äkkiseltään voisin kuvitella että luodeissa on niin paljon toiminnallisuutta että jonkinlainen oma BulletManager-luokka sitä pyörittämään olisi hyvä idea. Tunnet kuitenkin oman pelimoottorisi parhaiten joten tee niin kuin hyvältä tuntuu! (Tai opiskele asiaa kunnest tiedät täydellisen vastauksen)
Olisi epäloogista liittää panosten käsittely aseeseen: ammutulla panoksella ei (yleensä) ole enää mitään tekemistä alkuperäisen aseen kanssa, ja voihan esimerkiksi ase tuhoutua tai vaihtaa omistajaa, ennen kuin panokset osuvat. Toisaalta jos ase muuten käsittelee ampumistapahtuman itsekseen, tuntuu turhan mutkikkaalta luoda panokset jossain muualla. Minusta loogisin ratkaisu siis olisi, että ase loisi panokset itse ja palauttaisi ne jotenkin takaisin ylemmälle tasolle (esim. Game.AddObjects). Toki paras ratkaisu on se, joka sopii moottorin muuhun suunnitteluun.
XNA:n ominaisuuksien opiskelemiseen suosittelen http://www.amazon.com/Microsoft-Studio-Creators-Guide-Second/dp/0071614060/ref=dp_ob_title_bk
Itse omistan kyseisen kirjan ja auttoi sisäistämään XNA toimintamallin, mm. update(), draw() jne.
Kyllä, taitaa olla fiksuinta tehdä BulletManager-luokka, jonka oliota sitten voidaan passata weapon-olioille.
Kuten sanoin olen vielä melko uusi sekä XNA:n parissa että yleensäkin peliohjelmoinnissa, pitääpä kertoa kuulumisia kun projekti etenee (tuskin kovin hirveällä temmolla, ainakaan tällä viikolla kun muitakin deadlinejä lähestyy).
Ei ehkä fiksutapa, mutta itse tein luodin käsittelyn hahmoluokkaan. Hahmon respawn aika on kuitenkin suurempi kuin luodin max_lentoaika.
Aihe on jo aika vanha, joten et voi enää vastata siihen.