Probleme mit kbhit()/ncurses



  • Ich habe die kbhit() die hier im Forum gepostet wurde verwendet. Nur funktioniert mein Progrämmchen nicht so wie ich es mir wünsche.

    Das Programm wird solange ausgeführt bis eine Taste gedrückt. Dann ist stopp. Stattdessen sollte er aber einfach nur die Zahlen verändern und in der for-schleife weiterlaufen => das x sollte seine Richtung ändern
    ein weiterer Tastendruck, er springt in das while, getch holt sich den Tastendruck, der switch spring zur richtigen stelle und das X läuft in eine andere Richtung. So in etwa sollte es funktionieren, tuts aber nicht.

    #include <ncurses.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <panel.h>
    #include <termios.h>
    
    int kbhitz(void);
    
    int main()
    {
      	int nx, ny;
      	int nxold, nyold;
      	int nvx, nvy;  
    	int nsteuertaste;
    	int maxx, maxy;
    
    	nx=ny=nxold=nyold=nvx=nvy=nsteuertaste=maxx=maxy=0;
    
    	initscr();					//bildschirm in curses mode umschalten
    	raw();                       //disable line buffering
    	keypad(stdscr, TRUE);        //für F1, F1 und die Pfeiltasten
    	noecho();					//Der text wird bei getch nicht angezeigt
    	cbreak();
    	getmaxyx(stdscr, maxx, maxy); //maximale Zeilen/spalten Zahl
    
      	nvx=1;
      	nvy=1;
    
      	for(nx=ny=nxold=nyold=1 ;nsteuertaste!='q'; )
      	{
    		while(kbhitz())
    		{	
    			nsteuertaste=getch();
    			switch(nsteuertaste)
    			{	
    				case KEY_DOWN:
                        	nvx=1; nvy=0;
                     	break;
                     	case KEY_UP:
                        	nvx=-1; nvy=0;
                     	break;
                     	case KEY_LEFT:
                        	nvx=0; nvy=-1;
                     	break;
                     	case KEY_RIGHT:
                        	nvx=0; nvy=1;
                     	break;
    			}
    		}
    
    		move(nxold,nyold);
    		addch(' ');
    
    		move(nx,ny);
    		addch('X');
    
    		nxold=nx;
    		nyold=ny;
    
    		nx += nvx;
    		ny += nvy;
    		refresh();
    
    		usleep(100000);	
    	}
    	endwin();
    	return 0;
    }
    
    int kbhitz(void) 
    {
            struct termios term, oterm;
            int fd = 0;
            int c = 0;
            tcgetattr(fd, &oterm);
            memcpy(&term, &oterm, sizeof(term));
            term.c_lflag = term.c_lflag & (!ICANON);
            term.c_cc[VMIN] = 0;
            term.c_cc[VTIME] = 1;
            tcsetattr(fd, TCSANOW, &term);
            c = getchar();
            tcsetattr(fd, TCSANOW, &oterm);
            if (c != -1)
            ungetc(c, stdin);
            return ((c != -1) ? 1 : 0);
    }
    

    vg Christoph



  • Wenn du ncurses verwendest, brauchst du doch nicht diese kbhit-Funktion. Stichwort nodelay(), dann blockiert getch() nicht mehr.

    Selber an den Terminal-Optionen zu werkeln wenn man schon ncurses benutzt ist keine gute Idee.



  • danke!!!

    so einfach wärs gewesen


Anmelden zum Antworten