• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program w c++ działajacy na timerze

Object Storage Arubacloud
0 głosów
949 wizyt
pytanie zadane 21 maja 2016 w C i C++ przez Ditrix Mądrala (5,650 p.)
Witam!

Chce zrobić program, który ma działać na timerze. Chodzi mi o to, że np co 3 sekundy ma się tworzyć nowy obiekt, a co 2 sekundy ma się dziać coś innego. Jakieś pomysły ?

2 odpowiedzi

0 głosów
odpowiedź 21 maja 2016 przez Avernis Nałogowiec (27,400 p.)
wybrane 22 maja 2016 przez Ditrix
 
Najlepsza

Masz tu kod mojego timera. Żeby nie powiedzieli że gotowce, to ci go w ogóle nie opiszę, i sam go rozpracujesz:

.cpp

ClockTimer::ClockTimer()
{
	restart();
}
ClockTimer::~ClockTimer()
{
}


void ClockTimer::restart()
{
	tick = 0;
	timer2 = clock();
}
float ClockTimer::getTimeAsSeconds()
{
	timer = clock();
	return (timer - timer2) / 1000;
}
float ClockTimer::getTimeAsMiliseconds()
{
	timer = clock();
	return timer - timer2;
}

.h

#pragma once

#include <ctime>

class ClockTimer
{
	float timer = 0;
	float timer2 = 0;

	unsigned int id = 0;

	unsigned short int tick = 0; //to zignoruj 
public:
	ClockTimer();

	~ClockTimer();
	void restart();
	float getTimeAsSeconds();
	float getTimeAsMiliseconds();
};

 

komentarz 22 maja 2016 przez Ditrix Mądrala (5,650 p.)
Dzięki. Dałeś mi fajny pomysł. Spróbuje coś wykombinować :)
komentarz 22 maja 2016 przez Ditrix Mądrala (5,650 p.)

Jeszcze jedno pytanie. Da się zrobić coś takiego, że jeśli użytkownik nie da odpowiedzi po np sekundzie to program przechodzi do kolejnej instrukcji ?

ClockTimer timer1;
    int a=0;
    int x=0;
    start = clock();
    do
    {
        x=0;
        if(timer1.getTimeAsSeconds()>3)
        {
            cout << "Wiekszy od 3" << endl;
            timer1.restart();
        }
         if(timer1.getTimeAsSeconds()>1) cout << "Wiekszy od 1" << endl;

       while(x==0)
       {
           ClockTimer timer2;
           cin >> x;
           if(timer2.getTimeAsSeconds()>1) cout << "Jeszcze raz" << endl;
       }

       a++;
    }while(a<10);

Tu taki przykład. Jeśli użytkownik nie poda wartości x w ciągu jednej instrukcji, to program przechodzi do wyświetlenia wartości w cout.

komentarz 23 maja 2016 przez draghan VIP (106,230 p.)

Masz tu kod mojego timera. Żeby nie powiedzieli że gotowce, to ci go w ogóle nie opiszę

Padłem ze śmiechu, autentycznie. Przecież to co zrobiłeś, to właśnie... dałeś gotowca.

komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Ale go nie opisałem:)
komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
@Ditrix. Jeśli w projekcie masz pętlę główną, to po prostu tworzysz tam drugą pętlę(pętla w pętli) i na bieżąco sprawdzasz czas. Jeśli będzie większe od wyznaczonego to wywołujesz break;
komentarz 23 maja 2016 przez Ditrix Mądrala (5,650 p.)
Ale jeśli dobrze rozumiem, polecenie cin czy getch czeka do momentu aż użytkownik poda wartość.
komentarz 23 maja 2016 przez draghan VIP (106,230 p.)

Ale go nie opisałem:)

No właśnie. Udokumentowany kod mógłby posłużyć jako example, zaś nieudokumentowany jest po prostu gotowcem. :) Akurat to jest przypadek trywialny, więc mi tam wszystko jedno - tylko dla porządku zwróciłem uwagę. :)

Ale jeśli dobrze rozumiem, polecenie cin czy getch czeka do momentu aż użytkownik poda wartość.

