Seeneline isomeetrilises projektsioonis
Jätkame eelmistes loengutes/harjutustes seeneline, animeeritud (üks vaade/suund), animeeritud (4 suunda) alatud mängu arendamist.
Kokkupõrked, mask
Kuna tüdruku spriit on isomeetrilises projektsioonis, poolviltu ülalt-alla vaates (tüdruku kõigis kaadrites on tema jalgade ümber vari), peaks kogu mängu käsitlema isomeetrilises vaates - see on kõige lihtsam ja levinum ruumilise (3D) vaate viis.
Isomeetria kasutamine teeb kokkupõrgete arvutamise palju loomuölikumaks - kKokkupõrkeid arvutatakse isomeetrilises mängus objektide projektsiooni järgi maapinnal, mitte kogu spriidi piirdenelinurga järgi.
Senine kokkupõrgete arvutamise meetod tekitab kokkupõrke ka siis, kui 'päriselt' peaks väga hästi liikuda saama - näiteks tüdruk ei pääse vasakul oleval pildil korjama ees olevat seent, sest kokkupõrkeid arvutatakse kogu spriidi piirdenelinurga järgi ja tüdruku ja kännu spriidid põrkuvad enne kui tüdruk pääseb seeneni (vt skeemi paremal - piirdenelinurgad on hallid).
Kui kokkupõrke arvutamisel kasutada objektide projektsiooni maapinnal (objekti vari, kui Päike oleks seniidis), pääseks tüdruk liikuma - ka siis, kui arvutuste lihtsustamiseks asendada kumerad varjud nelinurksetega (vt pilt paremal).
Kokkupõrgete arvutamisel kasutatavaid varje nimetatakse maskideks. Lisame kõigile mängu objektidele omaduse mask, mis määrab objekti koordinaatide ja mõõtude põhjal maski nelinurga omadused, näiteks tüdruku klassi kirjelduses see võiks olla
this.mask={x:this.x+this.width/3,y:this.y+3*this.height/4,w:this.width/3,h:this.height/4};
Analoogiliselt tuleb maskid määrata ka takistuste klassile (siin võib y olla püstsuunas keskel) ja seente klassile (y - kolmandik spriidi alläärest kõrgemal); maski x ja laius võivad jääda nagu spriidil.
Maskide kasutamiseks kokkupõrgete arvutamisel tuleb funktsioonis collision kõikjal kasutada objektide maski vastavaid omadusi.
Libisemine takistusel
Kui inimene kõndides kohtab takistust, ei jää ta tavaliselt seisma, vaid ainult muudab liikumise suunda, et takistusest mööda pääseda, s.t. ta ei põrku takistuselt, vaid hakkab liikuma selle serva mööda (libiseb taksituse pinnal).
Ja ongi kõik - mitte midagi keerulist!
Ülesandeid
1. Ülalkirjeldatud mäng on veel kiiresti ja kohati räpakalt programmeeritud ('quick and dirty'). Kui kangelane näiteks korjab kärbseseene, ei jää ta lebama, vaid hakkab (kord näoli, kord taevasse vaadates) maas siplema - mürgitatud tegelane peaks lamama vaikselt (ja tavaliselt selili).
2. Kui tegelane kukub pikali (mürgitatud) ja temast vasemal on kivi või känd, jääb ta nende alla - väga ebaloomulik, ta peaks lamama tühjal kohal.
3. Kui kangelane liigub paremale ja peatub, jääb tal üks jalg õhku (teistes suundades liikumisel on peatumispoos loomulik) - kuidas seda parandada ?