Avatar billede jasperDK Nybegynder
14. maj 2003 - 18:49 Der er 22 kommentarer og
1 løsning

Animation i c++

Jeg har ny fået den ide at lave en animation. Kan man lave det i c++? Eller skal jeg over i et helt andet program/sprog. Og hvis man skal helt væk fra c++, hvordan sætter man så animeringen ind i c++?
Lidt underligt sat op, meennnn den er til at forstå.. (håber jeg)
Avatar billede bertelbrander Novice
14. maj 2003 - 23:36 #1
Nu er animationer og animationer mange ting. Min første "animation" var en bille tegnet med karakterene () og O på en Vic20, men det er nok ikke den slags du ønsker at lave ;-)
Problemet med animationer & C++ er grafikken, i standard C++ har man ikke muglighed for at vise grafik, så du er nød til at bruge et eller andet GUI lib, hvilket afhænger af den platform og compiler du bruger. Man kan ret let lave grafik i windows, og programmere dette i C++.
Avatar billede jasperDK Nybegynder
15. maj 2003 - 08:29 #2
Jeg synes det ville være perfekt at lave en lille bille.. (Jeg er trods alt newbie.)
Jeg så også en anden af den karakter som du siger.: lav 30 små o´er, lav et af dem om til et 8 tal, lav 8 tallet om til et o igen. Og gør det forskellige steder i o´erne. Spillet går ud på, at man skal holde musen over 8 tallet. (Jeg har ikke fået det til at virke)..

MEn hvis du vil forklare lidt om billen vil jeg blive glad. Kan man få den til at gå rundt på skærmen? eller står den stille?
Avatar billede jasperDK Nybegynder
15. maj 2003 - 08:32 #3
Hvilken compiler skal jeg bruge. Kan jeg godt bruge visual c++ 4 fra microsoft?
Den nemlig lige blevet lagt ud på www.download.com.
Avatar billede jasperDK Nybegynder
15. maj 2003 - 14:43 #4
I "øjeblikket" bruger jeg Dev c++ fra bloodsehed.net
Kan den bruges?
Avatar billede soreno Praktikant
15. maj 2003 - 16:10 #5
Ok, jeg har lavet en fattigmands console animation:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char buffer[] = {'|', '/', '-', '\\'};
    int buffer_length = 4;
    int antal = 0;
    int max_antal = 10;
    int index = 0;
    while(true)
    {
        printf("%c\b", buffer[index]);
        index++;
        if(index>=buffer_length)
        {
            index = 0;
            antal++;
            if(antal >= max_antal)
            {
                break;
            }
        }
        Sleep(100);
    }
   
    printf("\n");
    system("pause");   

    return 0;
}

Er det noget ala det du søger ?
Avatar billede jasperDK Nybegynder
15. maj 2003 - 16:15 #6
Ja det er den stil, vil du forklare lidt om hvordan den er lavet.
Og kan man få den til at "gå" rundt på skærmen??
Avatar billede soreno Praktikant
15. maj 2003 - 16:21 #7
Et array med de chars som skal animere (bliver animeret i samme rækkefølge som de står i arrayet).

printf("%c\b", buffer[index]);
skriver det char der er på index's plads.
\b betyder backspace - ellers ville "animationen" se sådan ud: |/-\|/-\ osv..

Så testes om index er størrer end eller lig med arrayets størrelse, hvis det er sandt sættes index til 0 (animationen starter forfra). Antal tælles én op, hvis antal er størrer end eller lig med max_antal hoppes ud af while løkken (uden den sidste test ville programmet køre uendelige).

Sleep har du nok gættet hvad gør ;-)
Avatar billede soreno Praktikant
15. maj 2003 - 16:22 #8
At "få den til at gå rundt på skærmen" er besværligt.
Problemet er at console (dos vinduet) ikke har en fast størrelse i winnt og nyere.

Men du kan evt. selv lege lidt med
\b
og mellem rum ' '
Avatar billede bertelbrander Novice
15. maj 2003 - 16:35 #9
En lille bille der bevæger sig:

#include <windows.h>
#include <stdio.h>

const char *const ben[] =
{
  "  )))",
  "  |||",
  "  (((",
  "  |||"
};

