Forum: c++ SDL kollitionshanterare, hjälp mig

Forum huvudsida -> Programmering -> c++ SDL kollitionshanterare, hjälp mig

Sidor: 1

Till botten

seal 04:53 - 25:e November 2007 | Post #1
Medlem
Inlägg: 32


Skicka PM
Tjenare.

Håller på att lära mig c++ och SDL, men nu har jag fastnat med min kollitionshanterare.

Såhär ser den ut:
  1. int checkCollitionObjects()
  2. {
  3. //denna kollar ifall man kolliderar med ett objekt..
  4.  
  5. int intObjX, intObjY, intObjW, intObjH;
  6.  
  7. intObjX = intWall1X;
  8. intObjY = intWall1Y;
  9.  
  10. intObjW = imgWall->w;
  11. intObjH = imgWall->h;
  12. // ____
  13.  
  14. // X axeln _
  15.  
  16. // -> | O |
  17.  
  18. if ( (intPlayerX + imgChar->w ) >= (intObjX )
  19. &&
  20. (intPlayerX + imgChar->w ) <= (intObjX + intObjW )
  21. &&
  22. (intPlayerY + imgChar->h ) >= (intObjY)
  23. &&
  24. (intPlayerY) <= (intObjY + intObjH)
  25. &&
  26. (((intPlayerY - intPlayerSpeed) - 1) + imgChar->h) >= (intObjY )
  27. &&
  28. ((intPlayerY + intPlayerSpeed) + 1 ) <= (intObjY + intObjH)
  29. )
  30. intPlayerX = (intObjX - imgChar->w);
  31.  
  32. // | O | <-
  33. if ( intPlayerX <= ( intObjX + intObjW )
  34. &&
  35. intPlayerX >= ( intObjX)
  36. &&
  37. (intPlayerY + imgChar->h ) >= (intObjY)
  38. &&
  39. (intPlayerY) <= (intObjY + intObjH)
  40. &&
  41. (((intPlayerY - intPlayerSpeed) - 1) + imgChar->h) >= (intObjY )
  42. &&
  43. ((intPlayerY + intPlayerSpeed) + 1 ) <= (intObjY + intObjH)
  44. )
  45.  
  46. intPlayerX = intObjX + intObjW;
  47.  
  48. }


Alla variablar är väl ganska självförklarande men är det något ni funderar över så skriv.

Alltså, om man kolliderar i ett objekt så ska det ta stopp.

Edit;
Kanske ska skriva vad som är fel ocksåSmiley .

Jo när jag förflyttar mitt objekt till höger och vänster sida om "väggen" så fungerar det fint. Min gubbe stannar upp.
Felet är när jag går emot över och undersidan, då hamnar gubben på höger eller vänstersidan av objektet.


Senast redigerad 05:06 - 25:e November 2007


FunkyChicken 13:00 - 25:e November 2007 | Post #2
Nyhetsredaktör
Inlägg: 800


Skicka PM
Ja, det är väl inte så konstigt? Du har ju bara

intPlayerX = (intObjX - imgChar->w);

och

intPlayerX = intObjX + intObjW;

Såklart flyttar sig inte player i Y-led om du inte ändrar på Y-variabeln... Det framgår ju tom av kommentarerna att detta bara gäller X-axeln?

För övrigt har du äckligt mycket paranteser i din kodSmiley




seal 13:21 - 25:e November 2007 | Post #3
Medlem
Inlägg: 32


Skicka PM
Jo, jag vet, men jag vet inte hur jag ska utforma en ifsats där jag kollar just Y axeln.

Ja, jag har många paranteser, jag tycker det blir lättare att läsa såSmiley .




FunkyChicken 13:35 - 25:e November 2007 | Post #4
Nyhetsredaktör
Inlägg: 800


Skicka PM
Det är väl i princip bara att byta ut alla x mot y och w mot h...




seal 14:05 - 25:e November 2007 | Post #5
Medlem
Inlägg: 32


Skicka PM
    Citat av FunkyChicken:
Det är väl i princip bara att byta ut alla x mot y och w mot h...