Dobrze zrozumiałeś. Są to funkcje blokujące. W standardzie C++ nie ma funkcji nieblokujących do obsługi formatowanego wejścia.

komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Czyli osiągnąłem efekt odwrotny do zamierzonego :d
komentarz 23 maja 2016 przez Ditrix Mądrala (5,650 p.)
Dobra to podam swój problem.

Robię klasyczną gierkę w stylu zbijania spadających celów. W pętli głównej mam if'y sterujące( w prawo i w lewo), I chce osiągnąć taki efekt, jeśli gracz nie kliknie niczego przez np sekundę to ma się wywołać instrukcja else(instrukcja  w else nie zmienia naszej pozycji)  i program przechodzi dalej. Da się coś takiego osiągnąć w klasycznym c++ ?
komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
while(true)
{
    if(clock.getTimeAsSeconds() < 1)
    {
        if(klik)
        {
        //wykonanie
        }
    }
    else
    {

    }
}

O to ci chodziło? (przez klasyczny c++ rozumiem w konsoli)

komentarz 23 maja 2016 przez draghan VIP (106,230 p.)

Standard C++ nie oferuje bezpośredniego dostępu do klawiatury. Wszystkie dane standardowo są buforowane. Dla Windows można użyć funkcji kbhit() połączonej z getch() z conio.h, dla Linuksów zostaje ncurses.

Wątek na SO do poczytania.

komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Można też użyć biblioteki sfml
komentarz 23 maja 2016 przez draghan VIP (106,230 p.)
Można, ale według mnie dla postawionego zadania jest to tzw. overkill.
komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
To może sobie napisać funkcji która przyjmuje 1 argument, do obsługi zdarzeń z klawiaturą: Było to w którymś z odcinków Pana M.
komentarz 23 maja 2016 przez Ditrix Mądrala (5,650 p.)
Pokaże może mój kod. Odpalcie go i już tłumaczę.

main http://hostcode.sourceforge.net/view/5818

.h http://hostcode.sourceforge.net/view/5819

cpp http://hostcode.sourceforge.net/view/5820

No więc, jak kliknie się albo "a" albo "d" nasza literka porusza się prawo i w lewo, naciśnięcie klawisza "w" wystrzeliwuje pocisk. I po wciśnięciu klawisza tworzony jest nowy obiekt i wszystkie inne zlatują na dół. Trochę to źle wygląda. Fajnie by było gdyby użytkownik miał np sekundę na naciśnięcie przycisku, jeśli tego nie zrobi, uruchamia się else i pętla robi obieg.
komentarz 23 maja 2016 przez Avernis Nałogowiec (27,400 p.)
To dałem tam przykład: Jeśli jest mniejsze od 1, to nasz czas, potem, restartujesz czas, jak jest większe od 1, i przesuwasz. Potem obieg się kończy, i zaczyna od nowa
komentarz 23 maja 2016 przez Ditrix Mądrala (5,650 p.)

Jest to efekt przybliżony do takiego jaki chciałem osiągnąć ale dzięki :)

Kod sterujący wygląda tak

char choice;

        if(clock2.getTimeAsSeconds() < 1)
        {
            choice = getch();
            if(choice == 'a')
            {
                kropki[player->x][player->y] = ".";
                if(player->y >= 1 ) player->y--;
                kropki[player->x][player->y] = player->name;
            }
            else if(choice == 'd')
            {
                kropki[player->x][player->y] = ".";
                if(player->y <= 13 )player->y++;
                kropki[player->x][player->y] = player->name;
            }

            else if(choice == 'w')
                list_atacks.emplace_back("o", 13, player->y);
        }

        else
        {
            kropki[player->x][player->y] = player->name;
            clock2.restart();
        }

Nadal trzeba klikać aby te kreski spadały, a nasze pociski szły do góry. Jest jeden obieg pętli, który wykonuje się automatycznie, bez naszej ingerencji, ale to za mało :/ Jeśli użytkownik nic nie będzie klikać to program stanie w miejscu :/

