timer



  • Moin moin,

    ich brauche sowas wie time(NULL). Nur das dieser Timer deutlich genauer sein soll.
    Den Timer benötige ich für mein erstes Spiel in ncurses(space invaders). Wenn ich KEY_SPACE, KEY_RIGHT , KEY_LEFT oder keine Taste drücke, soll der Timer aufgerufen werden, der eine "Start_timer_variable" definiert. Danach soll wieder überprüft werden ob der User irgendetwas eingegeben oder nichts eingegeben hat. Daraufhin soll wieder der Timer aufgerufen werden, um zu überprüfen ob die vergangene Zeit >= 0.1 Sekunden ist. Wenn NICHT, wird wieder der user input ausgewertet und das ganze geht von vorne los. WENN die vergangene Zeit >= 0.1 sekunden ist, soll eine Variable inkrementiert werden. Danach soll die "Start_timer_variable" wieder neu defineirt werden. Dann wiederholt sich alles.
    Wie würded/würden Ihr/Spieleprogrammierer dieses Problem lösen? Ich konnte auf http://ninvaders.sourceforge.net/ in den Quelldatein keinen Timer ausfindig machen.

    Bevor der Server c-plusplus.net down war hatte ich einen ähnlichen Thread aufgemacht. Allerdings wurde dieser gelöscht weshalb ich hier einen neuen Thread aufgemacht habe. Und ja es soll ncurses sein 😉 Distri : Debian



  • https://ideone.com/CUT5E6

    #ifndef STOPWATCH_HPP
    #define STOPWATCH_HPP
    
    #include <chrono>
    
    template <typename Clock = std::chrono::steady_clock>
    class stopwatch
    {
    public:
    	typedef Clock clock;
    	typedef typename clock::time_point time_point;
    	typedef typename clock::duration duration;
    
    private:
    	time_point last_;
    
    public:
    	stopwatch()
    		: last_(clock::now())
    	{}
    
    	void reset()
    	{
    		*this = stopwatch();
    	}
    
    	time_point now() const
    	{
    		return clock::now();
    	}
    
    	duration elapsed() const
    	{
    		return now() - last_;
    	}
    
    	duration tick()
    	{
    		time_point dummy;
    		return tick(dummy);
    	}
    
    	duration tick(time_point& now_)
    	{
    		now_ = now();
    		auto elapsed = now_ - last_;
    		last_ = now_;
    		return elapsed;
    	}
    };
    
    typedef stopwatch<> default_stopwatch;
    
    template <typename T, typename Rep, typename Period>
    T duration_cast(const std::chrono::duration<Rep, Period>& duration)
    {
    	return duration.count() * static_cast<T>(Period::num) / static_cast<T>(Period::den);
    }
    
    #endif
    
    // cpp file
    #include <iostream>
    #include <thread>
    
    int main()
    {
    	default_stopwatch sw;
    	for (unsigned i = 0; i != 50; ++i)
    	{
    		std::this_thread::sleep_for(std::chrono::milliseconds(77));
    		std::cout << duration_cast<double>(sw.elapsed()) << '\n';
    	}
    }
    

  • Mod



  • Da du von Spieleentwicklung sprichst, werfe ich mal SFML in den Raum.

    sf::Clock clock;
    ...
    sf::Time time = clock.getElapsedTime();
    std::cout << "Zeit: " << time.asMilliseconds() << std::endl;
    

Log in to reply