Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Enginen epäkohtia... ?

sqwiik [10.09.2004 22:36:59]

#

Palailin viime viikolla kesälomalta ja kun painauduin jälleen ERKKI-engineni pariin, huomasin siinä (jo nyt) pari epäesteettistä seikkaa. Asetin kaikki olioluokat (sankarit, NPC:tja muut oliot) pohjautumaan yhteen luokkaan, ja tein olioviittausluokasta yleiskattavan. Tämä toi kuitenkin esiin pari seikkaa, joista haluaisin kysäistä teiltä muilta.

1. Kesto/mana/ym-muuttujien täydellinen siirto viittauksiin aiheuttaa pientä vaivaa, sillä kentällä olevat oliot eivät näin pysty säilyttämään statsejaan. Nimittäin jos kentällä on olio/tms, jonka pitää säilyttää ominaisuutensa toiseen kenttään (kuten miltei kaikissa roolipeleissä) täytyy käyttää apumuuttujia. Mielestäni tämä on turhauttavaa. Entä teistä muista?

2. Neliskanttinen näköalgoritmi alkaa sattua päähän (sattuneesta syystä), mutta en itse keksi nopeaa tapaa laskea sellaisen ympyrän pisteitä, jossa yksikään piste ei ole kulmittain toiseen nähden vaan jokaisella pikselillä on naapuri ylä/ala/sivusuunnassa. Naapuripisteet ovat elintärkeä kohta algoritmissa. Voisiko joku heittää auttavalla idealla?

3. Koska oletan että kenelläkään ei ole täyttä mielenkiintoa kahlata kaikkea koodiani läpi, kysynkin mihin asioihin kannattaisi panostaa sitten kun sen oppaan taiteilen kauniisti valmiiksi asti?

Metabolix [10.09.2004 22:46:26]

#

1. Tuohan riippuu täysin toteutuksesta. Voisihan jonkinlaisen class Olio -objektin ottaa ihan kokonaan mukaan, laittaa ne vaikka taulukkoon, ja uuden tason alussa selaisi taulukon läpi asettaen otukset siihen, mistä niiden pitäisi ilmestyä reunan yli.

2. Miten olisi pythagoraan lause? a*a + b*b == c*c? Lasket valmiiksi muuttujaan cc tuon c*c:n (c = säde) jotta sitä ei tarvitse aina laskea uudestaan, ja laskeskelet vaikkapa for-lauseella pisteitä. Voi olla jopa hyvä idea asettaa pisteet taulukkoon, jos maksimietäisyys ei ole kovin suuri.
Edit: Jos ymmärsin nyt oikein, haluat mustata alueen reunat, niin että keskelle jää tietty ympyrä. Tämä voisi olla hyvä:
Mustataan kaikki pisteet, jotka jäävät ympyrää ympäröivän neliön ulkopuolelle (X < Erkki.X - Sade || X > Erkki.X + Sade) ja sama Y-akselilla. Sitten mustataan taulukkoon tallennetulta matkalta kaikki pisteet sekä ympyrän ylä- että alareunasta, vasemmalta ja oikealta.

for (X = -Sade; X <= 0; X++)
  for (Y = Sade; Y < Taulukko[X]; Y--)
  {
    MustaaPiste(X, Y);
    MustaaPiste(X, -Y);
    MustaaPiste(-X, Y);
    MustaaPiste(-X, -Y);
  }

Kuvasarja

3. Minusta olisi syytä aluksi selostaa melko pitkällisesti koko Enginen perusperiaatteet. Tiedän, että usein tuntuu siltä, että kyllähän tuon tajuaa kun hetken katsoo koodia, mutta kun selailin omia vanhoja koodejani, niin en saanut oikein kokonaiskuvaa ajatuksestani, vaikka tajusinkin toiminnan palasina.

sqwiik [11.09.2004 13:38:59]

#

