sdl tastureingabe auf loslassen [gelöst]



  • Hallo!
    Ich habe ein Problem.
    Ich hab hier ein kleines Programm aus übungszwecken gemacht:

    ( ⚠ PIXEL MÜSSEN VILLEICHT AUF EUREN BILDSCHIRM GEÄNDERT WERDEN ⚠ )

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    
    int main () {
    
    	int puffer_a; // spalte 1
    	int a_a = 0;
    	int b_a = 255;
    	int c_a = 255;
    	int puffer_b; // spalte 2
    	int a_b = 0;
    	int b_b = 0;
    	int c_b = 255;
    	// SPALTE C NICHT BENÖTIGT DA IMMER NUR 0
    
    	Uint8 *keys = SDL_GetKeyState(NULL);
    	SDL_Event event;
    
    	SDL_Surface *screen;
    	SDL_INIT_VIDEO;
    	screen = SDL_SetVideoMode ( 1920, 1080, 32, SDL_HWSURFACE | SDL_NOFRAME);
    
    	SDL_Rect a, b , c;
    
    	atexit(SDL_Quit);
    
    	a.x = 0;
    	a.y = 0;
    	a.w = 1920;
    	a.h = 360;
    
    	b.x = 0;
    	b.y = 360;
    	b.w = 1920;
    	b.h = 360;
    
    	c.x = 0;
    	c.y = 720;
    	c.w = 1920;
    	c.h = 360;
    
    	SDL_FillRect(screen, &a, SDL_MapRGB(screen->format,a_a, a_b, 0));
    	SDL_FillRect(screen, &b, SDL_MapRGB(screen->format, b_a, b_b, 0));
    	SDL_FillRect(screen, &c , SDL_MapRGB(screen->format, c_a, c_b, 0));
    	SDL_UpdateRect(screen, 0, 0, 0, 0);
    
    	while(1)
    	{
    		while (SDL_PollEvent(&event)) 
    		{
    			switch(event.type) 
    			{
    				case SDL_QUIT:
    				exit(0);
    				break;
    			}
    		}
    		if (keys[SDLK_q]) 
    		{
    		exit(0);
    		}
    		if (keys[SDLK_w]) 
    		{
    			puffer_a = a_a;
    			a_a = b_a;
    			b_a = c_a;
    			c_a = puffer_a;
    
    			puffer_b = a_b;
    			a_b = b_b;
    			b_b = c_b;
    			c_b = puffer_b;
    
    			SDL_FillRect(screen, &a, SDL_MapRGB(screen->format,a_a, a_b, 0));
    			SDL_FillRect(screen, &b, SDL_MapRGB(screen->format, b_a, b_b, 0));
    			SDL_FillRect(screen, &c , SDL_MapRGB(screen->format, c_a, c_b, 0));
    			SDL_UpdateRect(screen, 0, 0, 0, 0);
    		}
    	}
    }
    

    ... Ich wollte eigendlich das wenn man auf w drückt die Kästchenfarben nur um eins verschoben werden.
    Das geht aber nicht so und ich weiß auch wiso
    aber was ich nicht weiß ist wie ich das lösen kann.
    Gibt es villeicht irgendein Befehl mit dem es nur auf das loslassen einer Taste Funktioniert statt Das runterdrücken?

    wär nett wenn jemand helfen könnte 😉
    MFG



  • Silahel schrieb:

    Gibt es villeicht irgendein Befehl mit dem es nur auf das loslassen einer Taste Funktioniert statt Das runterdrücken?

    Ich kenn mich mit SDL nicht aus aber mit einem zweiten Array für die Tasten geht das auch, also

    if(!keys[SDLK_w])
    {
        if(keys_2[SDLK_w])
        {
            ...
        }
    }
    ...
    keys_2[SDLK_w] = keys[SDLK_w];
    

    keys_2 muss halt so wie keys aufgebaut sein.



  • neuer_user schrieb:

    Silahel schrieb:

    Gibt es villeicht irgendein Befehl mit dem es nur auf das loslassen einer Taste Funktioniert statt Das runterdrücken?

    Ich kenn mich mit SDL nicht aus aber mit einem zweiten Array für die Tasten geht das auch, also

    if(!keys[SDLK_w])
    {
        if(keys_2[SDLK_w])
        {
            ...
        }
    }
    ...
    keys_2[SDLK_w] = keys[SDLK_w];
    

    keys_2 muss halt so wie keys aufgebaut sein.

    Nun ja vermutlich mach ich es falsch oder so aber das funktioniert bei mir nicht.
    Aber der ansatz ist gut ich hab das mal jetzt so versucht:

    if(keys[SDLK_w]) 
    		{
    			usleep(1*1000);
    			if(!keys[SDLK_w]) 
    			{ 
    				puffer_a = a_a;
    				a_a = b_a;
    				b_a = c_a;
    				c_a = puffer_a;
    
    				puffer_b = a_b;
    				a_b = b_b;
    				b_b = c_b;
    				c_b = puffer_b;
    
    				SDL_FillRect(screen, &a, SDL_MapRGB(screen->format,a_a, a_b, 0));
    				SDL_FillRect(screen, &b, SDL_MapRGB(screen->format, b_a, b_b, 0));
    				SDL_FillRect(screen, &c , SDL_MapRGB(screen->format, c_a, c_b, 0));
    				SDL_UpdateRect(screen, 0, 0, 0, 0);
    			}
    		}
    

    Jemand ne idee wiso das jetzt nicht funktioniert?



  • wie wärs mit einem array, mit der größe, die der anzahl aller keys entspricht.
    dann beim press wird das entsprechende element auf true gesetzt, und wenn es wieder auf false gesetzt wird, ist die taste wohl losgelassen.



  • while (SDL_PollEvent(&event))
    {
    	switch(event.type)
    	{
    		case SDL_QUIT:
    		{
    			exit(0);
    			break;
    		}
    		case SDL_KEYDOWN:
    		{
    			switch(event.key.keysym)
    			{
    				case SDLK_UP:
    					break;
    					// etc...
    			}
    			// TODO: Insert Code
    		}
    		case SDL_KEYUP:
    		{
    			switch(event.key.keysym)
    			{
    			}
    			// TODO: Insert Code
    		}
    
    	}
    
    }
    

    Wie wärs hiermit?



  • Sorry wegen doppelpost:
    http://sdl.beuc.net/sdl.wiki/SDL_KeyboardEvent

    und es muss event.key.keysym.sym heissen, sorry dafür.



  • Grießbrei schrieb:

    while (SDL_PollEvent(&event))
    {
    	switch(event.type)
    	{
    		case SDL_QUIT:
    		{
    			exit(0);
    			break;
    		}
    		case SDL_KEYDOWN:
    		{
    			switch(event.key.keysym)
    			{
    				case SDLK_UP:
    					break;
    					// etc...
    			}
    			// TODO: Insert Code
    		}
    		case SDL_KEYUP:
    		{
    			switch(event.key.keysym)
    			{
    			}
    			// TODO: Insert Code
    		}
    		
    
    	}
    
    }
    

    Wie wärs hiermit?

    danke das ist schlau



  • So Sollte es irgendjemanden interressieren...
    Das ist der Fertige Quelltext wie es auch funktioniert:

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    
    int main () {
    
    	int puffer_a; // spalte 1
    	int a_a = 0;
    	int b_a = 255;
    	int c_a = 255;
    	int puffer_b; // spalte 2
    	int a_b = 0;
    	int b_b = 0;
    	int c_b = 255;
    	// SPALTE C NICHT BENÖTIGT DA IMMER NUR 0
    
    	Uint8 *keys = SDL_GetKeyState(NULL);
    	SDL_Event event;
    
    	SDL_Surface *screen;
    	SDL_INIT_VIDEO;
    	screen = SDL_SetVideoMode ( 1920, 1080, 32, SDL_HWSURFACE | SDL_NOFRAME);
    	atexit(SDL_Quit);
    
    	SDL_Rect a, b , c;
    
    	a.x = 0;
    	a.y = 0;
    	a.w = 1920;
    	a.h = 360;
    
    	b.x = 0;
    	b.y = 360;
    	b.w = 1920;
    	b.h = 360;
    
    	c.x = 0;
    	c.y = 720;
    	c.w = 1920;
    	c.h = 360;
    
    	SDL_FillRect(screen, &a, SDL_MapRGB(screen->format,a_a, a_b, 0));
    	SDL_FillRect(screen, &b, SDL_MapRGB(screen->format, b_a, b_b, 0));
    	SDL_FillRect(screen, &c , SDL_MapRGB(screen->format, c_a, c_b, 0));
    	SDL_UpdateRect(screen, 0, 0, 0, 0);
    	while(1)
    	{
    		if(keys[SDLK_q]) 
    		{
    			exit(1);
    		}	 
    		while (SDL_PollEvent(&event)) 
    		{ 
    			switch(event.type) 
    			{
    				case SDL_QUIT: 
    				{ 
    					exit(0); 
    					break; 
    				} 
    				case SDL_KEYDOWN: 
    				{
    					if(keys[SDLK_w]) 
    					{	
    						puffer_a = a_a;
    						a_a = b_a;
    						b_a = c_a;
    						c_a = puffer_a;
    
    						puffer_b = a_b;
    						a_b = b_b;
    						b_b = c_b;
    						c_b = puffer_b;
    
    						SDL_FillRect(screen, &a, SDL_MapRGB(screen->format,a_a, a_b, 0));
    						SDL_FillRect(screen, &b, SDL_MapRGB(screen->format, b_a, b_b, 0));
    						SDL_FillRect(screen, &c , SDL_MapRGB(screen->format, c_a, c_b, 0));
    						SDL_UpdateRect(screen, 0, 0, 0, 0);
    					}
    				}
    			} 
    		}
    	}	
    }
    

    Danke an alle die mitgeholfen haben!!! 😃 😃 😃


Anmelden zum Antworten