[c++]2d Kollision

The Vision

Grünschnabel
hi@all
hab mal ne frage:

ich will grad so ein super mario game machen....hab jetzt schon mal meiner figur laufen und springen^^ beigebracht nur jezt hab ich ein Problem mit der Kollision....ich hab keine anhung wie man des macht:confused::confused:. Also ich wollt mal wissen wie des geht wenn man eine Objekt jetzt zwischen meiner figur und dem weg hinsetzt...und jetzt will ich dass ich nicht an der Kiste vorbeilaufen kann, sondern drauf und drüberspringen muss. Durch die Gravitation , die im spiel eingebaut hab glaub wirds noch schwerer für mich . Wär nett wenn mir jm. ein c++ code zur veranschaulichung zeigen kann......
 
Ähm nur eine kurze Nebenfrage, wie hast schreibst du denn das Spiel in C++? Also wie realisiert du das grafisch? =)
Gibt es da eine bestimmte Klasse dazu oder wie macht man das?
 
@dr.hastig hab ich schon probiert aber wenn die gravitation drin ist dann fliegt er immer in die kiste oder indas objekt rein.

@der andere über mir: ja mit c++ und auch mit klassen z.b. einer player klasse die die bewegungen der Figur regelt und einer sprite klasse,die die effekte macht.
 
Zuletzt bearbeitet:
Wenn du die Randkoordianten des Objektes mit denen des Spielerobjektes vergleichst dürfte der eigentlich nicht rein fliegen.

Code Beipsiele wie du die Spielobjekte und die Kollisionsabfrage bis jetzt realisiert hast könnten auch praktisch sein.
 
hier is der code....
Code:
#include "player.h"

void player::Init()
{
	
	m_pSpriteShot = new sprite;
	m_pSpriteShot->Load("Data/schuss.bmp");
	m_pSpriteShot->SetColorKey(255, 255, 255);
	m_pSpritePlayer = new sprite;
	m_pSpritePlayer->Load("Data/lülülü.bmp");
	m_pSpritePlayer->SetColorKey(255, 255, 255);
	m_pSpriteKiste = new sprite;
	m_pSpriteKiste->Load("Data/non.bmp");
	m_pSpriteKiste->SetColorKey(255, 0, 255);
	SpawnAsteroids();
	
	cout << "\nInit Player ging\n";
	Yposi = 500;
	anzahlschuesse = 0;
	jumping = false;
	jumplock = true;
	shotlock = false;


}



void player::processmoving ()
{
	if (g_pVerwaltung->KeyDown (SDLK_RIGHT))
	{
		Xposi += 200.0f * g_pTimer->GetElapsed ();
	}
	if (g_pVerwaltung->KeyDown (SDLK_LEFT))
	{
		Xposi -= 200.0f * g_pTimer->GetElapsed ();
	}
	if(g_pVerwaltung->KeyDown (SDLK_DOWN) && g_pVerwaltung->KeyDown (SDLK_RIGHT))
	{
		Xposi += 400.0f *g_pTimer->GetElapsed ();
	}
	if(g_pVerwaltung->KeyDown (SDLK_DOWN) && g_pVerwaltung->KeyDown (SDLK_LEFT))
	{
		Xposi -= 400.0f *g_pTimer->GetElapsed ();
	}
	if(jumplock == true)
	{
	if(g_pVerwaltung->KeyDown (SDLK_SPACE))
	{
		
		
		Gravitation = 9.81f;
		Vertikal = 1.0f;
		h = 50.0f;
		jumping = true;
		jumplock = false;

	}
	}
	Yposi += 9.81f;
	

	if (Yposi >= 500)
		Yposi = 500;

	
}
void player::Render()
{
	m_pSpritePlayer->SetPosi(Xposi, Yposi);
	m_pSpritePlayer->Render();
	cout<< "Render ging";

	list<shot>::iterator it = m_Shotlist.begin();

	while (it != m_Shotlist.end ())
	{
		it->update();

		if (it->IsAlive())
		{
			it->Render();
			it++;
		}
		else
		{
			it = m_Shotlist.erase (it);
			anzahlschuesse--;
		}
	}
	
}
void player::jump()
{
	if (jumping == true)
	{
	
		


			h -= Vertikal + Gravitation * g_pTimer->GetElapsed();
			Yposi -= h + Gravitation * g_pTimer->GetElapsed();
			Xposi ++;

		if ( h <= -40)
		{
			//Yposi = 500;
			jumping = false;
			jumplock = true;
		}
	
	}
}

void player::proccessshoting()
{
	if(anzahlschuesse < 3)
	{
	if(g_pVerwaltung->KeyDown(SDLK_DOWN) && shotlock == false)
	{
		shot shoot;
		
		shoot.Init(m_pSpriteShot , Xposi + 120 , Yposi + 41);

		m_Shotlist.push_back(shoot);
		anzahlschuesse++;

		shotlock = true;
	}

	if (g_pVerwaltung->KeyDown(SDLK_DOWN) == false)
		shotlock = false;

}
}

void player::SpawnAsteroids ()
{
 
    KistenundAnderes Kiste;


    int XPos = 500; //rand()%736;

    
    Kiste.Init (m_pSpriteKiste, static_cast<float>(XPos), 400.0f);

    m_KistenList.push_back (Kiste);

  
} 
void player::CheckCollisions ()
{
  
  list<KistenundAnderes>::iterator ItKiste = m_KistenList.begin ();
  

  SDL_Rect Kiste;
  SDL_Rect Player;

 
		Kiste = m_pSpriteKiste->GetRect();
		Player = m_pSpritePlayer->GetRect ();
      if (Player.x > Kiste.x - Player.w/2 && Player.y - Player.h > Kiste.y - Kiste.h && Player.x < Kiste.x + Player.w - 10) //&& RectShot.y > RectAsteroid.h)
	  {  
		  Xposi = Kiste.x - Player.w/2;
		  

		cout << "Check Collision";
	  }
	if (Player.x < Kiste.x + Kiste.w && Player.y - Player.h > Kiste.y - Kiste.h && Player.x > Kiste.x + Player.w) //&& RectShot.y > RectAsteroid.h)
	  {  
		  Xposi = Kiste.x + Kiste.w;
		  

		cout << "Check Collision";
	  }
	if (Player.x > Kiste.x - Player.w/2 && Player.y - Player.h < Kiste.y - Kiste.h && Player.x < Kiste.x + Player.w - 10 && Player.y > Kiste.y - Kiste.h - 10) //&& RectShot.y > RectAsteroid.h)
	  {  
		  Yposi = Kiste.y - Kiste.h/2 - 10 ;
		  

		cout << "Check Collision";
	  }
	
    
}
void player::RenderKiste()
{
	 list<KistenundAnderes>::iterator ItKiste = m_KistenList.begin ();

	 while (ItKiste != m_KistenList.end () )
	 {
		 ItKiste->Render();
		 ItKiste++;
	 }
}
.....so bestimmt is eh alles viel zu kompliziert, so wie ichs mach oder falsch!! ka^^

Thx nochmal für die Antworten
Hab noch ne Frage nebenbei : machen eigentlich solche richtigen SpieleEntwickler ihre spiele mit winapi und ner engine(mit win 32 projekt) oder mit was anderem
 
Zuletzt bearbeitet:
Zurück