Metabolix, taisin selittää hieman epäselvästi sen statsijutun. Kaikki oliot on 'sidottu' kenttäolioon, ja tämän vuoksi sama olio ei voi esiintyä yhtäaikaa kahdessa kentässä siten että statsit muuttuisivat kummassakin. Periaatteessa tarkoitan sitä, että kun kentältä poistutaan niin pitäisi aina kopioida sankarin sisältävä viiteolio toiseen samanlaiseen, ja sitten kopioida tämä välimuuttuja uuteen viiteolioon statsien säilyttämiseksi. Omasta mielestäni tämä on rasittavaa.

Tuohon näkökenttään, tarkoitan sitä että piirrän kehän, en ympyrää. Tarvitsen vain pisteet ympyrän kehältä, ja niiden pitää olla vierekkäin. Seuraavasti:

 Ei näin          Vaan näin
   ###               ###
  #   #             ## ##
 #     #           ##   ##
#       #         ##     ##
#       #         #       #
#       #         ##     ##
 #     #           ##   ##
  #   #             ## ##
   ###               ###

Eli ei neliö/vinokas/kahdeksankulmio, vaan ihan ympyräkehä jossa jokaisella pikselillä on naapuri.

tn [11.09.2004 18:30:08]

#

// ympyrän keskus = (x,y)
// ympyrän säde = r
int d = 3 - 2 * r;
int xx = 0;
int yy = r;
while( xx <= yy )
{
    SaveDot(x+xx, y+yy);
    SaveDot(x+xx, y-yy);
    SaveDot(x-xx, y+yy);
    SaveDot(x-xx, y-yy);
    SaveDot(x+yy, y+xx);
    SaveDot(x+yy, y-xx);
    SaveDot(x-yy, y+xx);
    SaveDot(x-yy, y-xx);
    if( d < 0 )
        d += (4 * xx) + 6;
    else
    {
        d += (4 * (xx-yy)) + 10;
        --yy;
        SaveDot(x+xx, y+yy);
        SaveDot(x+xx, y-yy);
        SaveDot(x-xx, y+yy);
        SaveDot(x-xx, y-yy);
        SaveDot(x+yy, y+xx);
        SaveDot(x+yy, y-xx);
        SaveDot(x-yy, y+xx);
        SaveDot(x-yy, y-xx);
    }
    ++xx;
}

Saattaa joissakin tapauksissa antaa osan pisteistä kahteen kertaan tai sitten ei (en ole varma). Turha kysyä miten tuo toimii, en itsekään tiedä. Pisteet eivät sitten ole järjestyksessä.

sqwiik [12.09.2004 10:18:55]

#

Äskeiseen koodiin viitaten, mitä tuo d tekee koodissa kun sitä ei missään käytetä? Ja tuo koodi tekee vinokkaan, kun ajelen sitä päässäni. Tuon d-muuttuja ilmeisesti pitäisi tehdä siitä jokseenkin 8-kulmainen, mutta kun muuttujaa ei missään käytetä.

tn [12.09.2004 11:35:28]

#

sqwiik kirjoitti:

Äskeiseen koodiin viitaten, mitä tuo d tekee koodissa kun sitä ei missään käytetä? Ja tuo koodi tekee vinokkaan, kun ajelen sitä päässäni. Tuon d-muuttuja ilmeisesti pitäisi tehdä siitä jokseenkin 8-kulmainen, mutta kun muuttujaa ei missään käytetä.

Kyllähän sitä käytetään, pitää vain katsoa vähän tarkemmin. :) (Siis yy-muuttujaahan pienennetään tuossa else-hässäkässä.)
Kyllä tuo (siis alkuperäinen versio, tuo on muokattu sinun taroitukseesi sopivaksi) minulla ainakin piirtää siistejä ympyröitä. Kannattaa ainakin kokeilla sitä. (saattaahan siihen tietysti olla lipsahtanut joku virhekin, en nyt vain huomaa mitään)
d-muuttujan on tarkoitus kontrolloida yy-muuttujan vähennystä. Itse algororitmi lienee johdettu jotenkin derivoimalla ympyrän kaavasta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta