|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 418
|
[BUG #1] Freeze della tastiera
Ok, che ne dite di questo codice in GridController? E' incriminabile?
Codice:
public void reactToInput(TimerInterface timer)
{
if(gemsPair.oneGemIsNotFalling())
{
inputReactor.emptyQueue();
return;
}
if(!currentState.isCurrentState("StoneFall") && !currentState.isCurrentState("GemFall"))
{
inputReactor.reactToInput(timer);
}
}
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
WOW...sembra lui...test per scoprire se hau trovato l'insetto puzzone
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 418
|
Quote:
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Modificare emptyQueue per risparmiare gli eventi "Tasto rilasciato" dovrebbe risolvere giusto?
edit: Peroché invece non gestiamo i tasti nella coda invece di cancellare la lista. Codice:
public void emptyQueue()
{
while(!input.isEmpty())
{
handleKeyEvent(input.extractKey());
}
}
ciao Ultima modifica di VICIUS : 29-04-2006 alle 00:27. |
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ottimo! Se adesso uccidiamo anche la gemma solitaria, siamo ancora sul filo di lana per rilasciare l'update della FP.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 418
|
Visto che non mi era chiaro il motivo di:
Codice:
if(gemsPair.oneGemIsNotFalling())
{
inputReactor.emptyQueue();
return;
}
Codice:
public void testSlaveGemFallsFaster()
{
final double strongestGravity = environment.getConfig().getInteger("StrongestGravityMultiplier") * 0.5;
controller.getGemsPair().rotateClockwise();
controller.getGemsPair().getPivotGem().drop();
controller.update(environment.getTimer());
assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.PRESSED);
controller.reactToInput(environment.getTimer());
assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.RELEASED);
controller.reactToInput(environment.getTimer());
assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
}
Eliminando l'if(gemsPair.oneGemIsNotFalling()) il tasto keydown viene processato e la gemma cade ad una velocità diversa, facendo fallire il test. Il test mi sembra sensato, ma eliminare tutti gli eventi dalla coda non va bene perché brucia i key released, con il rischio di freezare i tasti. Anche la soluzione di Vicius purtroppo non va bene, se gestiamo i tasti, ci ritroviamo con il problema che il tasto keydown viene processato e ci altera la velocità di caduta della gemma. Ma perché il tasto keydown ci altera la velocità quando invece destra e sinistra non ci spostano la gemma che cade? Andiamo a vedere il codice delll'handler destro... Codice:
public void executeWhenPressed(InputReactor inputReactor)
{
KeyEventHandler leftHandler = inputReactor.getKeyHandler(KeyEvent.LEFT);
if(leftHandler.isRepeated(inputReactor.getLastInputTimeStamp())
|| !gemsPair.canReactToInput() )
{
return;
}
gemsPair.move(GO_RIGHT);
inputReactor.logEvent(this);
}
public void executeWhenReleased(InputReactor inputReactor)
{
;
}
Codice:
public void executeWhenPressed(InputReactor inputReactor)
{
grid.setStrongerGravity();
inputReactor.logEvent(this);
}
public void executeWhenReleased(InputReactor inputReactor)
{
grid.setNormalGravity();
inputReactor.logEvent(this);
}
Bene, allora direi che anziché svuotare la coda, basta aggiungere un if (GemsPair.canReactToInput()), affinché la pressione del tasto giù non alteri la caduta della gemma. DropCommandHandler non ha un riferimento alla pair, ma solo a grid....effettivamente il comando drop è più un comando eseguito sulla griglia (aumenta o diminuisce la sua gravità) piuttosto che sulla gemma. Aggiungo comunque la gemsPair al costruttore, così come hanno gli altri handler. Modifico GridController in modo che gli passi assieme alla grid anche la pair quando lo istanzia. Metto l'if: Codice:
public void executeWhenPressed(InputReactor inputReactor)
{
if(gemsPair.canReactToInput())
{
grid.setStrongerGravity();
inputReactor.logEvent(this);
}
}
Codice:
public void testLogStringOnTwoEvents()
{
input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.PRESSED);
playField.getGridController().reactToInput(environment.getTimer());
input.notifyKeyEvent(KeyEvent.LEFT, KeyEvent.PRESSED);
input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.RELEASED);
playField.getGridController().reactToInput(environment.getTimer());
String eventList;
eventList = new MoveLeftCommandHandler(
playField.getGridController().getGemsPair()).getClass().getName()
+ " 1\n";
eventList += new DropCommandHandler(
playField.getGridController().getGrid()).getClass().getName()
+ " 0\n";
assertEquals("Logged string must contain left and down events",
eventList, playField.getGridController().getEventLogString());
}
Sorpresa, fallisce un test di TestGridReactionToInput: Codice:
public void testGravityWhileDownKeyIsPressed()
{
float multiplied = grid.getActualGravity()
* environment.getConfig().getInteger("GravityMultiplier");
generateKeyPressed(KeyEvent.DOWN);
inputReactor.reactToInput(environment.getTimer());
assertEquals(multiplied, grid.getActualGravity());
generateKeyReleased(KeyEvent.DOWN);
inputReactor.reactToInput(environment.getTimer());
}
E qui mi fermo e vado a cena Se qualcuno vuole continuare...prego! |
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 418
|
Sebbene mi venga qualche dubbio, proviamo a proseguire su questa strada.
Seguiamo la logica per cui le gemme devono venire accelerate solo se stai controllando la tua gempair (canReactToInput = true). Aggiungiamo quindi la connessione necessaria al test, ossia che ci sia una gemspair in gioco, e trasformiamolo così: Codice:
public void testGravityWhileDownKeyIsPressed()
{
grid.insertGem(0,4,gem);
gemsPair.setPivotGem(gem);
float multiplied = grid.getActualGravity()
* environment.getConfig().getInteger("GravityMultiplier");
generateKeyPressed(KeyEvent.DOWN);
inputReactor.reactToInput(environment.getTimer());
assertEquals(multiplied, grid.getActualGravity());
generateKeyReleased(KeyEvent.DOWN);
inputReactor.reactToInput(environment.getTimer());
}
Lanciamo i test, ora questo test passa, ma fallisce ancora testSlaveGemFallsFaster(), questa volta nel suo ultimo assert. Codice:
input.notifyKeyEvent(KeyEvent.DOWN, KeyEvent.RELEASED);
controller.reactToInput(environment.getTimer());
assertEquals(strongestGravity, grid.getActualGravity(), 0.01);
}
Codice:
public void executeWhenReleased(InputReactor inputReactor)
{
grid.setNormalGravity();
inputReactor.logEvent(this);
}
Quindi anche questa azione che il DropCommandHandler effettua, va condizionata al fatto di avere una gemsPair con cui agire...gemsPair.canReactToInput(), come per il pressed event. Modifichiamo il metodo: Codice:
public void executeWhenReleased(InputReactor inputReactor)
{
if(gemsPair.canReactToInput())
{
grid.setNormalGravity();
}
inputReactor.logEvent(this);
}
Lancio la build....funziona tutto Lancio il gioco....non si riproduce più il bug |
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 418
|
Committato e buildato con successo
Ho dovuto committare due volte perché alla prima mi ero scordato un file..comunque sono stato abbastanza rapido da far avvenire un solo build. Al secondo commit ho messo "Mancava un file all'ultimo commit Se qualcuno si è letto questo thread e vuole commentare...fatevi avanti |
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Ottimo lavoro BlueDragon. Direi che ora non abbiamo più bug e lunedì possiamo rilasciare l'aggiornamento della First Playable.
ciao |
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Complimenti....
![]() ...ottima non solo la soluzione , ma anche come hai esposto il problema e la soluziona a tutti. Grazie perchè potevi risparmiartelo...ma così ho capito che è stato e come è ora il codice. Sono felice che un test che ho proposto e che testava una cosa che già funzionava ha portato a tutta questa bella messa a posto del codice. Io purtroppo non ho avuto la pazienza di scavare così a fondo per capire dove era la magagna |
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
gg
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
BD, hai un chiarezza logica impressionante. Complimenti
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Bari
Messaggi: 2776
|
Complimenti anche da parte mia. Una esposizione veramente notevole.
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Finito di leggere, davvero bella
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Meraviglioso. Semplicemente meraviglioso.
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Bug Closed.
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:11.



















