Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Borland C++: Image Loop?

CoolC++ [25.06.2008 17:44:15]

#

Tere, kysyisin yhtä melko yksinkertaista juttu, kun ei iteltäni onnistu vaikka olen koko päivä yrittänyt saada toimimaan, käytän Borland C++ Builder:in visuaali työkalua, jossa on formit tms. ja pitäisi saada image komponenttit tekemään animaatiota looppina.

Yritin mm. seuraavaa, mut mikään ei näistä toiminnut:

Form1->Image1->Visible = true;
Sleep(500);
Form1->Image2->Visible = true;
Sleep(500);
Form1->Image1->Visible = true;
Sleep(500);
Form1->Image2->Visible = true;
Sleep(500);
Form1->Image1->Visible = true;
Sleep(500);
Form1->Image2->Visible = true;
...
Form1->Image2->Show();
Sleep(500);
Form1->Image1->Show();
Sleep(500);
Form1->Image2->Show();
Sleep(500);
Form1->Image1->Show();
Sleep(500);
...

jne. Mut ei...en tiedä miten saisin sen yksinkertaisesti vaikka silmukkaan tms. tälläisellä visuaalisella formilla, kun ei edes while tai do toimi. Enkä edes saa toimimaan goto:a.

Siis, pikkuisen helppiä saisinko? Entäs jos tekee sen jollakin loopilla niin miten sitten se lopetetaan? Entä jos tuon saa jotekin toimimaan edellämainitulla tavalla niin voisiko tässä käyttää omaa functiota, jossa kutsutaan sitten, joka sisältäisi tietyn jonon kuvia kuin yhden es. tyyliin:

Image();
Sleep(50);
Image2();
...

Ehdotuksia?

hunajavohveli [25.06.2008 18:49:33]

#

Silmukoista voit lukea esim. C-oppaasta. Kannattaa tutustua opassarjaan muutenkin, jos perusasiat ovat hakusessa.

CoolC++ [25.06.2008 20:09:32]

#

Joo, katoin kyllä noitakin, mut osaan kyllä nuo, mut en voi hyödyntää noita, koska käytän noita vain console ohjelmissa. Nyt on VCL:llä käytössä, joten pitäis saada, jotakin sille sopivaa...

zacura [25.06.2008 20:16:33]

#

Itse lähtisin toteuttamaan tuota TTimer komponentilla jos kyseessä on yksittäinen (pienehkö) animaatio, pelien animaatiot ja muut vastaavat on varmaan paras toteuttaa jollain muullu kun VCL-kirjastolla tai Windowsin GDI-rajapinnalla.

Mutta Timerilla tuo animointi onnistuu vaikkapa tähän tyyliin:
Formille yksi TImage-komponentti (Image1) ja yksi TTimer-komponentti (Timer1). Timerin ominaisuuksista

Enabled = false

ja

Interval

sopivaksi animaation päivitysnopeudeksi.

Headeriin seuraavat muutokset:

// animaation kuvien määrä
#define ANIM_FRAMES 2

...

//---------------------------------------------------------------------------
class TForm1 : public TForm

    ...

private:	// User declarations

    ...

    // animaation kuvat
    Graphics::TBitmap* anim[ANIM_FRAMES];
    // nykyinen kuva
    int cur_frame;

    ...

ja komponenteille määritellään seuraavat tapahtumakäsittelijät:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    anim[0] = new Graphics::TBitmap();
    anim[0]->LoadFromFile("D:\\alarm.bmp");
    anim[1] = new Graphics::TBitmap();
    anim[1]->LoadFromFile("D:\\alarmrng.bmp");
    cur_frame = 0;
    Timer1->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    cur_frame = (cur_frame+1) % ANIM_FRAMES;
    Image1->Picture->Assign(anim[cur_frame]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    Timer1->Enabled = false;
    int i;
    for (i=0; i<ANIM_FRAMES; i++) {
        delete anim[i];
    }
}
//---------------------------------------------------------------------------

Myös animaatiokuvien lataamisen voi suorittaa loopissa (nimeämällä kuvat tyyliin kuva01.bmp, kuva02.bmp, jne.), mutta se jääköön kotitehtäväksi.

Metabolix [26.06.2008 10:24:33]

#

Viestisi perusteella ihmettelen, miksi kutsut aina vain Show-funktiota. Ensimmäisten kutsujen jälkeenhän mitään ei enää tapahdu, koska molemmat kuvat ovat jo näkyvissä. Toimiva silmukkaratkaisu olisi tällainen:

while (ehto) {
  Form1->Image1->Show(); // Näytetään yksi
  Form1->Image2->Hide(); // Piilotetaan toinen
  Sleep(500);
  Form1->Image2->Show(); // Näytetään toinen
  Form1->Image1->Hide(); // Piilotetaan ensimmäinen
  Sleep(500);
}

Tällainen ratkaisu (Sleep) tietenkin jumittaa ohjelman, joten ajastin on parempi vaihtoehto.

int esilla = 1;

// Ajastimessa:
if (esilla == 1) {
  Form1->Image2->Show();
  Form1->Image1->Hide();
  esilla = 2;
} else {
  Form1->Image1->Show();
  Form1->Image2->Hide();
  esilla = 1;
}

Vastaus

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

Tietoa sivustosta