2.1.2013

Oma koodailuprojekti, osa IV

Toiminnallisuutta mukaan

Sain ruudulla näkymään sitä ja tätä, mutta millään ei ollut mitään vaikutusta mihinkään. Tämä ei käynyt laatuun, joten seuraavat GameObjectiin lisättävät luokkamuuttujat olivat mm. hitpoints eli osumapisteet. Tungin minä sinne kaikkea muutakin hienoa, kivaa ja tulevaisuudessa oleellistakin, mutta ei niistä ole hirveästi iloa tässä vaiheessa. Kun kerran ollaan jonkunsorttisen Asteroids-viritelmän kanssa tekemisissä (en meinannut jäädä siihen, vaan lisätä jotain todella sekavaa mutta ainakin omasta mielestäni mielenkiintoista), törmäily on kai aika olennaista. Tätä raapustaessani olen tehnyt pohjaa pidemmälle kuin mistä nyt on kertoa.

Törmäilymietteitä

  • Murkulat voivat törmäillä pelaajan purtiloon ja päinvastoin
  • Murkulat voivat törmäillä toisiinsa
  • Nopeuseroilla pitäisi olla merkitystä törmäystilanteessa
  • Massaeroilla pitäisi olla merkitystä törmäystilanteessa
  • Törmäyskulmakaan ei ole yhdentekevä

Kaksivaiheinen törmäystestaus

Kun kullakin hetkellä listoilla voi olla aika hyvä määrä olioita, ei ole mitään tolkkua käydä kaikkien törmäyksiä läpi supertarkasti, vaan voidaan ensin käydä kaikki läpi ja katsoa edes summittaisesti, josko kolisee ja sitten, tarpeen vaatiessa, tarkemmin. Ykkösvaiheen toteutuksessa käyn kaikki 'roidit ja pelaajan aluksen läpi ja vertaan toisiinsa, josko niiden summittaiset pinta-alat risteävät. Tähän puuhaan pygamen rectangle.colliderect() riittää mukavasti:

def collides_with(self, other):
        collides = False
        if self and other:
            if self.get_rect().colliderect(other.get_rect()):
                collides = self.accurate_collision(other)
        return collides
 
def accurate_collision(self, other):
        return True


Jälkimmäinen metodi on luonnollisesti stubi, jonka toteutus tulee kohdille kun ehtii. Tämänhetkinen vain toteaa, että "näyttää siltä, että törmäävät ja se kelpaa minulle" ja sen jälkeen molemmille törmääville elementeille heitetään 2d6-vauriot, kunnes toinen tai molemmat tuhoutuvat. Koska murkuloita on neljää kokoluokkaa, isommat hajoavat n kappaleeksi pienempiä, jos sille päälle sattuvat.
Kyllästyin aika pian siihen, että alukseni hajosi aika ripeästi testailun tiimellyksessä, joten lisäsin mukaan automaattisen Megatron-huijauksen. Peli sanoo Afterdeath ja kaikki jatkuu pelaajan kannalta kuin mitään ei olisi tapahtunut.

Yhtenä aamuna juttelin tästä projektinkuvatuksesta yhden työkaverini kanssa (oli huomannut jotain mutinoitani g+:ssa). Muiden seassa esiin nousi kommentti antialiasoinnin puutteesta, olinko miettinyt käyttäväni sitä vai aioinko tehdä tarkoituksella sahalaitaista. Vastasin, että meinasin korjata tilanteen nätimmäksi kun saan oleellisemmat pulmat ratkottua. Siinä samalla katseltiin pikaisesti dokumentaatiota ja hops, jos vaihtaa drawpolygon-metodikutsun aalines-kutsuksi ja muistaa lisätä yhden True-parametrin, muuta ei tarvita. Kokeilin kurillani samana iltana ja näyttäähän se nätimmältä näin, vai mitä?
Antialiasoituna

Törmäyksen jälkeen

Koska olisi aika naurettavaa, että avaruuskivet poikkeuksetta jatkaisivat törmäämisensä jälkeen toistensa sisään syöksymistä, mietin, että seuraavaksi pitäisi toteuttaa deflect-metodi, joka laskisi jotenkin molemmille törmäyksen osapuolille uudet nopeusvektorit. Jos saisin aikaan jotain edes etäisesti biljardipöydän toimia jäljittelevän toteutuksen, olisin onnellinen. Kun tuon yhdistää kriittisiin osumiin (pieni ja nopea kivi voisi sopivasti osuessaan halkaista suunnattoman kiven kahtia), lopputulos voisi olla vänkä. Niin ja ne planeetat ja ties mitkä... ei tässä ole vielä mitään tehtynä!

"Sota. Sota ei koskaan muutu."

Kaikille tätä lässytystä jonkun aikaa seuranneelle lienee kai ihan päivänselvää, että kaiken muun omituisen lisäksi Star Wars ja Battletech ovat minulle isoja juttuja. Vallankin jälkimmäisestä olen miettinyt lähteväni rosmoamaan aseistukseen liittyvää kamaa. Pääideana on, että purkkiinsa saisi valikoida jonkun tai jokusen väkivallan välineen riippuen vähän aluksen sloteista. Ohjuksia/raketteja, kuolemansäteitä (pulssittaisina tai ei), automaattikanuunoita ja taivaansinisiä salamoita yskiviä partikkelikanuunoita. Muahaha! Ja jos kerran aseistusta voi muuttaa, miksei moottoriakin voisi vaihtaa?

Kunhan mietin, myöhemminhän se selviää, mitä hemmettiä oikein haluan.

2 kommenttia:

  1. Warssi mainittu. Moottori mainittu. Idea.

    Moottori kehittää X-Wing -tyyliin tietyn määrän energiaa. Tämän voi vapaasti jakaa aseille, suojille, ja moottorille. Jokaiselle on lisäksi omat kondensaattorinsa, joihin voi kerätä energiaa (Eliten energiapankit, tai pikemminkin taas X-Wing). Voisi itse valita, haluaako aluksen jossa on hernepyssy mutta joka lentää miljoonaa, vaiko etanan vauhtia etenevän jollan Kuolontähden superlaserilla. Vaiko niin, että kondensaattoreissa on virtaa muutamaan superlaserlaukaukseen mutta niitä ladataankin sitten kau-an jos haluaa liikkuakin. Suojien kanssa sama. Vai olisiko sittenkin järkevämpää päivittää moottori? Mahtuuko runkoon, pitäisikö olla isompi alus? Tietysti ballistiset aseet eivät veisi energiaa juuri lainkaan, mutta ammuksia pitäisi lastata ja ne taas voivat räjähtää. No raidetykit ja coilgun-periaatteella toimivat gausstykit eivät tarvitse räjähtäviä ammuksia mutta ovat yhtä energiasyöppöjä kuin energia-aseet. Jne.

    VastaaPoista
  2. Uskotkos, että TIE Fighterista itselleni tuttu ELS on käynyt mielessä? Työkaveri huuteli jossain välissä, että Wing Commandereissa suojilla pysäytettiin vain kuolemansäteitä mutta ei taistelukärkiä (raketit, ohjukset, torpedot, kivet, Arvel Crynyd ja mitä näitä on).

    VastaaPoista