Springende bilder anstatt von animationen...



  • Hallo...

    hier der code:

    #include <SDL.h>
    #include <math.h>
    #include <iostream>
    
    #ifdef _WIN32
    #undef main
    #endif
    
    #define HEIGHT  768
    #define WIDTH   1024
    
    using namespace std;
    
    SDL_Surface  *g_ship;
    SDL_Surface  *g_screen;
    
    int main()
    {
    	int run = 1;
    	int curframe  = 0;
    	int frametime = 0;
    
    	int posx = 0;
    	int posy = 0;
    	int endposx = 0;
    	int endposy = 0;
    	float dirvectx = 0;
    	float dirvecty = 0;
    	float length = 0;
    
    	bool move = false;
    
    	SDL_Rect dest;
    
        SDL_Init(SDL_INIT_VIDEO);
    
    	g_screen = SDL_SetVideoMode(WIDTH, HEIGHT, 0, 0|SDL_DOUBLEBUF);
    
    	g_ship = SDL_LoadBMP("img.bmp");
    
    	dest.x = posx;
    	dest.y = posy;
    
    	while(run)
    	{
    		SDL_Event event;
    
    		curframe = SDL_GetTicks();
    
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    			   case SDL_KEYDOWN:
    			      	switch(event.key.keysym.sym)
    				    {
    				       case SDLK_ESCAPE:
    				        	run = 0;
    					        break;
    
    				       default:
    				    	    break;
    				    }
    				    break;
    
    			   case SDL_MOUSEBUTTONDOWN:
    				   if(event.button.button == SDL_BUTTON_LEFT)
    				   {
    					   endposx = event.button.x;
    				       endposy = event.button.y;					  
    
    					   move = true; 
    
    				   }
    					   break;
    
    			   case SDL_QUIT:
    				   run = 0;
    				   break;
    
    			   default:
    				   break;
    			}
    		}
    
    		dirvectx = endposx - posx;
    		dirvecty = endposy - posy;
    
    		cout<<dirvectx<<"         "<<dirvecty<<endl;
    
    		length = sqrt(float(dirvectx*dirvectx + dirvecty*dirvecty));
    
    		dirvectx /= length;
    		dirvecty /= length;
    
    		cout<<dirvectx<<"         "<<dirvecty<<endl;
    
    		if(move == true)
    		{
    		  dest.x = (curframe*dirvectx)/10+posx;
    		  dest.y = (curframe*dirvecty)/10+posy;
    		}
    
    		SDL_FillRect(g_screen, 0, 0x000000);
    
    		SDL_BlitSurface(g_ship, 0, g_screen, &dest);
    
    		SDL_Flip(g_screen);
    		SDL_SetColorKey(g_ship, SDL_SRCCOLORKEY, 0xffffff);
    
    		frametime = SDL_GetTicks()-curframe; 
    	}
    
    	SDL_FreeSurface(g_ship);
    
    	return 1;
    }
    

    also das problem ist folgendes:
    das bild in g_ship startet bei (0,0), und fährt dahin wo man mit der maus klickt.
    das problem dabei ist, dass wenn man sofort nach öffnen der applikation irgendwo hinklickt, das schiff fast ohne sprung startet.
    wartet man dagegen ein paar sekunden, springt das schiff immer näher respektiv weiter zu dem angeklickten punkt.

    das problem ist wohl offensichtlicherweise curframe, das ja am anfang einen viel kleineren wert hat, als zu dem zeitpubkt, wenn man mit dem klicken wartet.
    die frage nun , wie kann man das beheben? und wie kann ich es bewerkstelligen, dass das schiff nur bis zu dem punkt fährt, und dann stillsteht, hört sich einfach an, aber ich hab da echte probleme^^

    sry wenn ich es nicht ins spieleprogrammierungs forum gesetzt habe, aber letztes mal hat man mir da gesagt, auch wenn es sdl ist, soll ich es in das normale c++ forum setzen, da es ja kein echtes spiel ist...

    thx & mfg!!!! 👍 😋



  • sry wenn ich es nicht ins spieleprogrammierungs forum gesetzt habe, aber letztes mal hat man mir da gesagt, auch wenn es sdl ist, soll ich es in das normale c++ forum setzen, da es ja kein echtes spiel ist...

    wer hat dir denn sowas erzählt? "echtes spiel" hin oder her, mit purem c++ hat das alles erst recht nichts zu tun... 🙄

    was an deinem code nicht stimmen soll kann dir höchstwahrscheinlich kein mensch sagen... Dein problem ist kein konkreter fehler, sondern allgemein dieser spaghetti code... Da ist ja null struktur drinne, die eingabe ist von der bewegung nicht getrennt, deine koordinaten sind irgendwie aus einzelnen variablen zusammengepfuscht, da ist natürlich kein wunder, wenn da irgendetwas schief geht.

    Lösungsvorschlag: teile den code irgendwie sinnvoll auf, bau dir eine klasse für dein schiff, die erstmal nur wenige public-methoden wie zB "Move" und "Draw" zur verfügung stellt, pack all die geschwindigkeiten und koordinaten in eine eigene 2D-vektor struktur usw usw...

    Der code der in der main steht sollte letztendlich imho immer aus etwa einer zeile bestehen:

    int main(){
     Init(); Run(); Exit(); return 0;
    }
    

    dann wird die fehlersuche auch um einiges einfacher, weil man die fehler auf einige wenige zeilen direkt lokalisieren kann, statt solche riesenromane durchzulesen... 👍



  • Andrey schrieb:

    sry wenn ich es nicht ins spieleprogrammierungs forum gesetzt habe, aber letztes mal hat man mir da gesagt, auch wenn es sdl ist, soll ich es in das normale c++ forum setzen, da es ja kein echtes spiel ist...

    wer hat dir denn sowas erzählt? "echtes spiel" hin oder her, mit purem c++ hat das alles erst recht nichts zu tun... 🙄

    [/quote]
    natuerlich niemand.
    aber er spielt wohl auf seine c-frage an:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-179728.html
    und da hab ich ihm gesagt, dass er c-fragen besser im c-forum stellen sollte, nicht in spieleprogrammieren.



  • jo k sry wenn das wieder das falsche forum ist... aber das passende subforum zu finden ist gar nicht mal so leicht 🙄
    zu dem struktur teil:
    ja k du hast recht ist nicht sehr strukturiert, aber deer code soll ja nicht viel größer werden, das teil existiert nur, um die einzelnen funktionalitäten zu testen, in diesem fall, wollte ich halt selbst so eine funktionalität "entwickeln", um zu sehen, ob es so läuft wie ich will^^.

    thx & mfg!!! 😋 👍



  • JossBoss schrieb:

    aber deer code soll ja nicht viel größer werden

    wenn du das alles in kleinere einheiten zerlegst, wird der code letztendlich kleiner, weil zB die vektoraddition sich nirgendwo zweimal wiederholt... Dann kannst du aber den code in deinem nächsten projekt gleich weiterverwenden, ohne was dran zu ändern 👍


Anmelden zum Antworten