Verifica se i rettangoli si intersecano solo lavorando se si intersecano al primo controllo
-
20-12-2019 - |
Domanda
public void update() {
speedY = bg.getSpeedY() / 2;
tileY += speedY;
r.set(tileX, tileY, 50, 48);
// Collision with cycle here:
if (tileY > 480) {
r = null;
}
if (tileY < 480) {
checkCollision();
}
}
private void checkCollision() {
if (type != 0) {
boolean val = Rect.intersects(Cycle.rect, r);
if (val) {
test = true;
}
}
}
.
Utilizzo del debugger Ho determinato che tutti i rettangoli stanno aggiornando correttamente e il ciclo.rect restituisce la posizione corretta rettangolo.Se i rettangoli si intersecano sul primo controllo funziona bene.Tuttavia, poiché l'aggiornamento esegue l'intersezione non restituisce mai true.Perché questo potrebbe accadere?Ho usato la Val booleana solo per aiutare nel debug.
Ho registrato due valori in cui credo che i rettangoli dovrebbero essere intersecanti ma non è:
R: 02-24 23: 32: 50.762: V / RET (16624): RET (50, 314 - 50, 48) Cycle.rect: 02-24 23: 32: 50.762: V / RET (16624): RET (49, 329 - 100, 100)
Soluzione
Il problema è sul sistema di coordinate in Java, dove è considerato in alto a sinistra come 0. Pertanto, un Rect
è "definito" se la coordinata top
è meno di bottom
.Altrimenti, è considerato vuoto.
da Reft API Riferimento ,
.Nota: la maggior parte dei metodi non controlla per verificare che le coordinate siano ordinate correttamente (cioè sinistra <= destra e top <= in basso).
Anche per set()
(Nota: enfatizzare sulla mia),
.Impostare le coordinate del rettangolo nei valori specificati.Nota: non viene eseguito alcun controllo dell'intervallo, quindi spetta al chiamante Assicurarsi che SINISTRA <= DESTRA e TOP <= Bottom .
e isEmpty()
.restituisce true se il rettangolo è vuoto (a sinistra>= destra o top>= in basso)