|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#41 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Adesso non ricordo come si chiama: l'ho usata tempo addietro. Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
#42 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Mi sembra che il codice stia in KeyboardImpl. Attualmente non ho i sorgenti davanti per controllare. Quote:
Comunque secondo me il sorgente dovrà subire qualche sostanziosa modifica per implementare la gestione dei tasti prendendoli da una coda. Questo perché a mio avviso l'evento "pressione di un tasto" dovrebbe essere "consumato" da un solo oggetto alla volta, che dovrebbe poi modificare il suo stato interno. Per far questo la gestione della coda per com'è implementata adesso dovrebbe andare bene. Vediamo cosa dicono anche gli altri: la questione è delicata, e se magari ci confrontiamo in tanti qualcosa di buono ne verrà fuori molto velocemente.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
#43 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
Gli altri tasti di cui dovremo rilevare la pressione, però, avranno a che fare con gli elementi più disparati (dall'esecuzione di suoni all'utilizzo di certe feature avanzate). Quindi, anche se non bisogna inserire ASSOLUTAMENTE nulla che non sia stato richiesto dai task, credo ci convenga scegliere un tipo di implementazione che non ci chiuda delle porte, dato che in futuro poi dovremo riaprirle (e in pratica rifare tutto daccapo). Ora, io non so dire quale sia il metodo migliore, questo dovete deciderlo voi, posso solo darvi un'idea di dove dobbiamo arrivare
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
|
#44 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Possiamo sfruttare il timeStamp per processare la sequenza di eventi... Faccio un esempio di codice che legge gli eventi di pressione: Codice:
while(input.isAnotherKeyPressed(lastEvent.getTimeStamp())
{
lastEvent = input.getNextKeyPressEvent(lastEvent.getTimeStamp());
processInput(lastEvent.getKeyCode());
}
Il problema attuale (e lo vedi diminuendo GridInputDelay dal file di cofigurazione) è che per una sola pressione di tasto l'aggiornamento dello stato della tastiera trova il tasto premuto molte volte (perchè l'aggiornamento avviene molte volte ogni decimo di secondo)... Andando a mettere ogni evento di pressione all'interno di una coda si genererebbero decine (se non centinaia) di eventi di pressione di un tasto... Si può sempre applicare anche la vostra coda, ma comunque il problema fondamentale da risolvere è questo: un nuovo evento di pressione deve essere registrato (come l'avevo pensato io o comunque come l'avete pensato voi) solo dopo che lo stesso tasto è stato rilasciato... Visto che l'esempio di KeyEvent fatto qualche post fa non ha avuto l'effetto che speravo allora userò una dicitura diversa per questa classe: Codice:
class KeyState
{
private boolean isPressed = false;
private long lastPressionTimestamp = 0;
public KeyState()
{
}
public void setKeyState(boolean isPressed, long timeStamp)
{
if(this.isPressed != isPressed)
{
this.timeStamp = timeStamp;
this.isPressed = isPressed;
}
}
public boolean isKeyPressed()
{
return isPressed;
}
public long getTimeStamp()
{
return timeStamp;
}
public boolean isStateChanged(long timeStamp)
{
if(this.timeStamp > timeStamp)
return true;
return false;
}
}
Questo ci può permettere sia a continuare ad usare una gestione come quella precedente (ma senza ripetizioni) che una gestione con una "falsa" coda di tasti: Codice:
public KeyPressedEvent getNextKeyPressedEvent(long timeStamp)
{
int minimalTimeDifferenceIndex = keyState.lenght();
long minimalTimeDifference = 0;
for(int i = 0; i < keyState.lenght(); ++i)
{
long timeDifference = keyState[i].getTimeStamp - timeStamp;
if(timeDifference > 0 && timeDifference < minimalTimeDifference)
{
minimalTimeDifferenceIndex = i;
minimalTimeDifference = timeDifference;
}
}
return KeyPressedEvent(keyState[i]);
}
Ultima modifica di cionci : 11-11-2005 alle 15:59. |
|
|
|
|
|
#45 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
su questo punto non sarei molto d'accordo.... immagina ad esempio quando si spinge il tast down... dobbiamge gestire la situazione quando il tasto è premuto, non solo quando è rilasciato..... infatti durante la pressione la gemma deve accelerare verso il basso. Secondo me la soluzione ideale è considerare sia gli eventi di tipo isKeyPressed ke isKeyReleased in modo da avere un controllo più flessibile della pressione dei tasti... ma su questo è meglio sentire cosa ne pensano il costumer e il coach credo...
__________________
|
|
|
|
|
|
#46 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Ovviamente lo stato degli altri tasti può variare quando se ne tiene premuto uno, anzi succederà quasi sempre, quindi non possiamo ignorare questo dettaglio.
Se io iniziassi a premere giù, e solo dopo premessi sinistra (cosa lecita e che capiterà molto, molto spesso ai giocatori), il gioco deve rilevare il tutto correttamente.
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
#47 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
^TiGeRShArK^: uno non esclude l'altro...come ho detto, prova a diminuire GridInputDelay e vedrai che alla pressione di un tasto la gemma si sposterà più volte...
Semplicemente input può fornire un metodo isKeyPressed...che ritorna keyState[keyIndex].isKeyPressed...senza fare alcun controllo sul tempo... |
|
|
|
|
#48 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Altrimenti basta fare la differenza fra i timeStamp...e se è maggiore di un certo timeout si cambia il timeStamp vecchio con quello nuovo... Un altra possibilità sarebbe temporizzare anche la lettura degli input dal main del programma...forse la soluzione più semplice... Dovrebbe bastare temporizzare l'aggiornamento del vettore dei tasti con un tempo di 100 ms (e 150 ms per GridInputDelay)...poi si potrebbe continuare ad usare la coda così come è stata implementata... Ultima modifica di cionci : 11-11-2005 alle 18:04. |
|
|
|
|
|
#49 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
Purtroppo per i dettagli implementativi non saprei cosa suggerire, dato che non è il mio campo: basta solo che il risultato sia che ogni pressione, contemporanea ad altre o meno (ed a qualsiasi velocità), sia registrata ed eseguita correttamente.
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
|
#50 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La situazione è complicata... Se un tasto resta premuto dovremmo ad esempio generare un nuovo evento solo ogni TOT ms... Pena la registrazione di troppi eventi... La soluzione che ho proposto sopra può essere riciclata a questo fine...
Ditemi cosa ne pensate (a questo punto che la coda tornerebbe comunque utile)...ma il bitset dovrebbe prendere un nuova forma (cioè il vettore di KeyState)... |
|
|
|
|
#51 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao |
|
|
|
|
|
#52 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
class KeyState
{
private boolean isPressed = false;
private long timeStamp = 0;
public KeyState()
{
}
public void update(boolean isPressed, long timeStamp)
{
if(this.isPressed != isPressed)
{
this.timeStamp = timeStamp;
this.isPressed = isPressed;
//qui è possibile inserire l'evento in coda
}
else if(this.isPressed && timeStamp - this.timeStamp > 100)
{
time.timeStamp = timeStamp;
//qui è possibile inserire l'evento in coda per
//ripetere un tasto non rilasciato
}
}
public boolean isKeyPressed()
{
return isPressed;
}
public long getTimeStamp()
{
return timeStamp;
}
}
Ovviamente in UpdateKeyboardState bisogna ciclare sui tasti per fare un update su tutti i KeyState... Riguardo all'estrazione dalla coda sono comunque dubbioso... Se consideriamo che i tasti debbano essere estratti solo da un utilizzatore allora d'accordo, se invece non vogliamo estrarre i tasti ribadisco l'opzione in base al timeStamp... Che ne dite ? Ultima modifica di cionci : 11-11-2005 alle 18:49. |
|
|
|
|
#53 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Per dirlo dovrei provarlo.
E' possibile avere una build funzionante con le tue modifiche?
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
#54 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ci provo...anche se visto che non c'è la coda potremmo anche perdere qualche tasto...
|
|
|
|
|
#55 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
Quando la cosa è sufficientemente completa fate un fischio così testo subito
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
|
#56 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ti posso dare una versione di test solo per te...
Altrimenti invio una build, ma non mi sembra il caso con il codice di prova... Per ora gestisco in questo modo solo i pulsanti di destra e sinistra... Ti posso passare solo i sorgenti da metere nelle rispettive cartelle (solo Game.java e Input.java) ? |
|
|
|
|
#57 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Azzz...se funziona bene...
|
|
|
|
|
#58 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ho impostato la ripetizione del tasto premuto ogni 200 ms, GridInputDelay è stato impostato a 1 da codice (non capisco come mai mi saltava due caselle alla volta se lo impostavo a 0, nonostante ci sia la SleepOneMillisecond nel main loop)....
|
|
|
|
|
#59 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
|
#60 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Inviami la tua mail a cionci@questo_sito...
Ora mi sto domandando se la coda serve ancora
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:43.


















