Kollisionserkennung bei rotierten Bitmaps

L

Lucid85

Neues Mitglied
0
hi,

ich mal wieder mit folgender frage :) : wie prüfe ich, ob rotierte bitmaps sich berühren bzw. überschneiden. bitmaps rotierten gaht ja einfach mit canvas.rotate(). aber wie führe ich nun eine kollisionserkennung eines rotierten bitmaps mit einem (rotierten oder nicht rotierten) anderem bitmap durch? brauche das für ein spiel, in dem schräg fliegende objekte andere objekte treffen sollen.

danke schonmal :)
 
So lange deine Objekte ganz einfache Formen haben, geht das noch relativ einfach. Für zwei Rechtecke bietet Android z.B. die intersects-Methode. Damit findest du dann raus, ob sich zwei Rechtecke überschneiden. Sonst brauchst du vermutlich sehr genaue Mathe-Kenntnisse in diesem Bereich, da kann ich dir nicht gross helfen.

Wenn du die Kollisionserkennung also von Hand (ohne irgendeine Library) machen willst, würde ich meine Objekte mit einfachen Formen (vorallem Rechtecke) nachmodellieren. Das Bitmap selber dient dann natürlich weiterhin als Anzeige, aber im Hintergrund wird es nicht zur Berechnung benötigt. Willst du zum Beispiel einen Menschen machen, hast du ein Rechteck für den Körper, eines für jedes Bein und so weiter. Diese hängen dann so aneinander, dass es wie ein Mensch aussieht :smile: Willst du dann zwei Menschen kollidieren lassen, prüfst du einfach von beiden Menschen, ob sich eines ihrer Rechtecke mit einem Rechteck des anderen Menschen schneidet.

Libraries wie libGDX haben normalerweise auch gute Physik-Unterstützung, die einem vieles davon abnehmen oder vereinfachen. Aber ob du so eine Lib verwenden willst oder ob sich das überhaupt lohnt, musst du selber entscheiden :thumbup:
 
Zuletzt bearbeitet:
also ich bilde ein bzw. mehrere Rects für das bitmap. soweit is klar.
aber ich will die dann ja noch rotieren. darum geht es ja..... und sowas wie rect.rotate(degrees) gibt es meines wissens nicht.

die rects sind ja bisher nicht rotiert. sondern nur die canvas, auf der diese gezeichnet werden.

könntest du mir das erklären?

danke :smile:
 
Zuletzt bearbeitet:
Hello,

das geht...

Code:
public void draw(Canvas canvas) {
        rect.left = posX;
        rect.top = posY;
        rect.right = posX + textureWidth;
        rect.bottom = posY + textureHeight;
        keepOnBattlefield();
        checkForCollision();
        canvas.save(); // Anfang Rotation
        canvas.rotate(rotation, getX() + getTextureWidth() / 2, getY() + getTextureHeight() / 2);
        canvas.drawRect(rect, paint);
        canvas.drawBitmap(resizedBitmap, null, rect, paint);
        canvas.restore(); // Ende Rotation
    }
Code:
private void checkForCollision() {
        Sprite player1 = gameView.getSprite(Factory.P1);
        Sprite player2 = gameView.getSprite(Factory.P2);
        Rect player1Rect = player1.getRect();
        Rect player2Rect = player2.getRect();
        if (!player1Rect.intersect(player2Rect)) {
            backupPosPlayer1.x = player1.getX();
            backupPosPlayer1.y = player1.getY();
            backupPosPlayer2.x = player2.getX();
            backupPosPlayer2.y = player2.getY();
        } else {
            stopMovement();
            restoreAllPlayerPosition(player1, player2, backupPosPlayer1,
                    backupPosPlayer2);
        }
    }
Vielleicht hilft dir der Code schon weiter, wenn du noch fragen hast, stehe ich dir gerne zur Verfügung ;)

Noch als kleiner Tipp: Es gibt die Unterscheidung zwischen Radianten und Grad. Klingt dramatischer als es ist. Die Umrechnung erfolgt über eine Konstante - also allem in allem recht simpel, jedenfalls im Vergleich zu OpenGL^^

@Zoopa: was du zu libgdx sagst, sehe ich ähnlich. Für mich scheidet libgdx allerdings von vornherein aus, da es PlayGames nicht im vollen Umfang unterstützt..
Dann beiße ich beim nächsten Projekt lieber noch in den sauren OpenGL-Apfel :p
 
Zuletzt bearbeitet:

Ähnliche Themen

D
Antworten
17
Aufrufe
410
datNeMo
D
M
Antworten
3
Aufrufe
171
moin
M
Y
Antworten
4
Aufrufe
1.227
swa00
swa00
Zurück
Oben Unten