Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
void CPlayer::CheckCollision() { for (vector<CSprite*>::iterator i = Walls.begin(); i != Walls.end(); i++) { PTop = pPlayer->GetRect().y; PBottom = pPlayer->GetRect().y + pPlayer->GetRect().h; PLeft = pPlayer->GetRect().x; PRight = pPlayer->GetRect().x + pPlayer->GetRect().w; OTop = (*i)->GetRect().y; OBottom = (*i)->GetRect().y + (*i)->GetRect().h; OLeft = (*i)->GetRect().x; ORight = (*i)->GetRect().x + (*i)->GetRect().w; if (SDL_HasIntersection(&pPlayer->GetRect(), &(*i)->GetRect()) == true) { if (PTop <= OBottom && PBottom >= OBottom ) { Differenz = OBottom - PTop; MoveY = MoveY + Differenz; } if (PBottom >= OTop && PTop <= OTop ) { Differenz = PBottom - OTop; MoveY = MoveY - Differenz; } if (PLeft <= ORight && PRight >= ORight) { Differenz = ORight - PLeft; MoveX = MoveX + Differenz; } if (PRight >= OLeft && PLeft <= OLeft) { Differenz = PRight - OLeft; MoveX = MoveX - Differenz; } cout << Differenz << endl; } } } |
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
PTop = 0; PBottom = 0 + 32; PLeft = 0; PRight = 0 + 32; OTop = 0; OBottom = 0 + 32; OLeft = 16; ORight = 16 + 32; if (PTop <= OBottom && PBottom >= OBottom ) // 0 <= 32 && 32 >= 32 { //wird ausgeführt Differenz = 32 - 0; MoveY = MoveY + 32; //wobei ich mich hier gerade eh frage woher moveX und moveY kommen bzw. was die für Werte haben } if (PBottom >= OTop && PTop <= OTop ) //32 >= 0 && 0 <= 0 ==> wird ausgeführt { //wird ausgeführt } if (PLeft <= ORight && PRight >= ORight) // 0 <= 48 && 32 >= 48 { //wird nicht ausgeführt } if (PRight >= OLeft && PLeft <= OLeft) //32 >= 16 && 0 <= 16 { //wird ausgeführt } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Lares« (02.10.2014, 14:55)
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 |
void CPlayer::TrackPlayer() { OldRect.x = pPlayer->GetRenderRect().x; OldRect.y = pPlayer->GetRenderRect().y; } |
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
void CPlayer::CheckCollision() { for (vector<CSprite*>::iterator i = Walls.begin(); i != Walls.end(); i++) { PTop = pPlayer->GetRenderRect().y; PBottom = pPlayer->GetRenderRect().y + pPlayer->GetRenderRect().h; PLeft = pPlayer->GetRenderRect().x; PRight = pPlayer->GetRenderRect().x + pPlayer->GetRenderRect().w; OTop = (*i)->GetRenderRect().y; OBottom = (*i)->GetRenderRect().y + (*i)->GetRenderRect().h; OLeft = (*i)->GetRenderRect().x; ORight = (*i)->GetRenderRect().x + (*i)->GetRenderRect().w; if (isColliding() == true) //Funktion weiter unten { if (OldRect.x == pPlayer->GetRenderRect().x) //Falls es kein unterschied zwischen der alten & neuen X-Position gibt, muss der Spieler von Oben oder Unten kommen. { if (PTop <= OBottom && PBottom >= OBottom) { Differenz = OBottom - PTop; MoveY = MoveY + Differenz; } if (PBottom >= OTop && PTop <= OTop) { Differenz = PBottom - OTop; MoveY = MoveY - Differenz; cout << Differenz << endl; } } else if (OldRect.y == pPlayer->GetRenderRect().y)//Falls es kein unterschied zwischen der alten & neuen Y-Position gibt, muss der Spieler von Links oder rechts kommen. { if (PLeft <= ORight && PRight >= ORight) { Differenz = ORight - PLeft; MoveX = MoveX + Differenz; } if (PRight >= OLeft && PLeft <= OLeft) { Differenz = PRight - OLeft; MoveX = MoveX - Differenz; cout << Differenz << endl; } } } } } bool CPlayer::isColliding()//Prüft ob im Umkehrschluss ob sich die Achsen überlappen. { if (PBottom <= OTop) { return false; } else if (PTop >= OBottom) { return false; } else if (PRight <= OLeft) { return false; } else if (PLeft >= ORight) { return false; } return true; } |
![]() |
C-/C++-Quelltext |
1 2 3 4 |
if (MoveUp) { MoveY -= 500.0f * Timer->GetElapsed();//gibt einen Zeitwert des letzen Frames in Sek wieder Z.b. 0,0015 } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Urprimat« (07.10.2014, 20:15)
Zitat
Dann hast du sowohl die Gewissheit, dass die Kollisionsprüfung stimmt (da das ja eine bereitgestellte Funktion der SDL ist) als auch die Fallunterscheidung. Wobei beim ich beim Letzteren anhand deines Codebeispiel davon ausgehe, dass sich die Figur pro Frame wirklich nur in einer Achse bewegt. Sobald du ein komplexeres Spiel hast könnte diese Annahme problematisch werden.
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if (SDL_HasIntersection(&pPlayer->GetRect(), &(*i)->GetRect())) //Funktion weiter unten { if (OldRect.x == pPlayer->GetRenderRect().x) //Falls es kein unterschied zwischen der alten & neuen X-Position gibt, muss der Spieler von Oben oder Unten kommen. { // ... } else if (OldRect.y == pPlayer->GetRenderRect().y)//Falls es kein unterschied zwischen der alten & neuen Y-Position gibt, muss der Spieler von Links oder rechts kommen. { // ... } } |
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if (SDL_HasIntersection(&pPlayer->GetRect(), &(*i)->GetRect())) //Funktion weiter unten { if (OldRect.x == pPlayer->GetRenderRect().x) //Falls es kein unterschied zwischen der alten & neuen X-Position gibt, muss der Spieler von Oben oder Unten kommen. { // ... } else if (OldRect.y == pPlayer->GetRenderRect().y)//Falls es kein unterschied zwischen der alten & neuen Y-Position gibt, muss der Spieler von Links oder rechts kommen. { // ... } } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Urprimat« (09.10.2014, 14:25)
Werbeanzeige