Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kuvan pyöritys Allegrolla

Sivun loppuun

Sharph [21.11.2003 14:51:09]

#

Miten kuvaa pyöritetään Allegrolla??

Sharph [21.11.2003 15:27:10]

#

Eikö siinä ollut joku rotate_sprite()-funktio

sqwiik [21.11.2003 15:39:07]

#

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.

Sharph [21.11.2003 16:23:00]

#

ei toimi

AK [21.11.2003 16:29:05]

#

Pikkusen tarkempaa selitystä, kiitos.

sqwiik [21.11.2003 16:51:34]

#

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.

Sharph [21.11.2003 18:18:16]

#

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

Sharph [21.11.2003 18:23:52]

#

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ä

Sharph [21.11.2003 18:45:42]

#

Onko siinä mitään vikaa?

sqwiik [21.11.2003 19:14:35]

#

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.

Sharph [22.11.2003 10:45:32]

#

Miten sitten x ja y koordinaatteja voi siirtää sen asteluvun suuntaan (0=siirtyy ylöspäin 64=siirtyy oikealle jne.)

thefox [22.11.2003 11:26:44]

#

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.

sqwiik [22.11.2003 11:52:21]

#

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

Sivun alkuun

Vastaus

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

Tietoa sivustosta