Prima di applicare l'estrapolazione al movimento del mio sprite, la mia collisione ha funzionato perfettamente. Tuttavia, dopo aver applicato l'estrapolazione al movimento del mio sprite (per appianare le cose), la collisione non funziona più.
Ecco come funzionavano le cose prima dell'estrapolazione:
Tuttavia, dopo aver implementato la mia estrapolazione, la routine di collisione si interrompe. Suppongo che ciò avvenga perché agisce sulla nuova coordinata che è stata prodotta dalla routine di estrapolazione (che si trova nella mia chiamata di rendering).
Dopo aver applicato la mia estrapolazione
Come correggere questo comportamento?
Ho provato a mettere un controllo extra di collisione subito dopo l'estrapolazione - questo sembra chiarire molti problemi ma l'ho escluso perché mettere la logica nel mio rendering è fuori discussione.
Ho anche provato a fare una copia della posizione di spritesX, estrapolandola e disegnandola usando quella piuttosto che l'originale, lasciando così l'originale intatto per la logica da prendere in considerazione - questa sembra un'opzione migliore, ma produce ancora alcuni strani effetti quando si scontrano con i muri. Sono abbastanza sicuro che anche questo non sia il modo corretto di affrontarlo.
Ho trovato un paio di domande simili qui ma le risposte non mi hanno aiutato.
Questo è il mio codice di estrapolazione:
public void onDrawFrame(GL10 gl) {
//Set/Re-set loop back to 0 to start counting again
loops=0;
while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){
SceneManager.getInstance().getCurrentScene().updateLogic();
nextGameTick+=skipTicks;
timeCorrection += (1000d/ticksPerSecond) % 1;
nextGameTick+=timeCorrection;
timeCorrection %=1;
loops++;
tics++;
}
extrapolation = (float)(System.currentTimeMillis() + skipTicks - nextGameTick) / (float)skipTicks;
render(extrapolation);
}
Applicazione dell'estrapolazione
render(float extrapolation){
//This example shows extrapolation for X axis only. Y position (spriteScreenY is assumed to be valid)
extrapolatedPosX = spriteGridX+(SpriteXVelocity*dt)*extrapolation;
spriteScreenPosX = extrapolationPosX * screenWidth;
drawSprite(spriteScreenX, spriteScreenY);
}
modificare
Come ho detto sopra, ho provato a fare una copia delle coordinate dello sprite appositamente per disegnare con ... questo ha i suoi problemi.
In primo luogo, indipendentemente dalla copia, quando lo sprite si muove, è super-liscio, quando si ferma, traballa leggermente a sinistra / a destra - poiché sta ancora estrapolando la sua posizione in base al tempo. È un comportamento normale e possiamo 'disattivarlo' quando lo sprite si ferma?
Ho provato ad avere flag per sinistra / destra e estrapolare solo se uno di questi è abilitato. Ho anche provato a copiare le ultime e attuali posizioni per vedere se c'è qualche differenza. Tuttavia, per quanto riguarda la collisione, questi non aiutano.
Se l'utente preme dire, il pulsante destro e lo sprite si stanno muovendo a destra, quando colpisce un muro, se l'utente continua a tenere premuto il pulsante destro, lo sprite continuerà ad animarsi a destra, mentre viene bloccato dal muro ( quindi in realtà non si muove), tuttavia poiché la bandiera destra è ancora impostata e anche perché la routine di collisione sposta costantemente lo sprite fuori dal muro, appare ancora al codice (non al giocatore) che lo sprite si sta ancora muovendo, e quindi l'estrapolazione continua. Quindi, ciò che il giocatore vedrebbe, è lo sprite "statico" (sì, si sta animando, ma in realtà non si muove attraverso lo schermo), e ogni tanto si agita violentemente mentre l'estrapolazione tenta di fare la sua cosa ..... .. Spero che questo aiuto