logikproblem bei kollisionsabfrage



  • so ich hab mal ne kollisionsabfrage gebastelt, welche in etwa so aussieht:
    bis jetzt will ich erstma überprüfen ob irgendwas von links in das zu überprüfende objekt berührt, oder eben von rechts.

    SDL_Physics.h

    #include <SDL.h>
    class SDL_Physics
    {
    private:
    	int *size;
    	int m_posX,m_posY;
    	SDL_Surface *m_bitmap,*m_target;
    	SDL_Rect m_src,m_dest;
    public:
    	SDL_Physics(SDL_Surface *bitmap,SDL_Surface *target);
    	SDL_Physics();
    	~SDL_Physics();
    	int posX();
    	int posY();
    	void draw(int posX, int posY);
    	bool collide(SDL_Physics a, SDL_Physics b);
    };
    

    SDL_Physics.cpp:

    #ifndef SDL_PHYSICS
    #define SDL_PHYSICS
    #include "SDL_Physics.h"
    #endif
    SDL_Physics::SDL_Physics(SDL_Surface *bitmap,SDL_Surface *target)
    {
    	m_bitmap=bitmap;
    	m_target=target;
    	size=new int;
    	m_src.x=0;
    	m_src.y=0;
    	m_src.h=bitmap->h;
    	m_src.w=bitmap->w;
    	m_dest.w=bitmap->w;
    	m_dest.h=bitmap->h;
    }
    SDL_Physics::~SDL_Physics()
    {
    	delete size;
    }
    SDL_Physics::posY()
    {
    	return m_posY;
    }
    SDL_Physics::posX()
    {
    	return m_posX;
    }
    void SDL_Physics::draw(int posX,int posY)
    {
    	m_dest.x=posX;
    	m_dest.y=posY;
    	SDL_BlitSurface(m_bitmap,&m_src,m_target,&m_dest);
    }
    bool SDL_Physics::collide(SDL_Physics a, SDL_Physics b)
    {
    	int aX,bX,aY,bY; //x and y position of a and b
    	int aW,bW,aH,bH;
    
    	aX=a.posX();
    	aY=a.posY();
    	bX=b.posX();
    	bY=b.posY();
    
    	aW=m_bitmap->w;
    	aH=m_bitmap->h;
    	bW=m_bitmap->w;
    	bH=m_bitmap->h;
    	if(aX>bX && aX<(bX+bW))
    	{
    		return true;
    	}
    	return false;
    }
    

    und schließlich main.cpp zum ausprobieren:

    #ifdef WIN32
    #pragma comment(lib, "SDL.lib")
    #pragma comment(lib, "SDLmain.lib")
    #endif
    #include <stdlib.h>
    #include "SDL.h"
    #include <string>
    #include "SDL_Physics.h"
    const int SCREEN_WIDTH = 800;
    const int SCREEN_HEIGHT = 600; // screen= Hingergrund, sGalaxy = galaxien.bmp
    
    int main(int argc, char **argv)
    {
    	SDL_Surface *screen; //mainscreen and the testimage 
    	//Initalize
    	if(SDL_Init(SDL_INIT_VIDEO)<0)
    	{
    		printf("Error: Couldn initalize Video\n");
    		exit(1);
    	}
    	screen=SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT,32, SDL_DOUBLEBUF);
    	if(!screen)
    	{
    		printf("Error: No Screen found\n");
    		exit(1);
    	}
    	//Put in here all loadings for Bitmaps etc
    	SDL_Surface *testImage;
    	testImage=SDL_LoadBMP("test.bmp");
    	//End of loading bitmaps
    
    	//Here all game valuable variables
    
    	bool running=true;//Game is running? true or false
    	SDL_Event event; //For all main events
    	Uint8 *keys; //All Keyboard events
    
    	//end of vars
    
    	//Position variables for characters
    	int iTestPosX=100;
    	int iTestPosY=200;
    	//End of posvars
    
    	//Here other stuff
    	SDL_Physics a(testImage,screen),b(testImage,screen);
    	SDL_SetColorKey(testImage,SDL_SRCCOLORKEY,SDL_MapRGB(testImage->format,255,255,255));
    
    	a.draw(100,20);
    	b.draw(iTestPosX,iTestPosY);
    	/*Important: The game loop is starting here: */
    	while(running==true)
    	{
    		keys=SDL_GetKeyState(0);
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    			case SDL_QUIT:
    				running=false;
    				break;
    			case SDL_KEYDOWN:
    				if(keys[SDLK_ESCAPE])//Exit game
    					running=false;
    			}
    		}
    		//Put in here Keyboards event checks
    		if(keys[SDLK_UP])
    		{
    			iTestPosY-=10;
    			SDL_FillRect(screen,0,SDL_MapRGB(screen->format,0,0,0));
    			b.draw(iTestPosX,iTestPosY);
    		}
    		if(keys[SDLK_DOWN])
    		{
    			iTestPosY+=10;
    			SDL_FillRect(screen,0,SDL_MapRGB(screen->format,0,0,0));
    			b.draw(iTestPosX,iTestPosY);
    		}
    		if(keys[SDLK_RIGHT])
    		{
    			iTestPosX+=10;
    			SDL_FillRect(screen,0,SDL_MapRGB(screen->format,0,0,0));
    			b.draw(iTestPosX,iTestPosY);
    			if(a.collide(a,b)==true)
    			{
    			}
    			else
    			{
    				b.draw(iTestPosX,iTestPosY);
    			}
    		}
    		if(keys[SDLK_LEFT])
    		{
    			iTestPosX-=10;
    			SDL_FillRect(screen,0,SDL_MapRGB(screen->format,0,0,0));
    			b.draw(iTestPosX,iTestPosY);
    			if(a.collide(a,b)==true)
    			{
    			}
    			else
    			{
    				b.draw(iTestPosX,iTestPosY);
    			}
    		}
    		a.draw(100,20);
    		SDL_Flip(screen);
    	}
    	/*Game Loop ends here*/
    	atexit(SDL_Quit);
    	return 0;
    }
    

    so langer code kurzer sinn, 2 bilder werden auf den bildschirm gemalt, eins links oben und das zweite rechts unten ein stücken entfernt. man kann das zweite mit den pfeiltasten bewegen. ich hab mal die kollisionsabfrage nur bei tastendruck nach rechts und links gemacht. jedoch stoppt die bewegung wenn das zweite bild zwicshen das erste kommt nicht sondern geht weiter. das heisst imho, dass die funktion collide immer true zurück gibt. wieso weiss ich jedoch nicht. am besten ist es ihr macht zu hause copy &paste und probiert das ganze. macht ne bitmap mit dem namen test.bmp dann klappt das.

    mfg travisg



  • Warum sollten wir das testen, das hast du doch schon gemacht. Ergebnis war übrigens das collide wohl immer true zurück gibt. Nur so zur Erinnerung.

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    Warum sollten wir das testen, das hast du doch schon gemacht. Ergebnis war übrigens das collide wohl immer true zurück gibt. Nur so zur Erinnerung.

    Bye, TGGC (Das Jahr des Helden)

    wenn dir einer meldet dass seine grafikkarte nicht mehr funktioniert, startest du den pc eventuell zu sehen wieso.



  • Ok, ich denke du solltest dir eine neue CPU kaufen, das könnte den Fehler beheben.

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    Ok, ich denke du solltest dir eine neue CPU kaufen, das könnte den Fehler beheben.

    Bye, TGGC (Das Jahr des Helden)

    metaphern verstehen gehört auch zu den fähigkeiten eines menschen mit "etwas grips".

    dankeschön für meine bestätigung 😉



  • Hi,

    Habe deinen code nicht ausprobiert. So wie ich das sehe weist du den Element-Variablen m_posX und m_posY der Klasse SDL_Physics abgesehen vom Konstruktor an keiner Stelle einen Wert zu.
    In SDL_Physics::collide wird also immer (0 > 0) mit false ausgewertet und true zurückgegeben -> keine Kollision!



  • Ich sags ja, deinen Code will keiner ausführen. Aber du hast ihn schon auf der Platte da und brauchst nur noch durchsteppen. Aber nein du bist faul und heulst lieber hier rum.

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    Ich sags ja, deinen Code will keiner ausführen. Aber du hast ihn schon auf der Platte da und brauchst nur noch durchsteppen. Aber nein du bist faul und heulst lieber hier rum.

    Bye, TGGC (Das Jahr des Helden)

    nö aber da ich den debugger nie benutze weiss ich nicht wie er funktioniert und ich komm hier nicht weiter egal wie oft ich den code durchgehe.



  • Dann find raus wie er funktioniert.
    Falls du das VisualStudio hast:
    F10 eine Zeile weiter springen
    F11 in die aktuelle Funktion rein springen
    F5 laufen lassen
    rechtsklick auf Variable: addWatch/Quickwatch um den Inhalt von Variablen einzusehen
    F9 Breakpoint setzen (beim drücken von F5 hält er dann an dieser Stelle)



  • TravisG schrieb:

    TGGC schrieb:

    Ich sags ja, deinen Code will keiner ausführen. Aber du hast ihn schon auf der Platte da und brauchst nur noch durchsteppen. Aber nein du bist faul und heulst lieber hier rum.

    Bye, TGGC (Das Jahr des Helden)

    nö aber da ich den debugger nie benutze weiss ich nicht wie er funktioniert und ich komm hier nicht weiter egal wie oft ich den code durchgehe.

    Eben doch. Erste Fauheit: zu faul den Debugger anzuwerfen. Ziemlich arrogant von dir zu erwarten, das wir die einfachsten Sachen für dich erledigen und dann noch kostenlos.

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    TravisG schrieb:

    TGGC schrieb:

    Ich sags ja, deinen Code will keiner ausführen. Aber du hast ihn schon auf der Platte da und brauchst nur noch durchsteppen. Aber nein du bist faul und heulst lieber hier rum.

    Bye, TGGC (Das Jahr des Helden)

    nö aber da ich den debugger nie benutze weiss ich nicht wie er funktioniert und ich komm hier nicht weiter egal wie oft ich den code durchgehe.

    Eben doch. Erste Fauheit: zu faul den Debugger anzuwerfen. Ziemlich arrogant von dir zu erwarten, das wir die einfachsten Sachen für dich erledigen und dann noch kostenlos.

    Bye, TGGC (Das Jahr des Helden)

    anscheinend hast du den sinn eines forums noch nicht verstanden. es geht nicht ausschließllich ums diskutieren.
    btw:
    www.dassdas.de

    soviel zu deiner "kampagne" gegen die dummheit



  • anscheinend hast du den sinn eines forums noch nicht verstanden. es geht nicht ausschließllich ums diskutieren. es geht um die Grossschreibung.

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    anscheinend hast du den sinn eines forums noch nicht verstanden. es geht nicht ausschließllich ums diskutieren. es geht um die Grossschreibung.

    Bye, TGGC (Das Jahr des Helden)

    ich bin ja einiges von dir gewohnt aber der war mal sehr, sehr schlecht, sry.



  • Du Drops machst 10mal mehr Fehler als ich. Gibst dir nichtmal Mühe leserlich zu schreiben, weil du zu faul bist Shift zu drücken. Denk mal ein bisschen nach, wer will hier eigentlich was von wem? Und wenn du halt meinst das müsste so sein, dann hast du halt gelitten. Der Sinn des Forums ist jedensfalls nicht irgendwelchen Heulbojen, die zu faul zum Fingerkrümmen sind, alles in den Hintern zu blasen und als Dank sich noch beschimpfen zu lassen.

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    Du Drops machst 10mal mehr Fehler als ich. Gibst dir nichtmal Mühe leserlich zu schreiben, weil du zu faul bist Shift zu drücken. Denk mal ein bisschen nach, wer will hier eigentlich was von wem? Und wenn du halt meinst das müsste so sein, dann hast du halt gelitten. Der Sinn des Forums ist jedensfalls nicht irgendwelchen Heulbojen, die zu faul zum Fingerkrümmen sind, alles in den Hintern zu blasen und als Dank sich noch beschimpfen zu lassen.

    Bye, TGGC (Das Jahr des Helden)

    also von dir will ich nichts, auf deine ratschläge kann ich verzichten. btw: während kleinschreibung im internet weit verbreitet ist, ist es "das dass" fehlschreibung nicht so sehr. ich bin übrigens keine heulboje, eher du, denk mal drüber nach. ich beschimpfe übrigens keinen hier im forum, bis auf dich eben. du hast es im gegensatz zu den anderen auch verdient. klugscheisser und besserwisser, die sich für lustig halten(wie du) gibt es viel zu viel.



  • Man kann auch Debuggen, ohne einen Debugger zu benutzen -> einfach mit cout oder printf die Werte, die geprüft/verglichen/errechnet werden, ausgeben lassen und gucken, ob die ihre Richtigkeit haben -> fertig.



  • Da muss ich TGGC zustimmen. Willst du, dass wir in Zukunft jeden Fehler von dir debuggen? Lern debuggen.



  • Oh mann, Travis!
    Hast du es immer noch nicht begriffen? Du kannst froh sein, das Leute den du in zehn Jahren nicht das Wasser reichen kannst überhaupt deinen Threadtitel aus dem Winkel ihres Hühnerauges wahrnehmen. Wir sind hier nur da aus Spass am Helfen, mehr gibts hier nämlich nicht zu holen. Wenn du dann gleich, weil du mal nicht bekommst was du wolltest, die Nummer abziehst, die du mal im Kindergarten gelernt hast, dann kommt das wirklich nicht gut. Entweder du änderst deine Einstellung und fängst an selbstständig zu Denken und Arbeiten, oder du kannst gleich verschwinden und mit dem Programmieren aufhören.

    Bye, TGGC (Das Jahr des Helden)



  • TravisG schrieb:

    also von dir will ich nichts, auf deine ratschläge kann ich verzichten.

    Gut, dann wirds dir auch nicht gefallen, dass ich TGGC ausnahmsweise absolut recht geben muss. - Und ich hab sonst mit ihm nichts am Hut...

    TravisG schrieb:

    btw: während kleinschreibung im internet weit verbreitet ist, [...]

    Jepp. Und in China ist es weit verbreitet Hunde zu essen. Alles nur ne Deklarationssache, n'est pas?

    TravisG schrieb:

    klugscheisser und besserwisser, die sich für lustig halten(wie du) gibt es viel zu viel.

    Konnte nicht einen Witz entdecken. Und im aktuell vorliegenden Fall solltest du dich vielleicht nicht über Besserwisserei beklagen sonder dafür sorgen, deine Defizite aufzuholen.



  • TGGC schrieb:

    Oh mann, Travis!
    Hast du es immer noch nicht begriffen? Du kannst froh sein, das Leute den du in zehn Jahren nicht das Wasser reichen kannst überhaupt deinen Threadtitel aus dem Winkel ihres Hühnerauges wahrnehmen. Wir sind hier nur da aus Spass am Helfen, mehr gibts hier nämlich nicht zu holen. Wenn du dann gleich, weil du mal nicht bekommst was du wolltest, die Nummer abziehst, die du mal im Kindergarten gelernt hast, dann kommt das wirklich nicht gut. Entweder du änderst deine Einstellung und fängst an selbstständig zu Denken und Arbeiten, oder du kannst gleich verschwinden und mit dem Programmieren aufhören.

    Oh Mann. TGGC hat wieder 'nen Aufsatz ins Netz gestellt... 😉


Anmelden zum Antworten