Miten kuvaa pyöritetään Allegrolla??
Eikö siinä ollut joku rotate_sprite()-funktio
Onpahan hyvinkin. Kannattaa lukaista Allegron mukana tuleva dokumentti allegro.txt. Sieltä selviää:
void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
Tapahtuu seuraavaa: kuva (sprite) piirretään toiselle bittikartalle (bmp) kohtaan x,y kulmassa angle. Kulma on välillä 0-256 (256=täysi ympyrä, 128=puoliympyrä, 64=suorakulma jne). Lisäksi sprite-hahmon täytyy olla muistissa oleva bittikartta (memory bitmap).
Allegro.txt:stä löytyy myös kaikkien muidenkin funkkareiden tiedot selitettyinä, tosin englanniksi.
ei toimi
Pikkusen tarkempaa selitystä, kiitos.
Aivan, hieman tarkemmin... Mikä mättää, missä mättää ja kuinka mättää? Vai kääntyykö vailla virheitä tms.? Laita koodinpätkää näkyviin jos virheitä ei esiinny, niin puretaan ongelma.
Testasin sitä funktiota tällä ohjelmanpätkällä
Koodi on
#include<stdio.h> #include<allegro.h> BITMAP *tyyppi; PALETTE pal; int main(void) { allegro_init(); install_keyboard(); install_timer(); set_gfx_mode(GFX_AUTODETECT,640,400,0,0); tyyppi=load_bmp("tyyppi.bmp",&pal); set_palette(&pal); rotate_sprite(screen,tyyppi,270,190,64); while(!key[KEY_ESC]) { } allegro_exit(); }
kuva ei pyörähtänut 90 astetta
Toi install_timer() on turha, mutta kopsasin alun vanhasta koodista ja se jäi siihen. Kääntäjä on DJGPP ja käytän RHIDEä
Onko siinä mitään vikaa?
Köh köh Kröh... Pieni ajatuksen moka. Kulma on 'korjattu' datatyyppi (fixed). Tässä tulee apuun funktio itofix:
fixed itofix(int);
Eli korjaa koodistasi 64 --> itofix(64). Sitten pitäisi pyörähtää se maaginen kulma.
Miten sitten x ja y koordinaatteja voi siirtää sen asteluvun suuntaan (0=siirtyy ylöspäin 64=siirtyy oikealle jne.)
Sinillä ja kosinilla (sin ja cos). Ottaavat parametrinsa radiaaneina, eli 0 - 2*pii eli 0 - 2*3.1415. Eli joudut pitämään sitä kulmaa vaikka flotarina ja radiaaneina ja konvertoimaan sen aina rotate_spriteä varten. Periaatteessahan nuo antaa suoraan yksikkövektorin kulman osoittamaan suuntaan. Taisipa täällä olla QB:lle tai jollekin jopa esimerkkiä noiden käytöstä.
Vielä pieni nootti: viestin muokkaaminen on mahdollista ja jopa suotavaa ettei tarvitse kirjoittaa useampia perättäisiä viestejä. Muutenkin tuollaiset "Onko siinä mitään vikaa?"-viestit ovat täysin turhia. Erityisesti nuo "ei toimi" viestit ovat täysin hevon peräaukosta.
Pidä kulma vaikka koko ajan radiaaneina, jonka muunnat sitten kuvan piirtoa varten fiksatuksi. Muuttaminen on helppoa: 2*PII rad = 256 ==> 1 rad = 256/2*PII = 128/PII.
Kulma saadaan siis kertomalla rad-kulma tuolla suhteella ja pyöristämällä lähimpää kokonaislukuun. 90° = PII/2 rad = PII/2 * 128/PII = 128/2 = 64, niinkuin pitääkin.
Esim.
float kulma,x,y; koodia jossa kulmaa muutellaan ... x += cos(kulma); y += sin(kulma); rotate_sprite(screen,tyyppi,x,y,itofix((int)(kulma*(128/PII)))); ... loput koodista
Aihe on jo aika vanha, joten et voi enää vastata siihen.