2009-07-31 23 views
5

एलेग्रो 5 में गेम लूप को कोड करने का सबसे अच्छा तरीका क्या है जो हमेशा एक ही गति पर चलता है, और यह ड्रॉइंग तर्क को अद्यतन तर्क से अलग करता है? क्या मुझे धागे का उपयोग करना चाहिए या नहीं? क्या मुझे नई एलेग्रो इवेंट सिस्टम का उपयोग करना चाहिए?एलेग्रो 5 गेम: गेम लूप जो निरंतर गति से चलता है?

उत्तर

3

Allegro विकी से लिया:

al_install_timer(1.0/FPS); 

... 

while (1) { 
     al_wait_for_event(queue, &event); 

     /* handle input events */ 

     if (event.type == ALLEGRO_EVENT_TIMER) { 
       handle_game_tick(); 
       need_redraw = true; 
     } 

     if (need_redraw && al_event_queue_is_empty(queue)) { 
       render_last_frame(); 
       need_redraw = false; 
     } 
} 

आप फ्रेम लंघन चाहते हैं, render_last_frame() आदेश को छोड़ जब भी आप का पता लगाने कि आप फ्रेम में पीछे चल रहे हैं (उदा al_current_time() फ़ंक्शन का उपयोग करके)।

+0

आह, ताकि आप घटनाओं का उपयोग करना चाहिए। थ्रेडिंग संभावित रूप से छवि स्थिरता में सुधार कर सकता है? घटना कतार धागा-सुरक्षित हैं? – amarillion

+0

थ्रेडिंग बिल्कुल मदद नहीं करेगा। आमतौर पर यह मदद कर सकता है यदि आप प्रतिपादन करते समय सटीक समय का उपयोग करते हैं (फिर, al_current_time() आपका मित्र है)। यह गेम तर्क के संबंध में कुछ प्रदर्शित करने के लिए सटीक स्थिति को अलग करने जैसी चीजों की अनुमति देगा। आपको यह भी ध्यान में रखना चाहिए कि al_flip_display() vsync के लिए प्रतीक्षा करेगा (यदि यह सक्षम है, लेकिन बनाम vync पर पूरी तरह चिकनी एनीमेशन के लिए जरूरी है)। और ए 5 100% थ्रेड सेव है - इवेंट कतार विशेष रूप से इसलिए हैं क्योंकि वे धागे में संवाद करने के साधनों में से एक हैं। –

+0

विकी पेज से लिंक का उल्लेख किया गया: http://wiki.allegro.cc/index.php?title=Porting_from_A4_to_A5 – Leftium

3

Here Allefant के जवाब का अधिक पूर्ण संस्करण (विस्तृत पंक्ति-दर-पंक्ति विवरण के लिए लिंक पर जाएं) है:

#include <stdio.h> 
#include <allegro5/allegro.h> 

const float FPS = 60; 

int main(int argc, char **argv) 
{ 
    ALLEGRO_DISPLAY *display = NULL; 
    ALLEGRO_EVENT_QUEUE *event_queue = NULL; 
    ALLEGRO_TIMER *timer = NULL; 
    bool redraw = true; 

    if(!al_init()) { 
     fprintf(stderr, "failed to initialize allegro!\n"); 
     return -1; 
    } 

    timer = al_create_timer(1.0/FPS); 
    if(!timer) { 
     fprintf(stderr, "failed to create timer!\n"); 
     return -1; 
    } 

    display = al_create_display(640, 480); 
    if(!display) { 
     fprintf(stderr, "failed to create display!\n"); 
     al_destroy_timer(timer); 
     return -1; 
    } 

    event_queue = al_create_event_queue(); 
    if(!event_queue) { 
     fprintf(stderr, "failed to create event_queue!\n"); 
     al_destroy_display(display); 
     al_destroy_timer(timer); 
     return -1; 
    } 

    al_register_event_source(event_queue, al_get_display_event_source(display)); 

    al_register_event_source(event_queue, al_get_timer_event_source(timer)); 

    al_clear_to_color(al_map_rgb(0,0,0)); 

    al_flip_display(); 

    al_start_timer(timer); 

    while(1) 
    { 
     ALLEGRO_EVENT ev; 
     al_wait_for_event(event_queue, &ev); 

     if(ev.type == ALLEGRO_EVENT_TIMER) { 
     redraw = true; 
     } 
     else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { 
     break; 
     } 

     if(redraw && al_event_queue_is_empty(event_queue)) { 
     redraw = false; 
     al_clear_to_color(al_map_rgb(0,0,0)); 
     al_flip_display(); 
     } 
    } 

    al_destroy_timer(timer); 
    al_destroy_display(display); 
    al_destroy_event_queue(event_queue); 

    return 0; 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^