Jag har gjrt om lite, inte gjort klart det än då jag har ännu mer funderingar. Såhär ser koden ut just nu:

  1. int intObjW, intObjH;
  2.  
  3. //intObjX = intObjX//intWall1X;
  4. //intObjY = intObjY//intWall1Y;
  5.  
  6. intObjW = object->w;//imgWall->w;
  7. intObjH = object->h;//imgWall->h;
  8.  
  9. int intLeftA, intBottomA, intTopA, intRightA; // spelaren
  10. int intRightB, intBottomB, intTopB, intLeftB; // objektet
  11.  
  12. intLeftA = intPlayerX; //spelarent X axel
  13. intRightA = intPlayerX + imgChar->w; //spelarent högra X axel
  14. intTopA = intPlayerY; //spelarent Y axel
  15. intBottomA = intPlayerY + imgChar->h; //spelarent undre Y axel
  16.  
  17. intLeftB = intObjX; //objektets X axel
  18. intRightB = intObjX + object->w; //objektets högra X axel
  19. intTopB = intObjY; //objektets Y axel
  20. intBottomB = intObjY + object->h; //objektets undre Y axel
  21.  
  22.  
  23. // Y axlen
  24.  
  25. //ovansidan
  26. if ( intBottomA >= intTopB
  27. &&
  28. intBottomA <= intBottomB
  29. &&
  30. intLeftA <= intRightB
  31. &&
  32. intRightA >= intLeftB
  33. )
  34. {
  35. intPlayerY = intTopB - imgChar->h; // intBottomA;
  36. }
  37.  
  38. //undersidan
  39. if ( intTopA <= intBottomB
  40. &&
  41. intTopA >= intTopB
  42. &&
  43. intLeftA <= intRightB
  44. &&
  45. intRightA >= intLeftB
  46. )
  47. {
  48. intPlayerY = intBottomB;
  49. }
  50.  
  51. //högersidan
  52. if ( intLeftA <= intRightB
  53. &&
  54. intRightA >= intLeftB
  55. &&
  56. intBottomA >= intTopB
  57. &&
  58. intTopA <= intBottomB
  59. )
  60. {
  61. intPlayerX = intRightB;
  62. }


Nu gjorde jag under och ovansidan komplett först innan jag skulle testa vänster och högersidan.

Felet här (vilket jag förstår varför) är att går jag emot under eller översidan skickas jag till högersidan av objektet.

Detta är ju pga att if satsen för högensidan stämmer ju.

Några tips om hur jag kan fortsätta?



EDIT;
Jag har gjort om lite och kollar nu istället ifall man är utanför alla objekt och isf returnerar jag true.
Ifall jag är innanför returnerar jag false och x och y kordinaterna för spelaren uppdateras inte.

Såhär ser koden ut:

  1. bool checkCollisionObject(SDL_Surface* object, int intObjX, int intObjY, int tmpX, int tmpY)
  2. {
  3.  
  4. int leftA, leftB;
  5. int rightA, rightB;
  6. int topA, topB;
  7. int bottomA, bottomB;
  8.  
  9. //kalkylerar sidorna av bildobjektet.
  10. leftA = intObjX;
  11. rightA = (intObjX + object->w);
  12. topA = intObjYd;
  13. bottomA = (intObjY + object->h);
  14.  
  15. //karaktären
  16. leftB = tmpX;
  17. rightB = tmpX + imgChar->w;
  18. topB = tmpY;
  19. bottomB = tmpY + imgChar->h;
  20.  
  21.  
  22. //If any of the sides from A are outside of B
  23. if( bottomA <= topB ) {
  24. return false;
  25. }
  26. if( topA >= bottomB ) {
  27. return false;
  28. }
  29. if( rightA <= leftB )
  30. {
  31. return false;
  32. }
  33. if( leftA >= rightB ) {
  34. return false;
  35. }
  36.  
  37.  
  38. return true;
  39. }


Allt fungerar tipptop, F-RUTOM att jag har en variabel med värdet för spelarens hastighet.
Ifall denne är 10 så hoppar alltså karaktären 10 "steg" per knapptryckning.
Problemet är att med detta så hamnar jag 10 "hopp" ifrån objektet.

Hur kan jag lösa detta? Några förslag?Smiley


Senast redigerad 15:58 - 25:e November 2007


Sidor: 1

Forum huvudsida -> Programmering -> c++ SDL kollitionshanterare, hjälp mig
Atom feed

Du får inte posta i den här tråden | Till toppen