komentarz 23 maja 2016 przez draghan VIP (106,230 p.)
Zainteresowałeś się funkcją kbhit z conio.h?
komentarz 23 maja 2016 przez Ditrix Mądrala (5,650 p.)

Tak czytałem o niej. Sprawdza czy bufor jest pusty. Ale użytkownik i tak musi podać co chce zrobić. Wtedy następuje blokada. Program zatrzymuje się na

choice = getch();

 

komentarz 23 maja 2016 przez draghan VIP (106,230 p.)
Sprawdzaj, czy bufor jest pusty. Jeśli nie, wtedy dopiero wyjmij znak z bufora.
komentarz 24 maja 2016 przez Ditrix Mądrala (5,650 p.)
Wielkie dzięki! Działa tylko kompletnie nie wiem jak ^^. Jakbyś mógł wytłumaczyć byłbym bardzo wdzięczny :)
komentarz 24 maja 2016 przez draghan VIP (106,230 p.)
Żeby "pobrać klawisz", musisz pobrać znak z zawartości bufora. Wszystkie funkcje pobierające dane z bufora blokują program, jeśli w buforze nie znajdą tego, czego potrzebują. Funkcja kbhit() tylko sprawdza stan bufora, nie blokuje przebiegu programu.
komentarz 24 maja 2016 przez Ditrix Mądrala (5,650 p.)
if(clock2.getTimeAsSeconds() < 1 && kbhit()==1)
        {
            choice = getch();

Czyli dowolny klawisz naciśnięty w dowolnym czasie wskakuje do bufora. W tym zapisie if sprawdza czy jest coś w buforze, jeśli jest to przypisuje wartość bufora do zmiennej choice. Dobrze zrozumiałem ?

komentarz 24 maja 2016 przez draghan VIP (106,230 p.)

Z tą dowolnością to bym uważał. Z tego co pamiętam, kbhit dość dziwnie zachowuje się dla klawiszy funkcyjnych i chyba również tych z bloku numerycznego. Pewien nie jestem, musisz to sobie sprawdzić eksperymentalnie. :)

Ale owszem, dobrze rozumiesz. Ja Twój fragment kodu rozumiem tak:

Jeżeli nie minęła sekunda i ktoś wcisnął klawisz, pobierz go i zapisz do zmiennej choice.

komentarz 24 maja 2016 przez Ditrix Mądrala (5,650 p.)
Na prawdę wielkie dzięki!

Dzięki również wszystkim innym, którzy się tutaj udzielali :) Program śmiga elegancko!
komentarz 24 maja 2016 przez draghan VIP (106,230 p.)
Na zdrowie. :) Miłego wieczoru. :)
komentarz 24 maja 2016 przez Ditrix Mądrala (5,650 p.)
Teraz na pewno będzie miły! :)

Wzajemnie!
+1 głos
odpowiedź 21 maja 2016 przez Munvik Dyskutant (9,350 p.)
Masz zamiar użyć jakiś bibliotek ? Bo jak nie, to polecam poprostu clock_t i sprawdzanie czy minęło te 2 / 3  sekundy chociaż są jeszcze inne sposoby.
komentarz 22 maja 2016 przez Ditrix Mądrala (5,650 p.)
Obojętnie, byle działało sprawnie :) Właśnie po głębszym zastanowieniu doszedłem do wniosku, że to wystarczy :D Po prostu do każdej funckji w pętli dać if'a ze sprawdzeniem czy minęło ileś tam sekund.
komentarz 22 maja 2016 przez Munvik Dyskutant (9,350 p.)
Tak dokładnie.

Podobne pytania

0 głosów
1 odpowiedź 358 wizyt
pytanie zadane 4 maja 2016 w Java przez DeBos123 Nałogowiec (44,950 p.)
0 głosów
1 odpowiedź 3,465 wizyt
pytanie zadane 22 lutego 2016 w Mikrokontrolery przez programer Obywatel (1,190 p.)
0 głosów
1 odpowiedź 392 wizyt
pytanie zadane 21 sierpnia 2018 w Inne języki przez Storm Obywatel (1,570 p.)

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...