käytän c++:saa ja allegroa.
Saan kuvan pyörimään, mutta se sottaa ruudun. Mikä siinä on vikana?
#include <allegro.h> int main(){ allegro_init(); install_keyboard(); set_color_depth(16); set_gfx_mode(GFX_AUTODETECT,640,480,0,0); BITMAP *sprite; BITMAP *tausta; BITMAP *spriten_tausta; BITMAP *taustapuskuri; PALETTE pal; int x=150; int y=150; int kulma=0; sprite=load_bitmap("kuva.bmp",pal); tausta=load_bitmap("tausta.bmp",pal); spriten_tausta=create_bitmap(44,4); taustapuskuri=create_bitmap(640,480); blit(tausta,taustapuskuri,0,0,0,0,640,480); while(!key[KEY_ESC]){ blit(taustapuskuri,screen,0,0,0,0,640,480); blit(tausta,spriten_tausta,x,y,0,0,44,4); blit(spriten_tausta,taustapuskuri,0,0,x,y,44,4); kulma++; if(kulma>255)kulma=0; rotate_sprite(taustapuskuri,sprite,x,y,itofix(kulma)); } } END_OF_MAIN();
hmmmmm ei mitään tietoa mutta veikkaan ettet siivonnut niitä piirtämääsi pyörivän kuvan jälkiä
En ainakaan itse tiedä unohtaneeni mitään. Ainakin tuolla koodilla saa kuvan liikkumaan sotkematta taustaa, mutta pöyritys ei suju.
Kuvan pyörittäminen sujúu trigonometrian avulla. Jos pistettä (x,y) pyöritetään origon ympäri kulman a verran, on uudet koordinaatit (x cos a, y sin a). Nopeampaa on tietysti approksimoida trigonometrisiä funktioita Taylorin polynomin avulla.
Sorry vaan mutten ymmärtänyt(aloittelija kun olen), voisitko antaa esimerkin?
rotate_sprite-funktio hoitaa nuo jaskan mainitsemat asiat, ja minulla se ainakin hoiti pyörityksen todella kauniisti, silloin kun vielä allegroa käytin.
Jaska puhuu nyt ihan omiaan kysymyksen ulkopuolelta.
Tuo kuvan sottaaminen johtuu varmaankin siitä, että kun kuvaa pyöritetään, tausta ei enää mahdu tuohon spriten_tausta-bittikarttaan. Jos otat esimerkiksi pari A4:sta, laitat ne päällekkäin, pyörität päällimmäistä vaikka 45 astetta, niin huomaat, että päällimmäinen ei millään mahdu alemman "sisään".
Eli ratkaisu on suurentaa tuota spriten_tausta-bitmappia. En sitten tiedä tarjoaako Allegro tuolle ongelmalle jotain valmista ratkaisua.
Nyt toimii, kiitos.
Voi tietty olla parempi idea tyhjentää näyttö joka kerta ennenkuin laittaa ruudulle uudessa asennossa olevan kuvan.
Tuossa nyt ilmeisesti kuitenkin käytettiin jotain taustakuvaa. Tietysti yksi mahdollisuus olisi myös piirtää koko roska aina uusiksi (ensin tausta, ja sitten spritet päälle joka framella) mutta se olisi paljon hitaampaa kuin taustan tallentaminen vain tarvittavista kohdista.
no kyllä double bufferin kanssa jo 386 konekkin jaksaa piirtää koko kuvan ihan uusiksi vaikka olisikin muutamia bitmappeja ja erikseen laskettavia elementtejä kuvassa, että en näkisi sitä ongelmana.
Minä näkisin, varsinkin jos resoluutio on suuri ja spritejä on paljon.
Aihe on jo aika vanha, joten et voi enää vastata siihen.