Avatar billede alex_sleiborg Nybegynder
25. februar 2009 - 10:09 Der er 2 kommentarer

Design spørgsmål ang. billeder

Hey.

Jeg har lavet en kort klasse i C++ med QT4. Et kort objekt kan indeholde værdien af kortet, altså om det er f.eks. en konge, og så self. hvilket slags kortet er ruder, hjerter osv. Men da jeg er igang med at lave en GUI app, så skal kortet jo også gerne kunne vises grafisk til brugeren. Dette kan laves meget nemt med, ved at bruge et jpg billede og putte det ind i en QLabel, og så vise det der, hvor det skal bruges. Den første måde jeg lavede det på, var ved at nedarve fra QLabel til kort klassen, så kunne kort klassen selv indeholde et billede, svarende til det kort den var blevet sat til. Dette virkede også perfekt. Noget ala dette her

Card *card = new Card(Card::SPADES,Card::KING);
mainLayout->addWidget (card);//Tilføjer kortet til layout

Inde i min kort klasse, har jeg så en funktion der loader billedet.
void Card::SetImage()
{
    QImage *image = new QImage();
    char *path = new char();
    switch ( suit )
    {
        case HEARTS :
            sprintf ( path, "../src/%dh.jpg", cardvalue +1 );
            break;
        case SPADES :
            sprintf ( path, "../src/%ds.jpg", cardvalue +1 );
            break;
        case CLUBS :
            sprintf ( path, "../src/%dc.jpg", cardvalue +1 );
            break;
        case DIAMONDS :
            sprintf ( path, "../src/%dd.jpg", cardvalue +1 );
            break;
    };
    image->load ( path );
    this->setPixmap ( QPixmap::fromImage ( *image ) );
}

Men så mødte jeg en inde på irc, som sagde jeg skulle holde min game logik fra min GUI logik. Så at kort objektet ikke indeholder noget billede. Så kort klassen altså ikke nedarver fra QLabel, men så skal jeg til at have min switch statement inde i selve GUI logikken, og så skal der tilføjes et QLabel objekt til hvert kort objekt, hver gang jeg skal bruge et kort. Hvad er mest korrekt at gøre? Håber i forstår spørgsmålet
Avatar billede mxs Nybegynder
25. februar 2009 - 16:58 #1
Du skal holde din model (det du kalder game logik) væk fra gui (det du kalder GUI logik). Det er helt rigtigt sagt.
Jeg ville gøre det sådan at jeg havde en card klasse i min model, som modellerede et hvilken som helst kort. I min gui vil jeg så oprette et sæt kort og alt afhængig af hvad kort det er, vise et billed. Det vil sige at jeg ikke vil have en nedarvning fra noget gui snask blandet ind i min model i dit henseende.
Avatar billede alex_sleiborg Nybegynder
26. februar 2009 - 14:21 #2
Men med denne løsning, så kommer jeg til, at have dobbelt så mange objekter som før. Og det skal egentligt heller ikke bruges til et spil, men for visuelt at vise forskellige sorterings algoritmer i brug(Altså sortere et kortspil). Men denne kort klasse som jeg har lavet, kan jeg jo godt komme til at bruge andre steder selvfølgelig.

Men så vil du lave den noget ala det her. (Pseudo)

Card *card = new Card(Card::SPADES,Card::KING);

    QLabel *lbl = new QLabel();
    QImage *image = new QImage();
    char *path = new char();
    switch ( card->GetSuit() )
    {
        case HEARTS :
            sprintf ( path, "../src/%dh.jpg", cardvalue +1 );
            break;
        case SPADES :
            sprintf ( path, "../src/%ds.jpg", cardvalue +1 );
            break;
        case CLUBS :
            sprintf ( path, "../src/%dc.jpg", cardvalue +1 );
            break;
        case DIAMONDS :
            sprintf ( path, "../src/%dd.jpg", cardvalue +1 );
            break;
    };
    image->load ( path );
    lbl->setPixmap ( QPixmap::fromImage ( *image ) );

    mainLayout->addWidget (lbl);

Hver eneste gang jeg skal bruge et kort jo. Eller så skal jeg til, at have en funktion i hver eneste dialog der skal bruge kort.???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester