Mettere in pausa una fubzione ma non tutte

di il
10 risposte

Mettere in pausa una fubzione ma non tutte

Salve a tutti. Sto scrivendo un gioco per console molto semplice in cui con un'astronave (un semplice "+") si devono evitare i missili nemici che cadono dall'alto ("|") ma ho un problema: i missili devono essere "spawnati" cioè la posizione orizzontale deve essere randomizzata, una volta al secondo, ma la navicella deve potersi muovere sempre, ogni volta che tocchiamo una freccia. Il programma funziona così: includo nel file .cpp il file header dove ci sono le funzioni, e poi faccio un while finché non perdo. Il while richiama le funzioni: genera (genera il missile), muovi (vede se una freccia è premuta e muove la navicella), mostra (mostra il gioco con tutti i componenti sulla console. Il mio problema è che il while deve essere veloce e richiamare sempre la funzione muovi(), ma solo una volta al secondo la funzione genera(). Come posso fare?

10 Risposte

  • Re: Mettere in pausa una fubzione ma non tutte

    Devi eseguire il tuo ciclo ad intervalli regolari di tempo, es. ogni 50 msec, e alcune funzioni le esegui sempre mentre altre le esegui ogni tot passate, es. ogni 20 passate per ottenere ogni secondo.
    Ora, per sincronizzare il ciclo esistono metodi diversi; ti consiglio di cominciare con una bella Sleep(50).
  • Re: Mettere in pausa una fubzione ma non tutte

    No perché così il ciclo si ferma e non va avanti lo stesso per nessuna funzione, si ferma ad un punto ma non è che si ferma solo per una. Oppure non ho capito cosa intendi. Pure perché fermarlo vuol dire che mentre lo fermo non mi posso muivere con la nave, invece a me serve, come dici tu, eseguire una funzione ogni tot secondi, ma senza fermare il ciclo
  • Re: Mettere in pausa una fubzione ma non tutte

    Rileggi quello che ti ha suggerito candaluar .... forse non hai fatto attenzione ... lui parla di 50 ms ... millesimi di secondo, capito?
  • Re: Mettere in pausa una fubzione ma non tutte

    Si ma io parlo di eseguire una sola funzione, una volta al secondo, invece le altre sempre
    
    while(!(game_over))
    {
      if(è passato un secondo)
        genera();
      mostra();
      muovi();
    }
    
  • Re: Mettere in pausa una fubzione ma non tutte

    Non si eseguono "sempre" delle funzioni in un ciclo altrimenti la CPU del computer impazzisce (e va al 100%).
    Devi prevedere una minima pausa nel ciclo (dell'ordine dei 15-50 millisecondi) che eviti questa condizione.
    E poi, in base a questo ritardo, inserisci un contatore che, ad un valore opportuno (1000 millisecondi / ritardo scelto) esegua una sola volta l'altra funzione.

    Spero ti sia chiaro.
  • Re: Mettere in pausa una fubzione ma non tutte

    Si avevo provato così
    
    for(int i=0;(!(game_over));i++)
    {
      if(i%3000==0)
        genera();
      mostra();
      muovi();
    }
    
    Solo che all'inizio ci mette circa un secondo, ma andando avanti ci mette sempre di più non so perché
  • Re: Mettere in pausa una fubzione ma non tutte

    Se non usi la Sleep non avrai dei tempi precisi. Se non vuoi seguire i consigli, beh, auguri.
  • Re: Mettere in pausa una fubzione ma non tutte

    Ma non è che non voglio seguire i consigli lo capisci? Semplicemente io ho cuiesto una cosa, e le risposte che ho ottenuto non servono, visto che ritardando di 50 milliseconi non cambia assolutamente nulla, e inoltre se uso lo sleep di 1 secondo, in quel secondo lo schermo non si aggiorna e non posso muovere la nave. Potrei seguire i consigli, ma visto che mi avete consigliato cose che avevo già provato e non servono, non vedo perché dovrei
  • Re: Mettere in pausa una fubzione ma non tutte

    Veramente non li hai seguiti i consigli perché non li hai ancora capiti.
  • Re: Mettere in pausa una fubzione ma non tutte

    Se può aiutare: tempo fa si è discusso della sincronizzazione del ciclo di un videogame https://www.iprogrammatori.it/forum-programmazione/cplusplus/controllo-velocita-game-t28725.html
Devi accedere o registrarti per scrivere nel forum
10 risposte