Avatar billede mathiash Nybegynder
22. december 2005 - 21:39 Der er 11 kommentarer og
1 løsning

Meget simpel kollisions detektion

Hej!

Jeg er lige gået kold.

Er der ikke en der lige hurtigt kan udfylde den sidste plads i min funktion?

bool tankKoll(int x, int y) {
  double lb1, rb1, lt1, rt1; // Objekt 1: Venstre bund, Højre bund, Venstre top, Højre top
  double lb2, rb2, lt2, rt2; // Objekt 2: Venstre bund, Højre bund, Venstre top, Højre top

  // Objekt 1
  lb1 = tank.getX();
  rb1 = tank.getX()+50;
  lt1 = tank.getY();
  rt1 = tank.getY()+50;

  // Objekt 2
  lb2 = x;
  rb2 = x+50;
  lt2 = y;
  rt2 = y+50;

  // Hvis objekt 1 rammer objekt 2 skal funktionen returnerer true

  return false;
}

Sig lige til hvis i ikke forstår min kode :)

Med venlig hilsen, og god jul!
Mathias Hansen
Avatar billede polle007 Nybegynder
22. december 2005 - 21:45 #1
return lb1 >= lb2 && rb1 <= lb2 && lt1 => lt2 && rt1 <= rt2;
Avatar billede mathiash Nybegynder
22. december 2005 - 21:49 #2
Kan man ikke syntax error : '>' :)
Avatar billede mathiash Nybegynder
22. december 2005 - 21:57 #3
bool tankKoll(int x, int y) {
  int lb1, rb1, lt1, rt1;
  int lb2, rb2, lt2, rt2;

  lb1 = tank.getX();
  rb1 = tank.getX()+50;

  lt1 = tank.getY();
  rt1 = tank.getY()+50;

  lb2 = x;
  rb2 = x+50;

  lt2 = y;
  rt2 = y+50;

  if (lb1 >= lb2 && rb1 <= lb2 && lt1 >= lt2 && rt1 <= rt2) {
    return true;

  } else {

    return false;
  }
}

Returnerer hele tiden false.
Er det mine beregninger der er forkerte?
Avatar billede mathiash Nybegynder
22. december 2005 - 22:05 #4
Her er lige et udprint fra et kald af funktionen hvor objekt1 er over objekt2:
Objekt1:
X: 500
Y: 500

Objekt2:
X: 434
Y: 281

Begge objekter er 50 px x 50 px
Avatar billede mathiash Nybegynder
22. december 2005 - 22:14 #5
Hmm.. Jeg tror jeg har fundet fejlen, det er meget mystisk at Objekt1's x punkt altid er enten 500 eller 450.

Jeg kigger lige på det.
Avatar billede mathiash Nybegynder
22. december 2005 - 22:25 #6
Okay nu virker det fint. :)

Objekt1:
X: 470
Y: 279

Objekt2:
X: 500
Y: 500

Begge objekter er stadig 50 px x 50 px.

Hvorfor virker det ikke?
Har du en idé om hvor fejlen kan ligge?
Avatar billede bertelbrander Novice
22. december 2005 - 22:37 #7
Jeg tror ikke at det er så simpelt.
Man skal nok ud i noget i stil med følgende:
  if(left1 < left2)
  {
    if(right1 > left2)
    {
        if(top1 < top2)
        {
          if(bottom1 > top2)
              return true;
        }
        else
        {
            if(buttom2 > top1)
              return true;
        }
    }
  }
  else
  {
    if(right2 > left1)
    {
        if(top1 < top2)
        {
          if(bottom1 > top2)
              return true;
        }
        else
        {
            if(buttom2 > top1)
              return true;
        }
    }
  }
Jeg har kaldt siderne left, right, top, buttom fordi jeg synes at det er mere logisk (det hedder de når man laver windows programmer)
Avatar billede mathiash Nybegynder
22. december 2005 - 22:54 #8
Nu returnerer den kun true.

Objekt1:
X: 268
Y: 104

Objekt2:
X: 600
Y: 700

int left1 = tank.getX();
int left2 = x;

int top1 = tank.getY();
int top2 = y;

int right1 = tank.getX()+50;
int right2 = x+50;

int bottom1 = tank.getY()+50;
int bottom2 = y+50;
Avatar billede bertelbrander Novice
22. december 2005 - 23:12 #9
Denne skriver False:
#include <iostream>

bool Collition(int x1, int y1, int x2, int y2)
{
  int left1 = x1;
  int right1 = x1 + 50;
  int left2 = x2;
  int right2 = x2 + 50;

  int top1 = y1;
  int bottom1 = y1 + 50;
  int top2 = y2;
  int bottom2 = y2 + 50;

  if(left1 < left2)
  {
      if(right1 > left2)
      {
        if(top1 < top2)
        {
            if(bottom1 > top2)
            {
              std::cout << "true 1" << std::endl;
              return true;
            }
        }
        else
        {
            if(bottom2 > top1)
            {
                std::cout << "true 2" << std::endl;
                return true;
            }
        }
      }
  }
  else
  {
      if(right2 > left1)
      {
        if(top1 < top2)
        {
            if(bottom1 > top2)
            {
              std::cout << "true 3" << std::endl;
              return true;
            }
        }
        else
        {
            if(bottom2 > top1)
            {
                std::cout << "true 4" << std::endl;
                return true;
            }
        }
      }
  }
  std::cout << "False" << std::endl;
  return false;
}


int main()
{
  Collition(268, 104, 600, 700);
}
Avatar billede mathiash Nybegynder
26. december 2005 - 20:47 #10
Det bliver simpelthen ved med at drille, kan muligvis være et andet sted fejlen ligger, har lagt projektet midlertidigt på hylden.

Lægger du et svar?
Avatar billede bertelbrander Novice
27. december 2005 - 00:09 #11
Jeg samler ikke på point.
Avatar billede mathiash Nybegynder
27. december 2005 - 10:10 #12
Nårja, det er bare i orden så.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester