Mettere in pausa una fubzione ma non tutte

di Anonimizzato20142 il
10 risposte
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

  • 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).
  • 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
  • Rileggi quello che ti ha suggerito candaluar .... forse non hai fatto attenzione ... lui parla di 50 ms ... millesimi di secondo, capito?
  • 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();
    }
    
  • 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.
  • 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é
  • Se non usi la Sleep non avrai dei tempi precisi. Se non vuoi seguire i consigli, beh, auguri.
  • 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
  • Veramente non li hai seguiti i consigli perché non li hai ancora capiti.
Devi accedere o registrarti per scrivere nel forum
10 risposte