2015-09-08 1 views
2

Quand j'execute ce bloc de code:Pourquoi un point Slick2d n'intersecte-t-il pas un rectangle?

Point p = new Point(1,1); 
    Rectangle r = new Rectangle(0 ,0 , 10 ,10); 

    if(p.intersects(r)){ 
     System.out.println("Collided"); 
    } 

Il n'imprime Collided. Pourquoi est-ce?

Les deux objets sont

org.newdawn.slick.geom

, pas ceux Implémentations Java standard

+0

Pourquoi pensez-vous qu'il devrait? –

+0

Mon hypothèse était que la méthode intersects renvoie vrai lorsque deux formes se croisent. Ce n'est pas le cas? –

+0

[This] (https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection) pourrait être utile, il explique la théorie de base derrière la détection de collision. Dans votre cas, votre Point n'a pas de côtés (évidemment). Je suppose que la méthode n'a rien à comparer avec le rectangle. -> Avez-vous essayé de changer le rectangle et le point? – redxef

Répondre

2

C'est une bonne question. Pour savoir pourquoi j'ai fait quelques recherches

Point p = new Point(0,0); 
System.out.println(p.closed()); // TRUE 
System.out.println(p.getPointCount()); // 1, logically 

Et puis je recherche dans le repo Slick2d dans le Shape class. Je pense que ces lignes sont la raison pour laquelle cela ne fonctionne pas:

boolean result = false; 
    float points[] = getPoints(); // Get all points of our shape 
    int length = points.length; // count them. here length==1 

    if (!closed()) { 
     length -= 2; // as we see the point is a closed shape, here length=-1 
    } 
    for(int i=0;i<length;i+=2) { // Does not even enter the complicated work because length == -1 
     // Complicated thing to test if intersect with a lot off points 
    } 
    return result; // here return false 

Voici la justification de votre problème. Je ne sais pas si c'est un bug ou si c'est la volonté des développeurs. Vous pouvez toujours configurer un problème.

En guise de solution, je conseillerais de construire un rectangle (x, y, 1,1) et de le croiser. Cela fait le travail que vous voulez parce que c'est une forme en 4 points