Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Kollisionserkennung an drehbaren sprites (Allegro)

Hallo

ich beschäftige mich noch nicht sehr lange mit c++ ( ca 2 Jahre).
zurzeit versuche ich mit einem freund ein 2D spiel zu programmieren
Dabei habe ich folgendes problem:

Ich habe ein BITMAP 50*75 pixel in welchem ein Laserschwert ist.
nun soll ein anderer schuss mit diesem laserschwert kolidieren.
Dafür benutze ich folgenden code:


int Collision(BITMAP *bitmap1, int coorx_1, int coory_1, BITMAP *bitmap2, int coorx_2, int coory_2)
{

   int rect1_x, rect1_y; /* the coordinates of the rectangle of    */
   int rect2_x, rect2_y; /* overlap of the bitmaps' bounding boxes */

   int i, j, k, l;

   int mask1, mask2;

   /* We start by checking if the bitmaps' bounding boxes overlap. */
   /* In x: */
   if (coorx_1 + bitmap1->w <= coorx_2 || coorx_1 >= coorx_2 + bitmap2->w)
      return 0;
   /* In y: */
   if (coory_1 + bitmap1->h <= coory_2 || coory_1 >= coory_2 + bitmap2->h)
      return 0;

   /* Right, now that we know the bounding boxes overlap,
    * we need to determine the four corners of the overlap area.
    */

   /* We'll handle the x-coordinates first... */
   if (coorx_1 < coorx_2) {
      rect1_x = coorx_2;
      if (coorx_1 + bitmap1->w >= coorx_2 + bitmap2->w)
         rect2_x = coorx_2 + bitmap2->w;
      else
         rect2_x = coorx_1 + bitmap1->w;
   }
   else {
      rect1_x = coorx_1;
      if (coorx_2 + bitmap2->w >= coorx_1 + bitmap1->w)
         rect2_x = coorx_1 + bitmap1->w;
      else
         rect2_x = coorx_2 + bitmap2->w;
   }

   /* ...and now the y-coordinates. */
   if (coory_1 < coory_2) {
      rect1_y = coory_2;
      if (coory_1 + bitmap1->h >= coory_2 + bitmap2->h)
         rect2_y = coory_2 + bitmap2->h;
      else
         rect2_y = coory_1 + bitmap1->h;
   }
   else {
      rect1_y = coory_1;
      if (coory_2 + bitmap2->h > coory_1 + bitmap1->h)
         rect2_y = coory_1 + bitmap1->h;
      else
         rect2_y = coory_2 + bitmap2->h;
   }

   mask1 = bitmap_mask_color(bitmap1);
   mask2 = bitmap_mask_color(bitmap2);

   for (i = rect1_x - coorx_1, j = rect1_x - coorx_2; i < rect2_x - coorx_1; i++, j++) {
      for (k = rect1_y - coory_1, l = rect1_y - coory_2; k < rect2_y - coory_1; k++, l++) {
         if (getpixel(bitmap1, i, k) != mask1 && getpixel(bitmap2, j, l) != mask2)
            return 1;
      }
   }

   return 0;
}

Dieser Code funktioniert zwar einwandfrei, bezieht sich aber immer auf die Original Bitmaps und nicht auf die Nachträglich geänderten.Wie kann ich dieses problem lösen?

PS hir meine einbindung des codes:

rotate_sprite(bmplaser,g_Yoda.Laser_normal,0,0 ,g_Yoda.winkel);

....

if(Collision(g_Yoda.Laser_normal,512-25,384-37,schuss1.sprite,x-schuss1.x,y-schuss1.y) == 1)
     {
           ....
     }

Hoffentlich könnt ihr mir helfen :-\

Gruß Nick


Antworten zu Kollisionserkennung an drehbaren sprites (Allegro):

Ich wuerde dir gerne helfen, aber ich versteh es noch nicht ganz.

Bitte erklaer mir was bitmap1 und bitmap 2 sind, ist bild 1 jetzt ein bild von einem Schuss?, oder das Gesammte bild am bildschirm?, ist bild 2 das laserschwert?

Aber ich kann dir sagen dass du bei der zeile

if(Collision(g_Yoda.Laser_normal,512-25,384-37,schuss1.sprite,x-schuss1.x,y-schuss1.y) == 1)
kein == 1 brauchst, da alles was != 0 ist, WAHR ist^^

bitmap 1 und bitmap 2 sind ja nur die parameter übergeben werden ja
g_Yoda.Laser_normal für bitmap 1 und schuss1.sprite für bitmap 2.


 

Nun ich glaube ich verstehe es:

Ich glaube dass deine 2 Bitmaps nur gezeichnet werden, auf einen andern Buffer am Bildschirm, oder eben Doppelgebuffert in eine andere Bitmap.

Somit, auch wenn du ueber das Laserschwert oder so drueber zeichnest, aendert sich die Bitmap des Laserschwertes nicht, somit muesstest du den angezeigten Buffer, als Parameter mitgeben (oder eben den Doppelbuffer), und auf dem vergleichen.

Das mit dem buffer habe ich schon versucht, doch dan findet eine kollision statt wenn der Laserschuss in den bereich der bmplaser bitmap kommt und nicht erst, wenn der schuss das laserschwert trifft

Gut, das kann ich glaube ich aufloesen:
Moeglicherweise verwendest du jpg Bilder, die keine Transparenz anzeigen koennen.

Loesung: mach dir gif-bilder, die du auf die Bitmap zeichnest, somit wir die Farbe des Hintergrundes nicht ueberschrieben, sondern nur das Laserschwert draufgezeichnet und du kannst vergleichen.

Wenn es schon gif bilder sind... muss ich noch mal darueber nachgruebeln.

mfg.

P.S. villeicht sind es gif bilder, und dort wo das Laserschwert nicht ist, ist es weiß, statt transparent

ich verwende pcx bilder, aber mit maske . Also wird immer
eine bestimmte farbe als durchsichtig gesehen(in meinem falle Pink)

Mh... da ich ganz ehrlich gesagt nicht mal weis was pcx bilder sind, kann ich dir nur sagen: "Check doch mal die Hex-Werte der Farben ab, villeicht hast du da einen Fehler gemacht, oder sie aendern sich wenn du sie bufferst... "


« cmd.exe was kann man damit machen?Wie werden eigentlich die aktuellen 3d Spiele gemacht? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Bitmap
Eine Bitmap oder auch Windows Bitmap ("BMP") ist die direkte Abbildung einer Pixelgrafik im Arbeitsspeicher der Grafikkarte oder auf dem Monitor. In einer Bitmap werden a...

Bitmap Grafik
Bei dem Begriff Bitmap Grafik handelt es sich um eine punkt-, beziehungsweise pixelweise Form der Speicherung von Bildern und Grafiken. Bei schwarz-weiß Grafiken be...

Bitmap Format
Das Windows-Bitmapformat ist das Standard - Grafikformat, auch Rastergrafik genannt, von Windows Microsoft. In dem Bitmapformat existiert auch das Startlogo von Windows, ...