SetAPen, RectFill ja ReadPixel

Saku-foorumi » Classic Amiga » Ohjelmointi » Viestit 2003 » SetAPen, RectFill ja ReadPixel « Edellinen Seuraava »

Kirjoittaja Viesti
 

Jon
Perjantaina, 22. elokuuta, 2003 - klo 16.50:   
Ihan tyhmä ongelma, mutta...jos asetan kynän esim 2:ksi, täytän alueen ikkunasta ja luen ReadPixelillä, niin miksi tulos ei ole 2, vaan esim. 65505?

 

JPQ
Perjantaina, 22. elokuuta, 2003 - klo 18.14:   
Ei ole tyhmä ongelma mutta gurut kertokaahan vai liittyikö tämä 15/16/24bit tiloihin jos sellaisella ruudulla on ikkunasi? jos niin miten.

 

Jon
Perjantaina, 22. elokuuta, 2003 - klo 19.30:   
Mutta eikös kyniä pitäisi olla max 256 vai muistanko väärin. Sori, ei ole autodocceja eikä includeja käsillä.

 

Piru
Perjantaina, 22. elokuuta, 2003 - klo 19.58:   
Jon: Jos kyseessä on truecolor ruutu niin kirjoitusvaiheessa kirjoitetaan RGB pikseli mäpäten se paletista.. Eli *ptr = rgbpalette[pennumber]; noin karkeasti.

On mahdotonta mäpätä tätä toisinpäin, eli siis ReadPixel ei toimi truecolor ruuduilla.

Jos haluat pikselin RGB-arvon käytä cybergraphics.libraryn funktiota ReadRGBPixel. Tämä siis toimii vain truecolor ruuduilla.

 

Jon
Perjantaina, 22. elokuuta, 2003 - klo 22.15:   
Ahaa. En ole varma onko tommosia asioita Autodoceissa edes mainittu, mutta onpa hyvä tietää. Eli käytännössä pitäisi haistella ruudun syvyyttä ja käyttää sopiivaa funktiota värin lukuun.

Yritin kokeilla tehdä omaa flood filliä Stix-tyylistä peliä varten, mutta varmaan käytän systeemin RectFilliä alueiden täyttöön loppupeleissä :)

 

Jon
Perjantaina, 22. elokuuta, 2003 - klo 22.28:   
Lisättäköön vielä se, että rekursiivista (x-ja y- koordinaattien suhteen) flood-funktiota, joka käyttää ReadPixel/WritePixel-yhdistelmää ei kannata tehdä. Todella hidas.

Oli tarkoitus kokeilla "puolirekursiivista" floodia, jossa y-akseli olisi rekursiivinen, ja piirto tehtäisiin viivalla, ei pisteellä.

Muuten kai voisi käyttää systeemin Flood()-kutsua, mutta kun täytettyjen alueiden pinta-alat pitäisi laskea, enkä ole keksinyt mitään järkevää ratkaisua, muutenkuin että polygoni jaetaan neliöihin.

 

Piru
Lauantaina, 23. elokuuta, 2003 - klo 3.23:   
Jon: Käytännössä paras keino mitä keksin on lukea koko pelialue floodin jälkeen fastmem bufferiin (graphics/ReadPixelArray8 planar ruuduille, cybergraphics/ReadPixelArray truecolor ruuduille) ja laskea fillatun alueen osuus sitten tuosta fastmem bufferista.

Tuota luettua muistia käsiteltäessä tulisi myös käyttää longword lukuoperaatioita maksimaalisen nopeuden saavuttamiseksi.

Joka tapauksessa tämä metodi on satoja ellei tuhansia kertoja nopeampi kuin RexdPixel.

 

Piru
Lauantaina, 23. elokuuta, 2003 - klo 3.26:   
Missään tapauksessa ei pidä käyttää WritePixel tai ReadPixel rutiineja.

Yksi mahdollisuus on laskea koko pelin bufferi koko ajan fastmem:a ja blitata ruudulle vain muuttuneet osat yhdellä kertaa. Näin voi käyttää omaa fillausrutiinia joka toimii suoraan fastmem bufferilla.

Tässä tapauksessa fillatun alueen pinta-ala olisi suoraan tiedossa joten erillistä skannauskierrosta ei tarvittaisi.

 

Jon
Sunnuntaina, 24. elokuuta, 2003 - klo 23.52:   
Piru: kiitos vinkeistä. Kaatui perjantaina kaljaa näppikseen niin koodaus loppui kuin kanan lento :)

Koska piirretty alue tulee olemaan monimutkainen, niin rekursiivinen funktio taitaa olla ainoa keino? Kehittelin rekursiivista neliöiden haku -algoritmia, jonka tuottamat neliöt sitten voisi täytellä nopeasti. Samalla pinta-ala tulisi laskettua helposti. (olettaen että tuo mullistava algoritmi toimii...)

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: