[SDL]Collision lässt gegner verrückt spielen



  • Hallo leute,
    ich hab folgendes Problem.

    Hab ein kleines Fangen Spiel programmiert, wenn man das so nennen kann.
    Man steuert einen kleine Smilie und muss mit dem kleine Punkte einsammeln. Eigentlich was ganz simples. Nur wenn ich ein Punkt eingesammelt hab lass ich per Zufall den neuen Punkt wo anders auftauchen.

    Aber sobald ich darauf komm, springt der neue Punkt wild hin und her zwischen zwei Punkten.

    Ich benutze VC++ Express 2008 und SDL.

    Hänge den Quellcode mal mit an, weil der für einen Beitrag denk etwas groß ist.

    http://www.endless.devnetik.de/stuff/fangen.zip

    vielen dank schonmal falls mir jemand helfen kann.



  • Hallo

    Ich habe mir deinen Code nicht angesehen, aber stimmt die Kollisionserkennung 100%-ig? Kannst du vielleicht mal den Teil der Kollisionserkennung rausziehen und ihn eben posten? Ansonsten kann ich mir vorstellen, dass falsche Zufallswerte entstehen. Ich nehme mal an du bestimmt die einzeknen Koordinaten mit rand()?

    Mfg.
    way



  • ich hab die collide.c genommen die ich im inet gefunden hab.

    int SDL_CollideBoundingBoxRect(SDL_Rect a , SDL_Rect b)
    {
    	if(b.x + b.w < a.x)	return false;	//just checking if their
    	if(b.x > a.x + a.w)	return false;	//bounding boxes even touch
    
    	if(b.y + b.h < a.y)	return false;
    	if(b.y > a.y + a.h)	return false;
    
    	return true;				//bounding boxes intersect
    }
    

    und bei so funktioniert die einwandfrei.
    nur sobald ich einen neuen wert für die position mit rand angib, spinnt es.

    SDL_Rect a = {player.get_x(),player.get_y(),15,15};
    			SDL_Rect b = {enemy.get_x(),enemy.get_y(),15,15};
    
    			unsigned int zx = rand()%WSCREEN;
    			unsigned int zy = rand()%HSCREEN;
    
    			//Logic
    			if(SDL_CollideBoundingBoxRect(a,b))
    			{
    				enemy.set_active(false);
    				player.add_point();
    			}
    			if(enemy.get_active() == false)
    			{
    				enemy.set_active(true);
    				enemy.set_new_pos(zx,zy);
    			}
    
    			//Render
    			SDL_FillRect(screen,&screen_rec,SDL_MapRGB(screen->format,0,0,0));
    			enemy.draw(enemy.get_y(),enemy.get_x(),15,15,screen,"enemy.bmp");
    			player.draw(player.get_x(),player.get_y(),15,15,screen,"player.bmp");
    

    hoffe das ist soweit hilfreich.

    gruß michael



  • Hallo

    Btw:
    Wenn du sowieso nur mit Kreisen arbeitest, benutz den Satz des Pythagoras um die genaue Kollision festzustellen...

    Mfg.
    way



  • mir gehts ja grad nur drum warum der enemy nachdem ersten mal treffen so abgeht.
    rein theoretisch wärs doch richtig wie ich es hab oder ?
    das überprüft wird ober der gegner lebt, dann eine neue position gesetzt wird und er wieder lebendig wird.



  • Hallo

    Rein potentiell gesehen hast du dir deine Frage gerade selber beantwort:

    das überprüft wird ober der gegner lebt, dann eine neue position gesetzt wird und er wieder lebendig wird.

    Der Code tut nur das was der Programmierer geschrieben hat. Also schau nochmal, eventuell erst lebendig machen und dnan die Position übergeben. Spiel doch mal ein bischen mit rum!

    PS.: Wenn ich gleich wieder zu Hause bin, schaue ich mir die Sache mal genauer an.

    Mfg.
    way



  • ich hab den fehler gefunden,

    enemy.draw(enemy.get_y(),enemy.get_x(),15,15,screen,"enemy.bmp");
    			player.draw(player.get_x(),player.get_y(),15,15,screen,"player.bmp");
    			SDL_ApplyText(punktetext,"arial.ttf",18,screen,2,2,255,255,255);
    

    in der zeile in der ich den gegner zeichne hab ich das x und y vertauscht.

    danke trotzdem, gruß michi


Anmelden zum Antworten