Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    C++ - OpenGL -> glutSpecialFunc(...) non chiama glutPostRedisplay();

    Salve..
    Vi mostro il mio spezzone di algoritmo:

    codice:
    void specialKeyboard( int key, int x, int y){
            bool spostamentoConsentito=false;
     
            if( key == GLUT_KEY_UP ){
                    spostamentoConsentito = personaggio.sposta( muro, Tastiera::AVANTI );
                    if(spostamentoConsentito){
                            camera.sposta( Tastiera::AVANTI );
                            glutPostRedisplay();
                    }
            }
            else if ( key == GLUT_KEY_DOWN ){
                    spostamentoConsentito = personaggio.sposta(muro, Tastiera::DIETRO );
                    if(spostamentoConsentito){
                            camera.sposta( Tastiera::DIETRO);
                            glutPostRedisplay();
                    }
            }
    }
    La parte logica del mio algoritmo funziona bene, solamente che il :

    codice:
    glutPostRedisplay()
    viene saltato e quindi a sua volta non viene effettuato il redisplay..
    Il redisplay viene effettuato una volta quando premo il tasto ed una seconda volta quando lo rilascio, ma quando lo tengo premuto per un tot di tempo, tale "glutPostRedisplay()" non viene chiamato..

    A tale problematica, potete aiutarmi????

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Prova ad eliminare le due chiamate alla glutPostRedisplay(); e aggiungerne una fuori dalle if
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Stessa cosa..

    se aggiungo un funzione di stampa, come in questo modo:

    codice:
    	if( key == GLUT_KEY_UP ){
    		spostamentoConsentito = personaggio.sposta( muro, Tastiera::AVANTI );
    		if(spostamentoConsentito){
    			camera.sposta( Tastiera::AVANTI );
    			glutPostRedisplay();
    			cout<<"ok"<<endl;
    		}
    	}
    la stampa viene effettuata ma il redisplay dà lo stesso problema..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da stprogramming
    Stessa cosa..
    In che senso ...? Come hai modificato il codice ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Stessa cosa nel senso che ho portato fuori agli "if" il "glutPostRedisplay();" e mi da lo stesso problema...Poi ho verificato l'esattezza dell'algoritmo inserento delle stampe..

  6. #6
    Forse ho capito la problematica..
    Praticamente, il tempo di lettura dell'input da tastiera è minore rispetto al tempo che impiega a ridisegnare tutta la scena.. Nello stesso istante che premo un tasto, il progetto tenta di completare il postRedisplay precedente.. Quindi devo cercare a gestire i tempi..

  7. #7
    Originariamente inviato da stprogramming
    Forse ho capito la problematica..
    Praticamente, il tempo di lettura dell'input da tastiera è minore rispetto al tempo che impiega a ridisegnare tutta la scena.. Nello stesso istante che premo un tasto, il progetto tenta di completare il postRedisplay precedente.. Quindi devo cercare a gestire i tempi..

    Ed in effetti è così, perchè invece di fare il passaggio per riferimento ho fatto il passaggio per copia che ovviamente è molto dispendioso.. Solito errore di distrazione!!

  8. #8
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    Ti conviene staccare la cattura della pressione dei tasti dal rendering della scena.

    io faccio piu o meno cosi in pseudo codice:
    codice:
    while(true){
    
    processa_coda_input();
    
    disegna_scena();
    
    swapbuffer o chi per lui();
    
    }
    Cosi la scena viene disegnata in continuazione. E' possibile impostare un frame per second da rispettare se non si vuole andare a massima velocita'.

    A questo punto prendi gli input di "key up", "key down" in modo asincrono, quando i tasti vengono premuti.
    Ad ogni frame, prima di disegnare la scena, nella pseudo-funzione processa_coda_input(); controlli se e' attualmente premuto qualche tasto, se lo e' allora apporti le modifiche del caso (tipo muovere la camera avanti o indietro).

    perche usi, glutPostRedisplay e non glutSwapBuffers, cosi per curiosita'?

  9. #9
    Ancora sono in fase di programmazione e quindi ho la necessità di forzare il repaint..
    In un secondo momento eliminerò la forzatura e lascerò solamente la funzione glutSwapBuffers in modo sincrono, anche perchè devo inserire delle animazioni..

    Grazie per il tuo consiglio!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.