2011-11-23 5 views
1

Je connais déjà la détection de collision rectangle avec des rectangles, mais cette fois j'ai 2 bitmaps tournés. Je veux dire, j'ai des bitmaps normales + une variable flottante appelée "direction" et indiquant dans quelle direction le bitmap doit être tourné au dessin.Android - Détection de collision de bitmap (rotation)

Mais comment savoir si 2 de ces objets se heurtent l'un l'autre? Ce serait suffisant, aussi, si vous pouviez me dire comment fonctionne la détection de collision entre 2 rectangles pivotés ... Ou peut-être que vous pourriez poster du code ...

Merci de nous aider (et merci si vous avez passé temps en lisant ceci ou en pensant à une réponse)

Répondre

1

Généralement, vous devrez utiliser le Separating Axis Theorem pour déterminer si deux rectangles pivotés entrent en collision. Mais il y a un moyen simple de savoir si les rectangles entrent en collision avant d'utiliser le SAT afin de ne pas avoir à effectuer de traitement superflu. Vous pouvez faire un cercle de délimitation, où vous démontrez que les rectangles ne se croisent pas en prouvant que leurs cercles de délimitation ne se croisent pas.

Le cercle de délimitation d'un rectangle partage son centre et a un diamètre égal à la longueur de l'une des diagonales du rectangle. Essentiellement, si les cercles ne se croisent pas, les rectangles ne peuvent pas non plus se croiser. Je ne suis pas sûr comment vous effectuez vos rotations, mais si vous utilisez des objets de type Shape/Area, vous pouvez utiliser AffineTransform pour effectuer la rotation, puis utiliser intersects() sur la zone de chaque objet pivoté pour vérifier s'ils entrer en collision, cela vous évite de l'appliquer vous-même. Prenons l'exemple suivant:

import java.awt.Rectangle; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Area; 

public class Main { 

    public static void main(String args[]) { 
     //Create rectangle 
     Rectangle rect = new Rectangle(10, 10, 10, 10); 
     //Create transformation object 
     AffineTransform af = new AffineTransform(); 
     //Rotate the rectangle by 45 degrees 
     af.rotate(Math.PI/4, rect.x, rect.y); 

     Rectangle rect2 = new Rectangle(20, 20, 20, 20); 
     AffineTransform bf = new AffineTransform(); 
     bf.rotate(Math.PI/4, rect2.x, rect2.y); 

     //Create Area objects based off of the Rectangle objects 
     Area areaA = new Area(rect); 
     //Set the Area object to be the same as the Rectangle object 
     areaA = areaA.createTransformedArea(af); 
     Area areaB = new Area(rect2); 
     areaB = areaB.createTransformedArea(bf); 

     //Check if the objects collide by using their Area equivalent 
     if (areaA.intersects(areaB.getBounds())) { 
      System.out.println("Collision!"); 
     } 
    } 
} 

Vous pouvez évidemment, modifier ce à la suite de votre mise en œuvre - J'espère que cela vous fait dans la bonne direction.

+0

Merci beaucoup pour cette réponse, mais malheureux je ne peux pas importer un de ces paquets ... :(On dit toujours "L'importation java.awt.geom ne peut pas être résolu" et cela pour chaque importation. codage pour android? – user1059863

+0

http://google.com/codesearch/p?hl=fr#uX1GffpyOZk/awt/java/awt/geom/AffineTransform.java montre que le paquet awt est disponible pour Android (afaik), vous aurez J'ai besoin de changer Rectangle pour Rectangle2D – Deco

+0

Le seul paquetage que j'ai pour moi parmi java.awt est java.awt.font ... Est-ce que c'est peut-être parce que je suis en train de développer pour 2.1 et qu'il n'y était pas supporté?!? – user1059863