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)

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top