Come rallentare un ciclo?

di il
5 risposte

Come rallentare un ciclo?

Salve sto facendo un progetto per l'università di programmare una simulazione di un tetris, una cosa che non riesco a risolvere e la velocità con cui scendono i pezzi del tetris, essendo abbastanza veloce e ristampando ogni volta la matrice dopo un paio di movimenti a destra o sinistra diventa difficile capire dove si trovi il pezzeto come posso fare?

5 Risposte

  • Re: Come rallentare un ciclo?

    Il problema NON E' il ciclo, ma l'approccio .
    Perche' non il ciclo?
    Perche' stai ragionando in termini del PC su cui stai lavorando e della frequenza della CPU in quel momento. Ma se hai un portatile, la frequenza della CPU cambia dinamicamente.
    Risultato: un disastro.
    Quello che devi fare e' avere un 'orologio' che genera un certo numero di eventi al secondo e tu implementi l'animazione in base al tempo trascorso dall'ultimo evento.
    Poiche' il tempo dell'orologio passa uguale su qualunque pc, e tu ti basi sulla differenza di tempo tra due eventi (differenza che puo' essere sempre diversa) l'animazione sara' simile su tutti i pc.
    Poi sara' piu' o meno fluida in base al numero di eventi gestiti (tanti o pochi).

    E' piu' complicato? Certo!
  • Re: Come rallentare un ciclo?

    Per una temporizzazione semplice puoi utilizzare l'API di Win32 Sleep() con il parametro di attesa in msec, se sei inWindows naturalmente.
  • Re: Come rallentare un ciclo?

    Come suggerito dagli altri la Sleep() o un Timer sono una buona soluzione.
    Ti è sicuramente utile anche se vuoi implementare i livelli di difficoltà in base a quanto veloce scendono i pezzi.
  • Re: Come rallentare un ciclo?

    Da letture e da test che ho effettuato in prima persona, ottenere un tasso di fotogrammi costante con Sleep() è utopico. Anche usare librerie dedicate (tipo quelle per il multimedia timer) non è sufficiente. Ho letto di tecniche per interrogare più direttamente il sistema con QueryPerformanceCounter() e QueryPerformanceFrequency() che promettono una maggiore precisione, ma non sono mai riuscito a implementarle per eccesso di complessità (c'è sicuramente chi sa farlo, ma non è il mio livello). Se ho ben compreso, altre tecniche che pare possano funzionare bene sui sistemi multiprocessore implicano la creazione di thread distinti e l'interazione tra essi (anche in questo caso, troppo "su" per il mio livello).

    E' una bella sfida. Buona fortuna!

    P.S. Qualora riuscissi a ottenere un bel tasso di fotogrammi elevato e costante finirai per ritrovarti a lottare contro effetti "ottici" potenzialmente schifosi, tipo "l'effetto strappo" dovuto alla difficoltà di sincronizzare il cambio dei fotogrammi con la frequenza di aggiornamento dello schermo. Un casino!
  • Re: Come rallentare un ciclo?

    Okok grazie mille a tutti dell'aiuto siete riusciti a rispondermi anche se avevo formulato la domanda in modo errato, ho provato con sleep() come mi avete consiglia ed è perfetto
    grazie ancora ;D
Devi accedere o registrarti per scrivere nel forum
5 risposte