Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Odmierzanie czasu w grze

agnieszka.dz 13 Gru 2008 18:28 2556 3
  • #1 13 Gru 2008 18:28
    agnieszka.dz
    Poziom 8  

    Witam!

    Piszę grę, leci się takim małym statkiem i strzela do przeszkód, jest to taki projekt na zajecia z C++ i mam taki problem a mianowicie nie wiem jak zrobić żeby te kamienie (przeszkody do których mam strzelać) pojawiały się co jakis czas a nie na potęgę jak na tym skrinie:

    [C++] Odmierzanie czasu w grze

    Code:

    //---------kolizje-----------------------------------------------------------
    void __fastcall TFormMain::TimerTimer(TObject *Sender)
    {
              Rock = new TRockObject(PanelGame);       // 1
              Rock2 = new TRock2Object(PanelGame);   // 2
               
     for (int i = 0; i < MovingObjectList->Count; ++i)
          ((TMovingObject*)MovingObjectList->Items[i])->Execute();
     for (int i = 0; i < MovingObjectList->Count; ++i) {
          TMovingObject* Object1 = (TMovingObject*)MovingObjectList->Items[i];
          //if (Object1 == Ship) continue;
          for (int j = i + 1; j < MovingObjectList->Count; ++j) {
               TMovingObject* Object2 = (TMovingObject*)MovingObjectList->Items[j];
               if ((Object2->X + Object2->Width > Object1->X) &&
                   (Object2->X - Object2->Width < Object1->X + Object1->Width) &&
                   (Object2->Y + Object2->Height > Object1->Y) &&
                   (Object2->Y - Object2->Height < Object1->Y + Object1->Height)) {
                        delete Object1;  //3
                        delete Object2;  //3
                        break;
                   }
          }
     }
    }


    Punkty 1 i 2 to obiekty które się pojawiaja tak jak na skrinie (pojawiają się one z każdym taktem zegara), trzeba wstawić je w jakiś licznik lub pętlę aby pojawiały się dajmy na to co 500ms (albo jeden częściej od drugiego). Reszta kodu to kolicje działające na zasadzie każdy obiekt z każdym. Po wykryciu jakiej kolwiek kolizji oba obiekty są kasowane punkt 3 w kodzie.
    Ja zrboiłam taką pętlę:
    Code:

              czas++;
            if(czas==150)
             {
              Rock = new TRockObject(PanelGame);
            //  Rock2 = new TRock2Object(PanelGame);
              czas=0;
             }
              czas2++;
             if(czas2==200)
            {
             // Rock = new TRockObject(PanelGame);
              Rock2 = new TRock2Object(PanelGame);
              czas2=0;
              }


    Ale to mi się nie podaoba to (jest to zrobione po najmniejszej lini oporu) i najchętniej chciałabym wykorzystać GetTickCount(); lub jakiś podobny licznik czasu.

    Regulamin, punkt 10.11 - obrazki można wysłać na serwer elektrody.
    Poprawiłem screenshot.
    Poprawiłem temat.
    [Dr.Vee]

  • #2 13 Gru 2008 23:40
    Dr.Vee
    VIP Zasłużony dla elektroda

    Miło widzieć początkującą programistkę, której nie zadowalają cząstkowe rozwiązania :)

    Nie możesz utworzyć osobnego timera tylko do dodawania nowych asteroidów? Jeśli timery działają w tym samym wątku, to nie spodziewam się większych problemów...

    PS. pisze się "po linii najmniejszego oporu".

    Pozdrawiam,
    Dr.Vee

  • #3 14 Gru 2008 10:06
    agnieszka.dz
    Poziom 8  

    Ale nowy timer to dodatkowe komplikacje, po 2 timery jak jestem pewna że jeden może wszystko obsłużyć to nie jest aż tak zaawansowany program aby potrzebował 2 timery. Takie coś znalazłam w innym programie, ale nie wiem jak wykorzystać:

    Code:

     {
         static int Time1 = GetTickCount();
         int Time2 = GetTickCount();
         if (Time2 - Time1 > 700) {
             Time1 = Time2;
             new TRockObject(PanelGame);
         }


    No chopacy podrzućcie jakiś pomysł, najlepiej z rozwiązaniem :)

    PS: u mnie na elektrotechnice mówi się "prąd płynie po najmniejszej linii oporu"

  • #4 14 Gru 2008 11:06
    Dr.Vee
    VIP Zasłużony dla elektroda

    To chyba oczywiste - albo system odmierza za Ciebie czas (timerem), albo robisz to "na piechotę". Czy użyjesz GetTickCount(), czy będziesz liczyć wywołania funkcji obsługi timera (jak w poprzedniej wersji), to w sumie jedno i to samo.

    PS: http://poradnia.pwn.pl/lista.php?id=1440

    Pozdrawiam,
    Dr.Vee

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo