of 20 /20
TINR @ FRI, draft v09, Peter Peer ++ 51 Poglavje #4 (igralnost) (Bojan Klemenc++) Aktualne škatlice: oblikovanje igralnosti o igralnost poudarek predvsem na tem delu, ker o splošnih zadevah glede programiranja igralnosti ni veliko za povedat (razen kar je o sami arhitekturi objektov igre) arhitektura igre o arhitektura objektov igre 1. pravila igre o splošna pravila igre o pravila integrirana v objekte igre shranjevanje (str. 118119, 304307) o serializacija 1. Igralnost Poskus opredelitve s sintezo opredelitev različnih avtorjev: Igralnost (gameplay, playability) je interakcija z igro preko njenih pravil, povezava med igralci znotraj igre, izzivi in reševanje leteh, zgodba in vpletenost igralca v zgodbo [Wikipedia10]. Igralnost je subjektivna in odraža doživljanje igre. Pravila igre in mehanika igre (game mechanics): Mehanika igre je potek igre iz nekega začetnega stanja z interakcijo med pravili igre in akcijami igralca. Posledično igralec doživlja igro: igralnost. [de.wikipedia10]

TINR Skripta Predavanj 4

Embed Size (px)

DESCRIPTION

games

Text of TINR Skripta Predavanj 4

  • [email protected],draftv09,PeterPeer++ 51

    Poglavje#4(igralnost)

    (BojanKlemenc++)

    Aktualnekatlice:

    oblikovanjeigralnostio igralnost

    poudarekpredvsemnatemdelu,kerosplonihzadevahgledeprogramiranjaigralnostinivelikozapovedat(razenkarjeosamiarhitekturiobjektovigre)

    arhitekturaigreo arhitekturaobjektovigre

    1. pravilaigreo splonapravilaigreo pravilaintegriranavobjekteigre

    shranjevanje(str.118119,304307)o serializacija

    1.Igralnost

    Poskusopredelitvessintezoopredelitevrazlinihavtorjev:Igralnost(gameplay,playability)jeinterakcijazigroprekonjenihpravil,povezavamedigralciznotrajigre,izziviinreevanjeleteh,zgodbainvpletenostigralcavzgodbo[Wikipedia10].Igralnostjesubjektivnainodraadoivljanjeigre.Pravilaigreinmehanikaigre(gamemechanics):Mehanikaigrejepotekigreiznekegazaetnegastanjazinterakcijomedpraviliigreinakcijamiigralca.Posledinoigralecdoivljaigro:igralnost.[de.wikipedia10]

  • [email protected],draftv09,PeterPeer++ 52

    Primer:(Gospodarska)simulacija(Constructionandmanagementsimulation)obravnavanekogospodarskopanogozdoloenegazgodovinskegaozadja,izesarizhajazaetnostanjeigre(TransportTycoon:simulacijalogistinegapodjetjaodzaetka20.st.naprej).Pravilaigresimulirajogospodarstvoproizvodnja,ponudba,povpraevanje,finannitokovi.Tevrednostisespreminjajovodvisnostiodasa,morebitniraunalnikovodeninasprotnikireagirajonadelovanjeigralcatojemehanikaigrevojemsmislu.Igralnostpajepolegmehanikeesubjektivnoovrednotenaizkunja,kijoimaigralecmedigranjemsmozaznavanjepotekaigre,poglednazemljevidinstatistike,kisorezultatnjegovegaigranja.edvezanimiviopredelitvi:Igrajezaporedjezanimivihizbir(aseriesofinterestingchoices)SidMeierIgralnostjeedenalivezaporednihvzronoposledinihizzivovvsimuliranemokolju(Oneormorecausallylinkedseriesofchallengesinasimulatedenvironment)InternationalGameDevelopersAssociationIgralnostlahkoopazujemo(inmerimo)zvevidikov[Gonzlez10]:Zadovoljstvo:stopnjazadovoljstvaoznaujeigralevobutekuitkapriigranjuigrevcelotialikakneganjenegadela:mehanika,grafika,zgodbaipd.Zadovoljstvojeprecejsubjektivnointekomerljivo.Uenje:omogoarazumetiinobvladovatisisteminmehanikoigre.Vprimerjavizuporabnikimiprogrami,kjersielimoimmanjuenjainimboljpreprostouporabo,jelahkopriigrahkoliinainhitrostuenjaodvisnaodvrsteigre:igralcalahkoenazaetkuigrezintenzivnimtreniranjemnauimoobvladovatiigroalipagapostopomanauimopopotrebi.Lahkotudipredpostavimo,daimaigralecdoloenesposobnostiepredenjezaeligratiigro.Uinkovitost:Kakodobroigraizkoristiasinvire,daseigraleczabavamedtem,koposkuadoseiciljeigrekakodobroigrapritegnepozornostigralcaodzaetkadokonca.Zatomoramodobroporazdelitinaloge(oziromaizzive).Zatopljenost:Kakodobroseigraleczatopivnavideznisvet.Igralecpostanedelnavideznegasveta.Daigralecostanezatopljenvigro,jepotrebnoposkrbetizadobrorazmerjemedizziviinveinami,kisopotrebne,dapremagaizzive.Kakopoveatizatopljenost:

    izkoristiradovednostigralca nekateriodgovorinaskrivnostisolahkodvoumni igralcuponudirazlinemonostiinnovesvetove igralcupokaikuliso(innetistega,kijoupravlja) igralcupokaistvari,kigazanimajointakoohranizanimanjedoigre ustvariritem principnedovrenosti,umnajzapolnimanjkajoe prikaistvarivvejemalimanjemobseguodpriakovanega strahospotovanje domiljija zanimivezgodbeinliki zvok(nevidenega).

  • [email protected],draftv09,PeterPeer++ 53

    Motivacija:Kakopripravitiigralca,daizvrinekadejanja,oziromavztrajaprinjihovemizvajanjudoklerjepotrebno.Takojepotrebnoposkrbeti,daseigralecosredotoinaizzive,nalogemorajoimetismisel,nagraditijepotrebnonapredekznotrajigre.Sistemnagrad:

    nagradezadoseke nagradeprihajajovciklihpo15min nagradelahkoustvarijoritem nagradesedopolnjujejo nagradezanaloge,kinajjihigralecizkusi zbirkemanjihnagradvodijodovelikihnagrad.

    ustva:pomagajo,daimeigralecimboljeizkunjepriigranjuigre.Zuporaboizzivov,zgodbe,situacij,estetskegaizgleda,glasbeitd.lahkoizzovemorazlinaustvenastanja,kotnaprimerveselje,strah,radovednost,alost.Vkratkemasulahkoigranjevzbudirazlinaustva,kisevresninemivljenjualinebipojavilaalipapojavilavtakokratkemasu.Druabnost:Vkaknemobseguigraspodbujadruabnost(priigranju)innjenvplivnadoivljanjeigre.Igralcilahkoreujejonalogeskupajalipatekmujejo,pritemsetvorijonovarazmerja,lahkopasetudiobstojearazmerjavresninemsvetupreslikajovsvetigre.Zaspodbujanjedruabnostilahkovigrovkljuimoizzive,kisoskupniveigralcem,jihtakozdruujejoinmotivirajo,daskupajpremagajoizzive.Druabnodoivetje:druabneigreigrenaosebnihraunalnikihspletZadruabnodoivetjefizinaprisotnostvokolicinivenujnopotrebna(povezavajelahkotudisamoprekotokovanjaizidovlestvica).Smernice:

    ustvariprilonostizatekmovanje ustvariprilonostizasodelovanje omogoiigralcempokazatisvojespretnosti omogoiigralcemindividualnostinrazkazovanjeznaaja dodajorodjazakomunikacijoinizmenjavo omogoiobutekmentorstvainobutkazadovoljstvaobuspehudrugih omogoiljudem,dagledajo.

    Pregledpojmov,kisopomembnizaigralnostinnakajmoramobitipozorni:Cilji/naloge(objectives):Ciljiznotrajigresozahteve,kijihjepotrebnoizpolniti,dadoseemodoloenizid.Vzpostavljajokonflikteinizzive,motivirajoigralcaskonnimnaboromreljivihproblemov.Vosnovidajoigralcumonost,danekajpone.Priigrahjepomembnapotdociljaoziroma,daseigralecobtemzabava.Izidi(outcomes):Igreimajomnoicomonihizidov(konecigre),kisoposledicaigralevihdejanj(interakcijezigralcem).Bitimorajomerljiviigralecugotavljasvojouspenostnapodlagimerljivihizidov.Nekateriizidisobolji,nekaterislabi;brezmerjenjaizidovlahkopridemodosituacije,konevemo,kdojezmagal.Najboljosnovnaizidastazmagainporaz,tretjipogostizidpajeneodloeno.Negotovost(uncertainty):

  • [email protected],draftv09,PeterPeer++ 54

    Odigrepriakujemo,dasoizidinegotovi.Vnasprotnemprimeruigramoigro,vkaterijeizidvnaprejdoloennegledenato,kakoigramo,inigrapostanenezanimiva.Igralcielijovigrinekajdosei,vendarpamoraobstajatimonost,dajimnebouspelo.Ciljnapublika(targetaudience):Glavnopravilo:nikolineposkuajzadovoljitivsehigralcev,kerzvelikoverjetnostjonebozadovoljilnobenega.Potrebnojeidentificiraticiljnoskupinoinugotovitinjihoveelje.Pritemsilahkopomagamotako,dasizamislimoinnakratkoopiemoprofiletipinihuporabnikovciljneskupine(tipiniigralnias,obstojeeigre,kijihigrajoipd.).Obvladovanjeigre:Zaveinoigralcevjesmiseligreuporabitispretnostiinznanje,dazmagamo(obrnemo)igro.Polegsameeljepozmagijepomembenobutekkakodobrismo(in,datolahkopokaemodrugim).Porazjevtemprimerusprejemljiv,sajnamjezmagaizziv.Pomembenjeobuteknadzoraenimamonadzorainizgubimoalizmagamo,nizabavno.Nekajnasvetov:

    igranajpreizkusisposobnostiigralca preizkusimolahkovesposobnostinaenkrat zmanjatijepotrebnovplivsree ponuditiigralcemvabljivenagrade(vigriseveda) predpomembneciljejepotrebnopostavitivejeovire ponuditiigralcemmonost,datvegajo ponuditiveciljevnaenkrat,dalahkoigralecizoblikujestrategijoobdelovanjaciljev ponuditiigralcu,daizberestopnjotveganja ejemono,navideznopoveatiobutekteavnosti(dejanskateavnostjelahkomanja).

    Principkarjekamenpapir:Cilj:prepreiti,daigraleczenostrategijodominiraigroterstempovzroi,dasovseizbiretrivialne.Primer:pogostoseuporabljavstrategijahpeakskopjempremagakonjenika,konjenikpremagalokostrelca,lokostrelecpremagapeaka.Teava:kakonarediti,daovirenebodopretekeinpovzroalefrustracije?

    Ostatimoramovidealnempodroju.Teavnost:

  • [email protected],draftv09,PeterPeer++ 55

    Igranesmebitipretekaaliprelahka.Kervsiigralcinisoenakospretni,jimlahkoponudimomonost,dasamiizberejotakoteavnost,dalahkoevednouivajovigri.Dejavniki,kijihlahkospreminjamo:

    as(hitrejialipoasnejitekigre) tevilonasprotnikov znailnostinasprotnikov(poasneji,ibkejinasprotniki,omejenaUI) koliinavirov porazdelitevingostotaobjektovzapovrnitevalinadgradnjomoi(powerups).

    Dejavnikiselahkospreminjajotudisamodejnotakoseteavnostlahkoprilagajaigralevimsposobnostim.Informacije:Kolikoinformacijdamoigralcuoziromakolikojihskrijemo.Informacijezmanjujejonegotovost.Igreuporabljajopristopegledenato,kolikoinformacijnudijoigralcu(poker,ah).Kadarjeigraprevepredvidljiva,bilahkoponepotrebnem(...???)dodalinakljuje,vendarpavveiniprimerovzadoa,daigralcuneponudimodoloenihinformacij(omejenovidnopoljepristrategijah(fogofwar)).Kratkoronispominigralca:Kratkoronispominlahkonaenkrathrani(inhkratiobdeluje)72podatka.eelimo,dasiigralecnekajzapomni,potemsedrimospodnjemeje,eelimo,dapozabi,potemgremovijeodtemeje.Vendarpamoramopaziti,daigralcanezasujemospodatki,sajlahkopovzroimofrustracije.2.ArhitekturaobjektovigreKompozicijainagregacija(2.poglavje/3.predavanje):jetoponovitev...???dodatekzveprimeriProblemihierarhijeobjektov[Chandy09]:Imamohierarhijorazredov:

    elimododatimonostanimiranja.Nekateriobjektisebodosamoizrisali,nekateribodotudianimirani,nekateribodosimuliraniinanimirani,nekaterisamosimulirani:

  • [email protected],draftv09,PeterPeer++ 56

    Monareitevzvekratnimdedovanjem:

    Kajpa,esepojavizahteva,daseobmojeproilca(trigger)izrienaekranu(drawable)?eenprimerizkonkretneigre:RedeemerizUnrealTournamentakakorealizirati:kotizstrelek,kigaigraleclahkokrmili;kotkamero,kilahkoustreli(ubije)nasprotnika?Reitev:kompozicijaUporabnostkompozicije:Primernaknadnerekonstrukcijehierarhijerazredov(zvekratnimdedovanjem)izigre,kjersejeuporabilmodelkompozicije:

  • [email protected],draftv09,PeterPeer++ 57

    Izslikejerazvidno,dajeuporabakompozicijeomogoaprecejvelikokompleksnostebimodeliralishierarhijorazredov,postanemodelprecejnepregleden,teavenzaspreminjanjeindopolnjevanje.Zgradbaobjektovspomojokomponent:

  • [email protected],draftv09,PeterPeer++ 58

    Predstavitevvoblikimree:objektisovodoravno(naprimerigralec),navpinokomponente(igralecimakomponentepozicija,premikanje,izris,skriptinfiziko).obrazloitev...???Vzorcinartovanjaobjektov(designpatterns):Vzorcinartovanjaobjektovpodajajoreitveproblemovindoloenihsituacij,kisepogostopojavijoprirazvojuprogramskeopreme.Kerreujejoproblemenavijemabstraktnemnivoju,sejihnavadnonedadobitivoblikiknjinic.Oglejmosinekajnajpomembnejihvzorcevzvidikaiger:Edinec(Singleton):Problem:Potrebujemonatankoenoinstancorazreda,kijedostopnacelotnemuprogramu,globalno.Reitev(predstavljenazUMLrazrednimdiagramom):

    Implementacijaimanavadnoenotokozaustvarjanjeindostop,karnamdajepotrebnokontrolonadinstancoznotrajcelotnegaprograma.Uporabavigrah:Predvsemstrojnivirigrafinenaprave,zvonenaprave,upravljalcipomnilnika,upravljalcidatotek,mrenivmesniki.Vendarpasedoloenenapravelahkopojavijovekrat,npr.igralnepalice,pomnilnikekartice.Slednjeimplementiramokotnavadneobjekte.Polegstrojnihvirovlahkotavzorecuporabimorecimozadnevnik,opozorila,akalnovrstozasporoila,aliceloobjekt,kipredstavljasamoigro.Posledice:Lahkosepojavivelikoglobalnihspremenljivk(objektov;znjimiimamoleboljinadzornadustvarjanjeminunienjemletehvprimerjavisspremenljivkami),modularnostinpreglednostkodejemanja,zato,eseleda,seposkuamotemuvzorcuizogniti.Primer:public class MemoryManager { private static final MemoryManager INSTANCE = new MemoryManager(); // Private constructor prevents instantiation from other classes private MemoryManager() { } public static MemoryManager getInstance() { return INSTANCE; } } Uporaba:MemoryManager mm = MemoryManager.getInstance(); (Lepebibilo,ebiizimenarazredabilojasno,dagrezaSingleton.)XNIprimer:.h:@interfaceTouchPanel:NSObject{...}...

  • [email protected],draftv09,PeterPeer++ 59

    +(TouchPanel*)getInstance;@end.m:@implementationTouchPanelstaticTouchPanel*instance;(id)init{ self=[superinit]; if(self!=nil){ ... } returnself;}+(void)initialize{ instance=[[TouchPanelalloc]init];}+(TouchPanel*)getInstance{returninstance;}@end

    Tovarnaobjektov(ObjectFactory):Problem:Vasihelimoustvaritiobjektrazreda,kiga(torejnjegovegatipa)enepoznamovtrenutkuprevajanjaprograma.Tipdoloimoelevasuizvajanja.Reitev:

    Namestoustvarjanjainstancznew,imamotovarnoobjektov,kijisporoimoprekoklicametodezustreznimparametrom,kateriobjektnajustvariintovarnaustvariinvrnetaobjekt.Uporabavigrah:Tovarnaobjektovimakljunovlogopripodatkovnovodenemrazvoju.Npr.prinalaganjustopnjezvsemiobjektinimamometode,kieksplicitnopoklienewzavsakobjekt,ampakpreberemodatoteko,kivsebujeseznamvsehpotrebnihobjektov,jihidentificiramoinpokliemotovarno,daustvariobjekttegatipa.Posledice:Primer#1:enum GameObjectType { PLAYER, ENEMY,

  • [email protected],draftv09,PeterPeer++ 60

    POWERUP, WEAPON, // ... rest of the objects... } GameObject * ObjectFactory::Create(GameObjectType type) { switch (type) {

    case PLAYER: return new Player(); case ENEMY: return new Enemy(); case POWERUP: return new PowerupO; case WEAPON: return new Weapon();

    } return NULL; } Pomanjkljivosttaknetovarneje,damoravedetivnaprej,kakneobjektesplohlahkoustvari.Tolahkoodpravimotako,dasevsakrazred,kiseeliustvaritispomojotovarne,registrira.Registracijavsebujeunikatnoidentifikacijskotevilkoinspecificirannainzaustvarjanjetaknegaobjekta.Primer#2(imaomenjenopomanjkljivost?):public class ImageReaderFactory { public static ImageReader getImageReader(InputStream is) { int imageType = determineImageType(is); switch(imageType) { case ImageReaderFactory.GIF: return new GifReader(is); case ImageReaderFactory.JPEG: return new JpegReader(is); // etc. } } } Tavzorecjezelouporabentudizaproduciranjenovevsebinezaigre,kisoenaprodajnihpolicah.Opazovalec(Observer):Problem:Objekti(razlinihtipov)elijovedeti,kosenekajzgodi,alikosespremenistanjedrugihobjektov(priemersoobjektiimmanjsoodvisni(coupling)).Reitev:Imamoopazovancainveopazovalcev.Opazovalciseregistrirajopriopazovancu,kijihdodavseznam.Obprimernemdogodkuopazovaneckliemetodonotify()(aliupdate())privsehopazovalcih(messagepassing,eventdriveninteraction...???).

  • [email protected],draftv09,PeterPeer++ 61

    Uporabavigrah:Interakcijamedobjekti.Vratarecimoelijobitiobveena,dajeigralecpritisnilprimerengumbinseposledinolahkoodprejo.Obratnobilahkogumbeksplicitnoklicalfunkcijozaodpiranjevrat,vendarjepotemvednopotrebnorazmiljati,kajvsejepotrebnopoklicati,kosepritisnegumb.Vdrugismerisekotopazovalcigumbaprijavijosamotistiobjekti,kisejihspremembastanjagumbatie.edvaprimera:Kadarjedoloenobjektunien,morajovsinasprotniki,kisoimelitaobjektnaciljan,spremeniticilj,sajobjektneobstajave.erecimonagrafinikarticispremenimololjivost,potemjesmiselnootemobvestitivseobjekte,kiimajonekgrafinipomnilnikivmesnik(buffer),daseustreznoposodobijo.Posledice:Tavzorecjedobrareitevzaveinointerakcijmedobjektiobpraktinonielnistopnjiodvisnostimedobjekti,vendarjepotrebnaprevidnostpriuinkovitostiinporabispomina.esedogodkipojavljajovekratnasliico(frame)alipajeseznamopazovalcevdolg,lahkohitropridemososlabeuinkovitosti.Dostopdonepovezanihobjektovpajedodatnoenenaklonjendozapisavpredpomnilniku(cache).Problempridolgihseznamihlahkoreimotako,dasevsakopazovalecregistrirasamozadoloendogodekopazovanca(edenrecimozavsakgib,drugipalezaunienje).eimamonatisoeopazovancevinpravtakoopazovalcev,potemlahkozahtevapospominueskaliraprekorazumnihmeja,sajzavsakovozlievkazalnemseznamupotrebujemodvakazalca(nanaslednjevozlieinnaopazovalca...???).XNIprimer:Event*orientationChanged;(PriObserverjujetrebaedefiniratilinkedlistnadopazovancem(Subject),kipotemobdogodkuklieopazovalca(Observer)oz.njegovoupdate/notifymetodo.Toeimaimplementirano?Dogodekjeleodskonadeskazatadesignpattern.???)Vsamiigrisicerzaenkratenimamotega(implementationunderway;).PodobenprimerimamoobdogodkupositionChanged,kisesproivsaki,kosespremenivektorlokacijenaobjektu.TorecimoposluaABTdrevoinpopotrebipremakneobjektizenecelicevdrugo.

    Kompozitum(Composite):Problem:Skupinoobjektovelimoobravnavatikotenobjekt.Reitev:Lahkonaredimonovobjekt,kijezbirkaobjektov(zdruiobjekte).Novobjektvsebujevsemetode,kijihvsebujenavadenobjekt(niobravnavankotposebenprimer).

    (Leafjelespecifinakomponenta.)

  • [email protected],draftv09,PeterPeer++ 62

    Uporabavigrah:Pogosto,naprimervmenijuimamogumbeznapisi,vsakegalahkopremikamopoekranu,lahkopajihpremikamokotskupino.Pritemomenimo,daimamorecimovmenijutuditekstovnepaneleinslike,kiskupajzgumbigradijouporabnikivmesnik(naComponentnazgornjisliki),vendarvtemprimerunetvorijokompozitumazgumbi.Kompozitumsevvelikimeriuporabljatudinadentitetamiigretervozliigrafascene.Posledice:Zavsemetodevdedovanemrazredu(slednjemorajobitivirtualne)moraronospisatikodoinnareditinovoimplementacijo,kiboiteriralaezvsezdrueneobjekte,nadkaterimibouveljavljalaizbranooperacijo.Primer:/** "Component" */ interface Graphic { //Prints the graphic. public void print(); } /** "Composite" */ class CompositeGraphic implements Graphic { //Collection of child graphics. private List mChildGraphics = new ArrayList(); //Prints the graphic. public void print() { for (Graphic graphic : mChildGraphics) { graphic.print(); } } //Adds the graphic to the composition. public void add(Graphic graphic) { mChildGraphics.add(graphic); } //Removes the graphic from the composition. public void remove(Graphic graphic) { mChildGraphics.remove(graphic); } } /** "Leaf" */ class Ellipse implements Graphic { //Prints the graphic. public void print() { System.out.println("Ellipse"); } } /** Client */ public class Program { public static void main(String[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse(); //Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); CompositeGraphic graphic2 = new CompositeGraphic(); //Composes the graphics graphic1.add(ellipse1); graphic1.add(ellipse2); graphic1.add(ellipse3);

  • [email protected],draftv09,PeterPeer++ 63

    graphic2.add(ellipse4); graphic.add(graphic1); graphic.add(graphic2); //Prints the complete graphic (four times the string "Ellipse"). graphic.print(); } } Dodatnipopularnivzorci:Uporabaspodajnatetihvzorcevnaelomanisplonoaplikativnanavsehpodrojih.Nekaterivzorcisotakoboljprimernizavijenivojekodeigrekotzapogone,nekaterisouporabnipriizraunihfizike,anepriUI.Dekorater(decorator):Omogoadodajanjenovefunkcionalnostiobstojeimobjektommedizvajanjemprograma(brez,dabispremenilidrugeobjekte).Primer:

    Zanemoznavadnimoknom,kimuelimododatidrsnike.RazredWindownimatemonostizatolahkodedujemonovrazred(ScrollingWindow),kimudodamotofunkcionalnost.Drugamonostje,danaredimoScrollingWindowDecorator,kidodatofunkcionalnostobstojeimobjektomtipaWindow.Obereitvistavtemtrenutkuenakovredni.ebioknuelelidodatieobrobo,bimoralinareditidvanovapodrazreda,enega,kidedujeodWindowinenega,kidedujeodScrollingWindow.Zavsakofunkcionalnostsetaproblemeposlaba.epauporabimodekorator,samoustvarimoBorderedWindowDecoratorindekoriramoobstojeaoknazBorderedWindowDecoratoraliScrollingWindowDecorator,obemaskupajalinobenim.Fasada(facade):Zdruikompleksnomnoicovmesnikovzvelikoobjektiinfunkcijamivenenotnivmesnik.slika...???Primer[wikipedia10:Facade_pattern]:zagonraunalnika(nipotrebnovedeti,kakoseposameznakomponentazaene)./* Complex parts */ class CPU {

  • [email protected],draftv09,PeterPeer++ 64

    public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Facade */ class Computer { private CPU cpu; private Memory memory; private HardDrive hardDrive; public Computer() { this.cpu = new CPU(); this.memory = new Memory(); this.hardDrive = new HardDrive(); } public void startComputer() { cpu.freeze(); memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS); cpu.execute(); } } /* Client */ class You { public static void main(String[] args) { Computer facade = new Computer(); facade.startComputer(); } } Obiskovalec(visitor):Loialgoritem(operacijo)odmnoicepodatkov,kijihobdeluje.Takoomogoanoveoperacijenadmnoicoobjektov,brez,daspremenimoobstojeokodo(samonapiemonovegaobiskovalca).Vobiskovanihobjektihjepotrebenpovratenklicnaobiskovalca.Primer:

  • [email protected],draftv09,PeterPeer++ 65

    class CarElementPrintVisitor implements CarElementVisitor { public void visit(Wheel wheel) { System.out.println("Visiting "+ wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Visiting engine"); } public void visit(Body body) { System.out.println("Visiting body"); } public void visit(Car car) { System.out.println("Visiting car"); } } class CarElementDoVisitor implements CarElementVisitor { public void visit(Wheel wheel) { System.out.println("Kicking my "+ wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Starting my engine"); } public void visit(Body body) { System.out.println("Moving my body"); } public void visit(Car car) { System.out.println("Starting my car"); } } public class VisitorDemo { static public void main(String[] args){ Car car = new Car(); car.accept(new CarElementPrintVisitor()); car.accept(new CarElementDoVisitor()); } }

  • T[email protected],draftv09,PeterPeer++ 66

    Adapter:Omogoa,darazredi,kidrugaenemorejokomuniciratimedsabo,lahkokomunicirajo.Primer:

    "Client"klie"methodA()"na"Adaptee",vendar"Adaptee"temetodenima,zatonaredimovmesnirazred"Adaptor",kiimametodo"methodA()",kijolahkoklie"Client"inznotrajtemetodepoklie"methodB()",kijoima"Adaptee".Lahkiobjekti(Flyweight):Omogoajodeljenjepomnilnikaprivejemtevilumanjihobjektov.Primer:Grafinapredstavitevrkevsakarkalahkovsebujepodatkeonjenihmerah,pisavi,barviitd.Vendarimajovsestavkubesedilaposameznerkepogostovsenateteparametreenake,zatojihlahkohranimosamoenkratnarko,zaposameznorkoizbesedilapahranimosamoenaprimerpozicijo.Ukaz(command):Vzorecenkapsulira(uinkovitopovzameinzapie)zahtevoalisproilo,kigalahkonatoshranimo,posredujemomedobjektiipd.Primer:...???Vzorciustvarjanja(creation...???):tovarnaobjektov,edinec.Vzorcistrukture(structure...???):kompozitum,adapter,dekorater,fasada,lahkiobjekti.Vzorciobnaanja(delovanja)(behaviour...???):ukaz,opazovalec,obiskovalec.3.Pravilaigre

    splonapravilaigreo zaetnostanje

  • [email protected],draftv09,PeterPeer++ 67

    o konnipogoji pravilaintegriranavobjekteigre

    o razdelitevpravil,kiseneodvisnotiejodoloenihobjektovigre

    Zaetnostanjeigre(initialstate)sevzpostaviobzagonuinstanceigre(npr.0tok,vsaivljenjaipd.).Iztegastanjase(obinterakcijiuporabnika)spomojopravilspreminjastanjeigre.Konnipogoji(endconditions)doloajostanjeigre,kipomenisprememboigralneganaina,doseencilj(alinezmonostdoseicilj),konecinstanceigrealiseanse[Bjrk05].Tipienprimerdoseenegakonnegapogojaje,koigralecizgubivsaivljenja.Pobratidoloenotevilozastavjekonnipogojigralneganaina,kjerigralcizbirajozastavenasprotnikov.Pravilaintegriramovobjektespomojoagregacije(glejarhitekturoobjektovigrezgoraj).Splonapravilaigre(gamerules)inpravilaobjektovigre(itemrules):Pravilaobjektovsenanaajonaposamezenobjektigre.Prinjihovemobravnavanjusesprehodimoezvseobjekteinzavsakegaposebejobravnavamopravila.Kodazaizvajanjepravilajelahkointegriranavobjektkotmetodakomponente.Simulatorvenemobhoduzankeizvedeiteracijoezvseobjekteigre.Navsakemobjektuseobdelajopravilaobjektov.Splonapravilaigresepreverjajoenkratnasimulacijskikorak(oziromaenkratzavsakostanjeigre).

    PrimerobravnavanjapravilzaigroPong[Jan09?]:publicclassPongRules:Part{ intitemUpdateOrder; intglobalUpdateOrder; publicPongRules(intitemUpdateOrder,intglobalUpdateOrder){

  • [email protected],draftv09,PeterPeer++ 68

    this.itemUpdateOrder=itemUpdateOrder; this.globalUpdateOrder=globalUpdateOrder; } publicoverridevoidInstall(Itemparent){ base.Install(parent); parent.As().RegisterUpdateItemMethod(itemUpdateOrder,ItemRules); parent.As().RegisterUpdateMethod(globalUpdateOrder,GlobalRules); } //ITEMRULES voidItemRules(floatdt,Itemitem){ //Ball Ballb=item.As(); if(b!=null){ Particlep=b.As(); if(Math.Abs(p.Position.X)>450){ intwinner=(int)(Math.Sign(p.Position.X)*0.5f+0.5f); Pong.Score[winner]++; b.Reset(); } } } //GLOBALRULES voidGlobalRules(floatdt){ if(Pong.Score[0]>9||Pong.Score[1]>9){ Pong.Score[0]=0; Pong.Score[1]=0; } }}...???razlaga4.ShranjevanjeShranjevanjeoziromaposnetektrenutnegastanjaigre.Glavnirazlogizauporaboshranjevanjaso:

    omogoajoprekinitevigranjainkasnejenadaljevanje(tudiigriarjiimajoivljenjeizvenigre) zavarujejotrenutnostanjeigre(innapredovanjeigralca)predmorebitnimkasnejim

    sesutjemigre omogoajopreigravanjerazlinihpotekovigrenatokah,kjerseigralcuponudive

    alternativnihpoti/monosti.Izigralskegavidikaloimonaslednjenaineshranjevanja:

    omejenoshranjevanje:konnoteviloshranjevanjalipaposebnelokacijeshranjevanja(npr.FinalFantasy)

    kontrolnetoke(checkpoints):avtomatskoshranjevanjenakljunihtokahvokolju neomejeno:kjerkoli,kadarkoli,kolikokratkoli(npr.Civilization) samodejnoshranjevanje(autosave):periodinoalipokljunihdogodkih(primerjaj:

    kontrolnetoke) vezanonaprofil:samodejnoshranjevanjevezanonaprofiligralca(npr.Diablo).

    Neomejenoshranjevanjelahkospremeniteavnostigre.Prisamodejnemshranjevanjuinkontrolnihtokahjepomembno,daneshranimoigralcavslabemstanjuoziromabrezizhodnisituaciji.

  • [email protected],draftv09,PeterPeer++ 69

    Predvsemprineomejenemshranjevanju(pristratekihigrah)lahkoigraleczlorabisistemshranjevanjatako,dashranjujeinnalagaigrodoklerrezultat,kijeodvisenodnakljuja,nivigralevokorist.Problemselahkoreizdeterministinemobnaanjuponalaganjuigrenpr.vsaki,konaloimoigroborezultatbojaenak(razen,enespremenimostrategije).Kakospravitistanjeigrevobliko,kijolahkoshranimonadisk?Potrebnojeshranititrenutnostanjeobjektovvzaporednoobliko(zaporedjebajtov),kijolahkozapiemonadiskserializacija.Najboljeje,davsakobjektsamposkrbizasvojoserializacijo.Takosevtrenutku,koelimoigroshraniti,samosprehodimoprekoobjektov,kijihelimoshranitiinpokliemonjihovemetodezaserializiranje(podamojimtudipodatkovnitok,kamorbodoshranilisvojestanje).Vrsteserializacije:

    tekstovna binarnaserializacija xmlserializacija.

    ...???serializacija/deserializacijashranjevanje/nalaganjePrimerserializacijekamere:boolGameCamera::Write(IStream&stream)const{ //oetovskirazredposkrbizaserializacijopozicije,rotacije, boolbSuccess=GameEntity::Write(stream); //serializacijaosnovnihpodatkovnihtipov bSuccess&=WriteFloat(stream,m_FOV); bSuccess&=WriteFloat(stream,m_NearPlane); bSuccess&=WriteFloat(stream,m_FarPlane); //serializacijaobjekta bSuccess&=m_lens.Write(stream);}Osnovnepodatkovnetipeshranimoneposrednovpodatkovnihtok,naobjektihpasamokliemonjihovemetodezaserializacijo.Nataknainzapiemosamopodatkebrezmetapodatkov,karjehitro,vendarpavsakamanjaspremembavstrukturirazredalahkopovzroi,daseshranjeneigrenemorejovenaloiti.Zatolahkoimplementiramoepoasnejometodo,kishranipodatkevtekstovnioblikiinopremizmetapodatki.Problemkazalcev:Zaradidinaminegadodeljevanjapomnilnikakazalciobnaslednjemnalaganjuigrenebodokazalinapravepomnilnikelokacije.Teavolahkoreimo,dasenadrugeobjektesklicujemoprekonjihovihenolinihidentifikatorjev(UID...???).Lahkotudineposrednoshranimokazalce,vendarmorapotemtudivsakobjektshranitisvojnaslov.Prinalaganjuseobjektiponovnokreirajonanovihnaslovinustvarisetranslacijskatabela,kivsebujestarinnovnaslov.Kosovsiobjektinaloeni,sevsikazalcinaenkratpopravijo.Dodatniviri:[Chandy09]MarcinChady.TheoryandPracticeofGameObjectComponentArchitecture.GameDevelopersConferenceCanada.2009.

  • [email protected],draftv09,PeterPeer++ 70

    [Gonzlez10]GonzlezSnchez,J.L.Jugabilidad.CaracterizacindelaExperienciadelJugadorenVideojuegos.PhDThesis(2010)[Wikipedia10]...???[de.wikipedia10]...???[wikipedia10]...???#2[wikipedia10:Facade_pattern]...???[Bjrk05]StaffanBjrk,JussiHolopainen.Patternsingamedesign,CengageLearning,2005.[Jan09?]MatejJan.TeajXNA,2009.Naloganavajah:

    Delonaelementihigralnosti:Specializacijaobjektovigre,daseobnaajopopravilihigre,terpreverjanjepravilnanivojustopnjeinsejeigre(gameplaysession).Gledenaspisanapravilavkonceptuigralnostijepotrebnonaredit,dasevsedogajakotjepredvideno(razenUIelementovseveda):vpeljavakonnihpogojevigre,dodajanjeatributovigre(npr.rezultat,ivljenja).(Lestvicanajboljihinshranjevanjeboele,kopridemodomenijevpoUI.Enakoveljazanalaganjestopnjeizdatotek.)