Moorhuhn in SDL [gelöst]



  • hi!
    ich bin relativ neu in SDL und habe eine frage:
    ich versuche aus reinen übungszwecken ein moorhuhn spiel in c zu machen
    dabei springt ein rotes viereck umher und man muss auf es klicken damit irgendetwas passiert (zb ein punkt mehr)
    Hier mal der Quelltext von dem was ich bisher gemacht habe:

    ( ⚠ PIXEL MÜSSEN VILLEICHT BEI EUCH GEÄNDERT WERDEN!! ⚠ )

    #include <SDL/SDL.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {	
    	atexit(SDL_Quit);
    
    	int auflosungX = 1920; // HIER GEGEBENDENFALLS ÄNDERN!!!
    	int auflosungY = 1080; // HIER GEGEBENDENFALLS ÄNDERN!!!
    	int grosse = 200; // HIER VIERECKSGRÖßE AUCH GEGEBENDENFALLS ÄNDERN
    
    	int xscan,yscan;
    	int done = 0;
    	int x, y;
    	Uint8 *keys = SDL_GetKeyState(NULL);
    
    	SDL_Rect bck, dst, neo;
    	SDL_Surface *screen;
    	SDL_Event event;
    	SDL_INIT_VIDEO;
    	screen=SDL_SetVideoMode (auflosungX, auflosungY, 16, SDL_HWSURFACE|SDL_NOFRAME);
    
    	dst.x = 0;
    	dst.y = 0;
    	dst.w = auflosungX;
    	dst.h = auflosungY;
    	SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format, 0, 0, 0));
    
    	bck.x = auflosungX/10;
    	bck.y = auflosungY/10;
    	bck.w = (auflosungX/5)*4;
    	bck.h = (auflosungY/5)*4;
    	SDL_FillRect(screen, &bck, SDL_MapRGB(screen->format, 0, 0, 255));
    	SDL_UpdateRect(screen, 0, 0, 0, 0);
    	srand(time( NULL )); 
    
    /*--------------------------------STANDARDSACHEN-------------------------------------*/
    
    	while(!done)
    	{
    		neo.x = 0;
    		neo.y = 0;
    		neo.w = 0;
    		neo.h = 0;
    
    		x = (rand() % (auflosungX - (grosse + (auflosungX / 3)))) + (auflosungX/10); //hoffe ich habe hier nicht übertrieben^^
    		y = (rand() % (auflosungY - (grosse + (auflosungY / 3)))) + (auflosungY/10);
    
    		neo.x = x;
    		neo.y = y;
    		neo.w = grosse;
    		neo.h = grosse;
    
    		SDL_FillRect(screen, &neo, SDL_MapRGB(screen->format, 255, 0, 0));
    		SDL_UpdateRect(screen, 0, 0, 0, 0);
    
    		usleep(1000*1000);
    
    		SDL_FillRect(screen, &neo, SDL_MapRGB(screen->format, 0, 0, 255));
    
    		while (SDL_PollEvent(&event))
    		{
    			if (SDL_MOUSEBUTTONDOWN)
    			{
    				for ( yscan = y; yscan < (y + grosse); yscan ++)
    				{
    					for ( xscan = x; xscan < (x + grosse); xscan ++);
    					{
    						if ( event.motion.x == xscan )
    						{
    							printf("hit X:%i Y: %i\n",xscan, yscan);
    						}
    					}
    				}
    			}
    			switch(event.type) 
    			{
    				case SDL_QUIT:
                     		done = 1;	
                    		break;
    			}
    			if(keys[SDLK_q]) 
    			{
    				done = 1;
    			}
    		}
    	}
    }
    

    ..So mein Problem liegt auf Zeile 75.
    Wenn man das Programm mal testet dann merkt man schnell das es nicht auf treffer reagiert 😞
    wäre cool wenn jemand hier eine idee für einen besseren nachprüfvorgang hätte!
    DANKE SCHON MAL! 🙂



  • Sehe ich das richtig, dass du für den Treffertest jeden Pixel im Rechteck durchgehst und ihn mit den Mauskoordinaten vergleichst? Das ist unnötiger Aufwand. Du kannst einfach prüfen, ob die Mauskoordinaten innerhalb der Rechteckgrenzen liegen:

    if (SDL_MOUSEBUTTONDOWN)
    {
    	if ( x <= event.motion.x && event.motion.x <= x + groesse && y <= event.motion.y && event.motion.y <= y + groesse)
    	{
    		printf("hit X:%i Y: %i\n",event.motion.x, event.motion.y);
    	}
    }
    


  • GyroGearloose schrieb:

    Sehe ich das richtig, dass du für den Treffertest jeden Pixel im Rechteck durchgehst und ihn mit den Mauskoordinaten vergleichst? Das ist unnötiger Aufwand. Du kannst einfach prüfen, ob die Mauskoordinaten innerhalb der Rechteckgrenzen liegen:

    if (SDL_MOUSEBUTTONDOWN)
    {
    	if ( x <= event.motion.x && event.motion.x <= x + groesse && y <= event.motion.y && event.motion.y <= y + groesse)
    	{
    		printf("hit X:%i Y: %i\n",event.motion.x, event.motion.y);
    	}
    }
    

    wow cool danke 😃 😃 😃


Anmelden zum Antworten