int main(void)
{
  HANDLE con = GetStdHandle(STD_OUTPUT_HANDLE);
  int i;
  COORD coord;

  SetConsoleTextAttribute(con, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  coord.X = 0;
  for(i = 0; i < 3; i++)
  {
    coord.Y = i;
    SetConsoleCursorPosition(con, coord);
    printf("                                                  ");
    fflush(stdout);
  }

  for(i = 0; i < 40; i++)
  {
    coord.X = i;
    coord.Y = 0;
    SetConsoleCursorPosition(con, coord);
    printf(ben[i%4]);
    fflush(stdout);
    coord.Y = 1;
    SetConsoleCursorPosition(con, coord);
    printf(" -OOOO:");
    fflush(stdout);
    coord.Y = 2;
    SetConsoleCursorPosition(con, coord);
    printf(ben[i%4]);
    fflush(stdout);
    Sleep(300);
  }
  SetConsoleTextAttribute(con, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

  return 0;
}
Avatar billede soreno Praktikant
15. maj 2003 - 17:16 #10
Sjov lille bille - med inspiration i din kode lavede jeg dette:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

HANDLE handle;

const char *const darth1[] =
{
    "        _.-'~~~~~~`-._",
    "        /      ||      \\",
    "      /      ||      \\",
    "      |        ||        |",
    "      | _______||_______ |",
    "      |/ ----- \\/ ----- \\|",
    "    /  (    )  (    )  \\",
    "    / \\  ----- () -----  / \\",
    "  /  \\      /||\\      /  \\",
    "  /    \\    /|--|\\    /    \\",
    " /      \\  /|----|\\  /      \\",
    "/_        \\o========o/        _\\",
    "  `--...__|`-._  _.-'|__...--'",
    "          |    `'    |",
    "",
    "      Luke - I am your father"       
};

const char *const darth2[] =
{   
    "        _.-'~~~~~~`-._",
    "        /      ||      \\",
    "      /      ||      \\",
    "      |        ||        |",
    "      | _______||_______ |",
    "      |/ ----- \\/ ----- \\|",
    "    /  (    )  (    )  \\",
    "    / \\  ----- () -----  / \\",
    "  /  \\      /||\\      /  \\",
    "  /    \\    /||||\\    /    \\",
    " /      \\  /||||||\\  /      \\",
    "/_        \\o========o/        _\\",
    "  `--...__|`-._  _.-'|__...--'",
    "          |    `'    |",
    "",
    "      Luke - I am your father"       
};

void showDarth(const char *const temp[])
{
    COORD coord;
    coord.X = 0;
    coord.Y = 0;
    SetConsoleCursorPosition(handle, coord);
   
    for(int i=0;i<16;i++)
    {
        coord.X = 0;
        coord.Y = i;
        SetConsoleCursorPosition(handle, coord);
        printf("%s\n", temp[i]);
        fflush(stdout);
    }
   
}

int main(void)
{
    system("cls");
    handle = GetStdHandle(STD_OUTPUT_HANDLE);   

    SetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
   
    int count = 0;
    int max = 10;
   
    do
    {
        showDarth(darth1);
        Sleep(200);
        showDarth(darth2);
        Sleep(200);
    }while(count++ <= max); 
   
    SetConsoleTextAttribute(handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

    return 0;
}
Avatar billede bertelbrander Novice
15. maj 2003 - 18:46 #11
Glemte at sige at min kode var "inspireret" af din kode i:
http://www.eksperten.dk/spm/352577

Man skal bruge fflush(stdout) efter printf hvis denne ikke afsluttes med en '\n' ellers vil nogle kompilere ikke vise noget (specielt gcc baserede kompilere).
Avatar billede jasperDK Nybegynder
18. maj 2003 - 15:05 #12
Nu er jeg kommet hjem fra sommerhus, og jeg har kigget lidt på det i har lavet. Det er fasinerende, det man kan lave. Jeg vil da også denne gang spørge om hvad tingende er. Og Der skal selvfølgelig også et lille tak oven i.
Avatar billede jasperDK Nybegynder
18. maj 2003 - 15:08 #13
I i linie to står der :Jeg vil da også denne gang spørge om hvad tingende er.

Der skulle have stået:Jeg vil da også denne gang spørge om hvad tingene betyder..

TTJ
Avatar billede soreno Praktikant
18. maj 2003 - 15:12 #14
Det er ret simpelt.

SetConsoleTextAttribute() sætter de attributter som tekst skal vises med (dvs. farver).
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/console_screen_buffers.asp

SetConsoleCursorPosition() bestemmer kordinatet for første tegn. (0, 0) er øverste venstre hjørne.

En kombination af disse - og du kan lave animationer.
Avatar billede jasperDK Nybegynder
18. maj 2003 - 16:01 #15
Jeg kan ikke forstå det Soreno.
Avatar billede soreno Praktikant
18. maj 2003 - 16:04 #16
Er det funktionerne du ikke forstår eller er det strukturen i koden ?

Hvis det er funktionerne du ikke forstår så lad være med at bruge for meget krudt på dem - bare accepter at de virker.

Hvis det er strukturen i koden så vil jeg foreslå at du anskaffer en begynder bog til C++. Det er ikke noget man lige lærer på en weekend.
Avatar billede jasperDK Nybegynder
18. maj 2003 - 16:38 #17
Det er begge dele. Jeg acceptere funktioner. Og cykler i morgen over på biblioteket og låner en bog om det...
Avatar billede jasperDK Nybegynder
19. maj 2003 - 07:37 #18
Den bille BertelB har lavet starter sådan her?:

#include <windows.h>
#include <stdio.h>


Hvorfor starter den ikke sådan her?:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>


Håber på et hurtigt svar.
Avatar billede soreno Praktikant
19. maj 2003 - 07:41 #19
stdlib.h indeholder en funktion jeg brugte i min animation - system()

For at kunne bruge system() skal man include stdlib.h

Du kan se lidt om hvad de forskellige include filer gør (dem som er standard for alle nyere compilere) her:
http://www.cplusplus.com/ref/indexr.html
Avatar billede jasperDK Nybegynder
19. maj 2003 - 07:42 #20
I min kommentar (lige ovenover) står der.:. "Den bille BertelB" osv. Men jeg hentyder ikke til at bertelB er en bille.. (Jeg kender jo ikke en gang BB, så jeg kan heller ikke udtale mig om ham).

Undskyld min kludrede sætning, Håber i kan bære over med mig.
Avatar billede jasperDK Nybegynder
19. maj 2003 - 07:44 #21
Tak for hjælpen (igen) Soreno.

Du er tidligt oppe...
Avatar billede soreno Praktikant
19. maj 2003 - 07:45 #22
Jeg har skam været oppe siden lidt over 6 - selvom jeg er arbejdsløs..

;-)
Avatar billede jasperDK Nybegynder
19. maj 2003 - 07:48 #23
Ha´ en god dag, jeg skal gå nu...

:-)

SES
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