PDA

View Full Version : [CICLO 5] Storia 2


Jocchan
14-11-2005, 14:03
Storia 2: Creazione di una nuova gemma quando la precedente tocca il fondo o una gemma sottostante (emissione del bip in entrambi i casi), con rilevamento delle collisioni tra le gemme presenti nell’area di gioco (non sarà possibile spostare la gemma in una casella già occupata da un'altra). Introduzione di un contatore per il punteggio del giocatore, inizializzato a zero, capace di assumere valori validi di 8 cifre e mostrato su schermo mediante una png contenente le cifre nelle 10 caselle che la compongono.
Ogni volta che un diamante collide con il fondo (o con una gemma al di sotto di esso) il contatore del punteggio viene incrementato di 1.

Punti cardine da tenere a mente durante i lavori:

Mai fare a gara a chi finisce il task per primo, meglio procedere con calma, altrimenti perderemo molto più tempo in seguito
Evitiamo di complicarci la vita, esiste di certo una soluzione più semplice di quella che abbiamo pensato di implementare
MAI aggiungere elementi non richiesti esplicitamente dai task: se mai serviranno, se ne parlerà nelle prossime storie
Comunichiamo il più possibile, se qualcosa non è chiaro discutiamone tutti i dettagli fino ad eliminare ogni dubbio, anche il più insignificante

VICIUS
14-11-2005, 19:52
Task:
5.2.1: Cionci: completato
Quando la gemma collide con il bordo inferiore dell'area di gioco ne deve essere creata una nuova nella parte superiore che diventa quella gestita tramite input da tastiera.
5.2.2: Cover + TigerShark: completato
Modificare Grid in modo che lo spostamento verticale della gemma sia fermato se la casella della riga sottostante è gia occupata. (solo pair programming)
5.2.3: DanieleC88: completato
Impedire lo spostamento laterale della gemma se la casella nella colonna di destinazione è occupata. (solo pair programming)
5.2.4: 71104: completato
Aggiungere la possibilità di disegnare un numero intero di massimo 8 cifre usando la clase Sprite e come base una texture.
5.2.5: Vifani: completato
Visualizzare nella casella dello score presente alle coordinate 219x421 il numero di diamanti presenti all'interno della griglia. Ogni cifra deve essere distanziata dall'altra 11 pixel.

ciao ;)

fek
14-11-2005, 20:16
5.2.2 va svolto in Pair Programming.

cover
14-11-2005, 21:36
Io sarei tentato per il 5.2.2 per provare pair programming...se c'è qualcuno disposto, e con tanta pazienza :rolleyes:
chi si offre volontario ? fek ? :Prrr: :Prrr:

Sperando di non aver scelto il task più difficile / con più complicazioni ^^

fek
14-11-2005, 23:10
La mia prossima vittima programmata sara' cionci :)

Ora preferisco che proviata a fare Pair Programming fra di voi.

^TiGeRShArK^
14-11-2005, 23:57
ci proviamo insieme cover???
x me andrebbe bene domani e dopodomani dopo le 19.00.....
certo ke se magari ci seguono gli altri mentre scriviamo è pure meglio! :Prrr:

EDIT: ma non dovremmo aspettare che il task 1 sia implementato prima??? :confused:

cionci
15-11-2005, 08:43
La mia prossima vittima programmata sara' cionci :)
Purtroppo nemmeno questa settimana lo posso fare... Sono occupato praticamente tutte le sere :muro:

Avrei una domanda sul 5.2.3: supponendo che la gemma si trovi nella cella [Y, X]...e la cella [Y+1, X+1] contenga una gemma... La gemma in [Y,X] si trova all'inizio della cella (ricordiamoci che l'hot spot è in alto a destra)... Vengono svolti diversi update in cui al gemma si sposta verso il basso, ma rimane ancora in [Y, X]... Viene premuto il tasto sx, la gemma in questo caso non si deve spostare nella casella [Y, X+1] perchè andrebbe a collidere lateralmente, ma solo dal punto di vista grafico, non dal punto di vista della cella, con la gemma in [Y+1, X+1]...
E' giusto questo comportamento ? Quindi non solo bisogna controllare che non ci siano collisioni con le gemme nelle caselle adiacenti lateralmente, ma che non ci siano anche nelle diagonali inferiori se la gemma non si trova all'inzio della cella...

Direi che se si aggiunge anche questo punto di vista il task 5.2.3 diventa più complesso del 5.2.2...e quindi direi che sarebbe meglio fare questo in pair programming...

Quindi per motivi di tempo io prenderei quello dei due che non si svolge in pair programming...
Quali sono le priorità fra i task ?

cionci
15-11-2005, 08:44
ci proviamo insieme cover???
x me andrebbe bene domani e dopodomani dopo le 19.00.....
certo ke se magari ci seguono gli altri mentre scriviamo è pure meglio! :Prrr:

EDIT: ma non dovremmo aspettare che il task 1 sia implementato prima??? :confused:
Non importa perchè le gemme le potete inserire voi a mano (insertGemAt) :)

fek
15-11-2005, 08:50
Purtroppo nemmeno questa settimana lo posso fare... Sono occupato praticamente tutte le sere :muro:

Avrei una domanda sul 5.2.3: supponendo che la gemma si trovi nella cella [Y, X]...e la cella [Y+1, X+1] contenga una gemma... La gemma in [Y,X] si trova all'inizio della cella (ricordiamoci che l'hot spot è in alto a destra)... Vengono svolti diversi update in cui al gemma si sposta verso il basso, ma rimane ancora in [Y, X]... Viene premuto il tasto sx, la gemma in questo caso non si deve spostare nella casella [Y, X+1] perchè andrebbe a collidere lateralmente, ma solo dal punto di vista grafico, non dal punto di vista della cella, con la gemma in [Y+1, X+1]...
E' giusto questo comportamento ? Quindi non solo bisogna controllare che non ci siano collisioni con le gemme nelle caselle adiacenti lateralmente, ma che non ci siano anche nelle diagonali inferiori se la gemma non si trova all'inzio della cella...

Direi che per ora ignoriamo il problema e vediamo come si comporta il gioco. Poi Jocchan ci dira' esattamente come comportarci in questa situazione, quando potra' provarla direttamente.

Quindi per motivi di tempo io prenderei quello dei due che non si svolge in pair programming...
Quali sono le priorità fra i task ?

Le priorita' sono in ordine di numerazione dei task.

cionci
15-11-2005, 08:56
Allora mi prenoto per il 5.2.3, potrei fare anche il 5.2.1, ma fino a mercoledì pomeriggio/giovedì non ho un briciolo di tempo :) Quindi se nessuno se lo accolla entro domani sera magari ci posso pensare io, lasciando il 5.2.3 ovviamente...

fek
15-11-2005, 08:58
Allora mi prenoto per il 5.2.3, potrei fare anche il 5.2.1, ma fino a mercoledì pomeriggio/giovedì non ho un briciolo di tempo :) Quindi se nessuno se lo accolla entro domani sera magari ci posso pensare io, lasciando il 5.2.3 ovviamente...

Ottimo :)

71104
15-11-2005, 10:46
il 5.2.4 sembra carino, mi prenoto :)
dubbi: va disegnato uno sprite per ogni cifra o tutto il numero va in un unico sprite? (propongo la prima...)
stima, be', bu, boh, facciamo 1 giorno a partire dal termine del task per cui mi sono prenotato alla Storia 1.

PS: per non scrivere valori costanti nel codice direi di inserire il valore degli 11 pixel in config come "digitSpacing".

VICIUS
15-11-2005, 11:14
il 5.2.4 sembra carino, mi prenoto :)
dubbi: va disegnato uno sprite per ogni cifra o tutto il numero va in un unico sprite? (propongo la prima...)
stima, be', bu, boh, facciamo 1 giorno a partire dal termine del task per cui mi sono prenotato alla Storia 1.

PS: per non scrivere valori costanti nel codice direi di inserire il valore degli 11 pixel in config come "digitSpacing".
Tutto tuo.

ciao ;)

fek
15-11-2005, 11:45
il 5.2.4 sembra carino, mi prenoto :)
dubbi: va disegnato uno sprite per ogni cifra o tutto il numero va in un unico sprite? (propongo la prima...)
stima, be', bu, boh, facciamo 1 giorno a partire dal termine del task per cui mi sono prenotato alla Storia 1.

L'idea e' che le cifre da 0 a 9 sono conservate in una texture in posizioni che Jocchan ti comunichera'. Tu crei 10 sprite (uno per ogni cifra) che prendono le informazioni dalla texture e disegni gli sprite corretti a seconda del numero da visualizzare nella posizione corretta.

Tutto testato ovviamente. Mi raccomando la test list prima di iniziare.


PS: per non scrivere valori costanti nel codice direi di inserire il valore degli 11 pixel in config come "digitSpacing".

Per ora attieniti al task :)

cionci
15-11-2005, 11:57
Per il 5.2.1, caso mai lo facessi io: dal punto di vista della metodologia di sviluppo, è più coerente sviluppare una nuova classe che gestisce l'inseriemnto e l'arrivo in fondo della gemma controllata oppure ampliare Grid ?

fek
15-11-2005, 12:11
Per il 5.2.1, caso mai lo facessi io: dal punto di vista della metodologia di sviluppo, è più coerente sviluppare una nuova classe che gestisce l'inseriemnto e l'arrivo in fondo della gemma controllata oppure ampliare Grid ?

E' una decisione tua questa e dipende dalla tua sensibilita'.

Ti posso dire quello che farei io. Io scriverei la cosa piu' semplice che mi viene in mente, quindi scriverei subito dentro Grid. Una volta finito il task guarderei Grid e e come il codice si e' evoluto e cercherei di capire come vuole essere strutturato meglio. Quindi cercherei possibilita' di refactoring ed un refactoring possibile e' quello di estrarre comportamenti comuni in una nuova classe.

Grid sta crescendo e prima o poi dovremo prenderne atto e alzare il suo livello di astrazione, quindi estrarre delle classi e definire il comportamento di Grid in termini di composizione di queste classi.

Da fare subito? Dopo? Non saprei dirtelo, anche qui sta alla vostra sensibilita'.

Tutto sto discorso per dirti: decidi tu :)

Jocchan
15-11-2005, 13:14
In realtà noi dobbiamo considerare ogni gemma come un quadrato 32x32, indipendentemente dalla forma che poi avrà.
Questo significa che, se è nota la coordinata (x, y) dello spigolo in alto a sinistra, possiamo ricavare quelle degli altri tre semplicemente aggiungendo il valore 32 alle coordinate:
- spigolo in alto a destra -> (x+32, y)
- spigolo in basso a sinistra -> (x, y+32)
- spigolo in basso a destra -> (x+32, y+32)
Sia chiaro che mi riferisco ad uno schema con l'origine degli assi in alto a sinistra, che dovrebbe essere unico per tutto il nostro progetto (così come il posizionamento dell'hot spot che, per quanto ne so, si trova anch'esso in alto a sinistra di ogni oggetto).

Il rilevamento delle collisioni implica che questi quadrati in movimento non vengano mai sovrapposti, nemmeno di un pixel. Avendo a disposizione le coordinate di tutti e quattro gli spigoli, comunque, non dovrebbe essere troppo complesso.

fek
15-11-2005, 13:52
Il rilevamento delle collisioni implica che questi quadrati in movimento non vengano mai sovrapposti, nemmeno di un pixel. Avendo a disposizione le coordinate di tutti e quattro gli spigoli, comunque, non dovrebbe essere troppo complesso.

In realta' per ora il discorso e' ancora piu' semplice perche' abbiamo una rappresentazione ad alto livello che e' la Griglia. Non abbiamo bisogno di controllare la sovrapposizione degli sprite, ci basta controllare che la cella sotto o al nostro lato non sia gia' occupata e impedire il movimento o bloccare la caduta.

cionci
15-11-2005, 14:04
Sia chiaro che mi riferisco ad uno schema con l'origine degli assi in alto a sinistra, che dovrebbe essere unico per tutto il nostro progetto (così come il posizionamento dell'hot spot che, per quanto ne so, si trova anch'esso in alto a sinistra di ogni oggetto).
Sì...ho scritto male.. Intendevo in alto a sinistra :)

Jocchan
15-11-2005, 14:14
In realta' per ora il discorso e' ancora piu' semplice perche' abbiamo una rappresentazione ad alto livello che e' la Griglia. Non abbiamo bisogno di controllare la sovrapposizione degli sprite, ci basta controllare che la cella sotto o al nostro lato non sia gia' occupata e impedire il movimento o bloccare la caduta.

Benissimo, meglio ancora :)
Ovviamente se abbiamo una gemma in (x, y) ed una casella (x+1, y+1) occupata, potremo liberamente muoverci in (x+1, y) nella sua interezza: la collisione verticale verrà valutata solo quando fisicamente le due gemme andranno a toccarsi (cioè sarò ancora in grado di spostare la gemma un istante prima del contatto, per incastrarla da qualche altra parte).
Per le collisioni orizzontali, visto che si salta istantaneamente da una casella all'altra, e non bisogna considerare caselle riempite solo parzialmente dalla gemma in caduta, il concetto è ancora più semplice ;)

cionci
15-11-2005, 14:20
In realta' per ora il discorso e' ancora piu' semplice perche' abbiamo una rappresentazione ad alto livello che e' la Griglia. Non abbiamo bisogno di controllare la sovrapposizione degli sprite, ci basta controllare che la cella sotto o al nostro lato non sia gia' occupata e impedire il movimento o bloccare la caduta.
Sì, ma non basta... Durante la caduta una gemma lascia una cella e ne occupa un'altra quando l'hot spot si sposta nella nuova cella... Quindi ci sarà un momento in cui la gemma verrà "disegnata" parte in un cella e parte in quella sotto, pur sempre appartenendo alla cella sopra (nel senso di isGemAt)...
Quindi se in questo momento si riceve la pressione di un tasto laterale bisogna sì spostarla orizzontalmente rispetto alla cella in cui si trova...ma anche verificare che la cella inferiore a quella in cui ci si deve spostare non abbia una gemma...

Vi faccio vedere con un'immagine la situazione che cerco di spiegare...

cionci
15-11-2005, 14:43
http://utenti.lycos.it/ci0nci/movimentoGemme.jpg
La gemma a quell'istante si trova nella cella di coordinata [11, 4]... Quindi se si spostasse in [11, 5] o [11, 3] avremmo una collisione laterale e non verticale (a meno che si controlli subito dopo la collisione verticale, ma avrebbe più senso controllarla prima del movimento)...

cover
15-11-2005, 15:03
ci proviamo insieme cover???
x me andrebbe bene domani e dopodomani dopo le 19.00.....
certo ke se magari ci seguono gli altri mentre scriviamo è pure meglio! :Prrr:



Ok :)
Meglio domani dopo le 19.00 perchè più tardi devo andare via e stasera non ci sono.
Per evitare stragi di massa sì, sarebbe meglio :Prrr:

fek
15-11-2005, 15:07
La gemma a quell'istante si trova nella cella di coordinata [11, 4]... Quindi se si spostasse in [11, 5] o [11, 3] avremmo una collisione laterale e non verticale (a meno che si controlli subito dopo la collisione verticale, ma avrebbe più senso controllarla prima del movimento)...

Direi di si'. Quindi va controllata le caselle ai lati della casella corrente e, se il diamante e' in caduta, le caselle ai lati della casella sottostante.

Tutti d'accordo?

Buona segnalazione, discutere il task prima di partire sta dando i suoi frutti :)

Questo mi fa pensare che abbiamo bisogno di una knowledge base come si deve. Il wiki che ho installato e' troppo complesso, ne cerco uno piu' semplice.

cionci
15-11-2005, 15:11
Direi di si'. Quindi va controllata le caselle ai lati della casella corrente e, se il diamante e' in caduta, le caselle ai lati della casella sottostante.

Ma a questo punto direi che il 5.2.3 è più complesso del 5.2.2, non trovi ?

fek
15-11-2005, 16:50
Ma a questo punto direi che il 5.2.3 è più complesso del 5.2.2, non trovi ?

Effettivamente si'. Ok, entrambi in Pair Programming allora :D

Jocchan
15-11-2005, 17:56
Ho committato la texture con le cifre del punteggio (fatta da XAndE, ottimo neoacquisto del GFXteam, che si sta occupando di rifare il layout grafico del gioco).
L'immagine si trova in data/gfx/common ed ha dimensioni 128x64px (per la solita questione delle potenze di due), ma i dati significativi (le cifre che useremo) sono contenute in dieci caselle 16x24 in alto a sinistra della texture (il resto è spazio vuoto).
Le cifre, quando verranno visualizzate, dovranno essere distanziate orizzontalmente 11px (cioè meno della larghezza delle caselle che le contengono) ed ovviamente, dato che ci stiamo riferendo ad un contatore, è inutile visualizzare sempre tutte e otto le cifre.
In un numero come 00001234, insomma, bisognerà visualizzare solo il numero 1234 (gli zeri a sinistra dovranno - insomma - essere trasparenti).

Inutile aggiungere che da ora in poi tutte le immagini che useremo andranno in delle sottocartelle di gfx, dato che la quantità di file di questo tipo è destinata a crescere esponenzialmente.

cionci
15-11-2005, 18:01
L'immagine si trova in data/gfx/common ed ha dimensioni 128x64px (per la solita questione delle potenze di due), ma i dati significativi (le cifre che useremo) sono contenute in dieci caselle 16x24 in alto a sinistra della texture (il resto è spazio vuoto).
Io al momento dividerei le immagini in 10 32x32, una per ogni numero... Attualmente da un file si carica una sola texture...

Jocchan
15-11-2005, 18:08
Io al momento dividerei le immagini in 10 32x32, una per ogni numero... Attualmente da un file si carica una sola texture...

Meglio iniziare ad usare già da ora texture uniche per contenere dei font invece, visto che praticamente tutto il testo del gioco verrà visualizzato in questo modo.

cionci
15-11-2005, 18:22
Meglio iniziare ad usare già da ora texture uniche per contenere dei font invece, visto che praticamente tutto il testo del gioco verrà visualizzato in questo modo.
Ma allora ci serve un ulteriore task che effettua le modifiche necessarie a Sprite...

fek
15-11-2005, 19:00
Ma allora ci serve un ulteriore task che effettua le modifiche necessarie a Sprite...

Puoi creare un oggetto texture e poi passarlo a Sprite nel costruttore. Se il costruttore non c'e', aggiungerlo (con relativo test) e' abbastanza banale.

Vifani
15-11-2005, 23:59
Mi prenoto per il 5.2.5.

Penso di farcela in due giorni a partire dalla conclusione del task 5.2.4.

VICIUS
16-11-2005, 00:39
Mi prenoto per il 5.2.5.

Penso di farcela in due giorni a partire dalla conclusione del task 5.2.4.
Assegnato.

ciao ;)

^TiGeRShArK^
16-11-2005, 08:29
Ok :)
Meglio domani dopo le 19.00 perchè più tardi devo andare via e stasera non ci sono.
Per evitare stragi di massa sì, sarebbe meglio :Prrr:
ehm...
ci potrebbe essere un problemino...
ieri sera a mezzanotte meno qualcosa mi è crollata la connessione UMTS...
spero ke oggi abbiano risolto il problema altrimenti non ho idea d cosa fare..
cmq verso le 5 di pom controllo se mi fa collegare e v faccio sapere

71104
16-11-2005, 11:31
siccome il task della storia 1 non va avanti (qualcuno si prenoti!! :cry: ) provo a fare una test list per il task di questa storia; io creerei una classe Score da utilizzare per visualizzare i punteggi; la classe deve creare un vettore di 10 Sprite presi da particolari posizioni di una texture e disegnarli secondo un certo campo intero che mantiene il punteggio.
aspetti da testare:
- caricamento della texture, eccezione in caso di texture not found
- verifica dell'assegnazione delle coordinate corrette della texture allo sprite
- assegnazione e retrieval dello score (getter e setter dello score insomma)
- disegno degli sprites (verifica che siano quelli giusti con un certo score di prova)

fek
16-11-2005, 11:54
siccome il task della storia 1 non va avanti (qualcuno si prenoti!! :cry: ) provo a fare una test list per il task di questa storia; io creerei una classe Score da utilizzare per visualizzare i punteggi; la classe deve creare un vettore di 10 Sprite presi da particolari posizioni di una texture e disegnarli secondo un certo campo intero che mantiene il punteggio.
aspetti da testare:
- caricamento della texture, eccezione in caso di texture not found
- verifica dell'assegnazione delle coordinate corrette della texture allo sprite
- assegnazione e retrieval dello score (getter e setter dello score insomma)
- disegno degli sprites (verifica che siano quelli giusti con un certo score di prova)

Va bene. Io chiamerei solo la classe Number e non Score. Ma e' un dettaglio.

cionci
16-11-2005, 14:13
Me lo prendo io il task 5.2.1 e lascio il 5.2.3 così vi faccio andare avanti...

Tempo stimato 1 giorno...
Però realizzo una classe aggiuntiva, perchè aggiungere quelle funzionalità a Grid non mi sembra per niente coerente...

cionci
16-11-2005, 15:20
classe GridManager:

class GridManager
{
private Grid grid;

public GridManager(Grid grid);

public void update();
}

Il test:

public testBottomCollisionAndNewGemCreation()
{
grid.insertGemAt(13,4);

gridManager.update();

Gem newGem = grid.getGemUnderControl();

assertTrue("gem isn't dropped", gem.isDropped());
assertNotSame("new gem is not created", gem, newGem);

Gem newGem2 = grid.getGemAt(0,4);

assertSame("gem is not correctly positioned", newGem, newGem2);
}

fek
16-11-2005, 16:54
Hmm, non mi piace il nome GridManager. Il Manager pattern e' un'altra cosa, ma non saprei trovargli un nome migliore. Il che mi fa pensare che questa classe non ha un ruolo chiaro e preciso.

Puoi mettere questo codice dentro Grid e poi vediamo come tirare fuori un'altra classe magari raggruppando dell'altro comportamento?

cionci
16-11-2005, 19:35
Il task 5.2.1 dovrebbe essere completato...

C'è un problema durante il gioco... Se si va a finire su una gemma già caduta si genera un'eccezione...

Ho provato a catchare le eccezioni, ma si va a perdere il controllo delle gemme prima della collisione quindi le nuove gemme non vengono generate...

Il problema si dovrebbe risolvere con le collisioni...

Jocchan
16-11-2005, 19:55
Il task 5.2.1 dovrebbe essere completato...

C'è un problema durante il gioco... Se si va a finire su una gemma già caduta si genera un'eccezione...

Ho provato a catchare le eccezioni, ma si va a perdere il controllo delle gemme prima della collisione quindi le nuove gemme non vengono generate...

Il problema si dovrebbe risolvere con le collisioni...

Credo sia normale, dato che ancora le collisioni non vengono valutate :D

cover
16-11-2005, 20:04
Ho provato, l'eccezione però capita solo quando ci si sposta lateralmente(prima di toccare il fondo) su una già caduta, se in caduta verticale cade su un'altra la sostituisce (graficamente), ma non avviene nessuna eccezione..

Jocchan
16-11-2005, 20:05
Don't worry, gli altri task sono fatti apposta per eliminare questo problema ;)

cionci
17-11-2005, 11:00
C'è un bug nella riproduzione dei suoni... In pratica se il suono viene riprodotto una prima volta, la seconda non viene riprodotto...
In particolare mi riferisco al suono della gemma che tocca il fondo...

public void play()
{
if(!testing)
{
AL10.alSourcePlay(source);
}
wasPlayed = true;
}

Il programma arriva ad eseguire correttamente questa funzione, ma AL10.alSourcePlay(source) non produce alcun suono...

cionci
17-11-2005, 11:47
Ho individuato anche un altro bug relativo all'audio... Chi fosse interessato alla risoluzione venga qua: http://www.hwupgrade.it/forum/showthread.php?p=10235821#post10235821

fek
17-11-2005, 12:13
C'è un bug nella riproduzione dei suoni... In pratica se il suono viene riprodotto una prima volta, la seconda non viene riprodotto...
In particolare mi riferisco al suono della gemma che tocca il fondo...

public void play()
{
if(!testing)
{
AL10.alSourcePlay(source);
}
wasPlayed = true;
}

Il programma arriva ad eseguire correttamente questa funzione, ma AL10.alSourcePlay(source) non produce alcun suono...

Ottima scoperta.
E' un bug della libreria o nostro? Puo' essere testato il fix?

cionci
17-11-2005, 14:04
Sinceramente non lo so... Stavo cercando di riprodurlo con una prova, ma come vedi nel thread non ci sono riuscito, anzi il comportamento era ancora diverso...

cover
17-11-2005, 18:42
c'è un piccolo problema (bug?) nell'aggiornamento della cella mentre il diamante si sta spostando, perchè aggiorna la cella quando arriva a metà e non quando il diamante la occupa tutta. Quindi in questo modo il diamante viene fermato a metà cella, però la soprapposizione funziona ^^
Ora provo a vedere se riesco a tirar fuori un test per questo problema, si accettano molto volentieri consigli :D

cionci
17-11-2005, 18:46
Sinceramente io questo problema non l'ho mai notato...

cionci
17-11-2005, 19:14
Questa è la funzione che fa passare la gemma di riga quando la metà supera il bordo:

private boolean isGemOnNextRow(Gem gem, Cell cell)
{
final float gemNextPosition = gem.getY() + actualGravity;
final float rowBottomBound = cell.row() * yStep + bounds.top();
return (gemNextPosition - rowBottomBound) > gem.getHeight() / 2;
}

Se non sbaglio questa cosa non era stata richiesta...

cover
17-11-2005, 19:28
Quando abbiamo iniziato ieri il task c'era già quel metodo, non sò chi l'ha inserito ^^

cisc
17-11-2005, 20:39
quel metodo l'abbiamo aggiunto io ed fpitt nel nostro pair programming, nel task che chiedeva di passare il controllo della collisione a Grid (e altro, adesso non ricordo), cmq, il comportamento di far passare la gemma alla riga successiva se si supera la metà era stato scelto in mancanza di un'esigenza particolare allora che ci imponesse un comportamento diverso, dopo l'approvazione di fek, cmq modificatelo nel modo che intendente più giusto;)

P.S: scusate ragazzi se in questi giorni non sono stato molto presente, purtroppo ho poco tempo a disposizione, cmq cerchero di mantenermi aggiornato e di cercare di fare qualche task

cionci
17-11-2005, 21:07
Ho risolto il bug...fra poco faccio il commit...

cionci
17-11-2005, 21:59
Provate pure se vi soddisfa !!! ;)

cover
17-11-2005, 22:45
Sei un mostro... ^^
Ce la farò anch'io pian piano... :Prrr:

DanieleC88
18-11-2005, 12:59
Azz, voi state al quinto ciclo e nessuno mi dice niente! VICIUS! Potevi avvisarmi?! :D :Prrr:

Be', sono stato particolarmente impegnato in questo periodo, e continuerò ad avere un bel po' da fare, ma posso concentrarmi di più sul gioco, adesso. ;)
Se qualcuno vuole fare pair programming con me (vi avverto: ho da imparare, non date niente per scontato...), sono disponibile per il task 5.2.3, che sembra ancora orfano. :)

VICIUS
18-11-2005, 13:02
Azz, voi state al quinto ciclo e nessuno mi dice niente! VICIUS! Potevi avvisarmi?! :D :Prrr:
Se sei lento che ci posso fare ? :asd:

Be', sono stato particolarmente impegnato in questo periodo, e continuerò ad avere un bel po' da fare, ma posso concentrarmi di più sul gioco, adesso. ;)
Se qualcuno vuole fare pair programming con me (vi avverto: ho da imparare, non date niente per scontato...), sono disponibile per il task 5.2.3, che sembra ancora orfano. :)
Tutto tuo. Stima in giorni? I test a quando ?

ciao ;)

DanieleC88
18-11-2005, 14:28
Tutto tuo. Stima in giorni? I test a quando ?

ciao ;)
Ah, mi lasci solo? :D
Be', ci metterò alcuni giorni, mi devo rileggere un po' il codice del gioco, ve l'ho detto che sono rimasto indietro. I test? Appena possibile. :)

71104
19-11-2005, 00:04
ho fatto il commit del mio task; premesso che servono alcuni perfezionamenti, vorrei un parere di fek e di qualcun altro sul codice che ho scritto; in particolare non mi convince molto questo test:

public void testSpriteTextures()
{
for (int i = 0; i < 10; i++)
{
Rectangle area = score.getDigit(i).getViewArea();
assertEquals(area.left(), (float)((i % 5) * Score.DIGIT_WIDTH));
assertEquals(area.top(), (float)((i / 5) * Score.DIGIT_HEIGHT));
assertEquals(area.getWidth(), (float)Score.DIGIT_WIDTH);
assertEquals(area.getHeight(), (float)Score.DIGIT_HEIGHT);
}
}

che serve a testare la corretta assegnazione delle coordinate della texture agli sprites; secondo voi si poteva fare in modo più semplice?

a proposito, se volete fare una prova di visualizzazione di uno score basta aggiungere un nuovo oggetto score al layer manager; come parametro al costruttore bisogna passare il nome della texture, "gfx/common/score_16x24"; poi chiamate setValue, eventualmente setOrigin, e voilà! :D

vedo che il bug delle collisioni laterali dei diamanti è ancora presente... cionci, ho capito male o lo avevi corretto?? :confused:

cionci
19-11-2005, 09:19
vedo che il bug delle collisioni laterali dei diamanti è ancora presente... cionci, ho capito male o lo avevi corretto?? :confused:
Non è un bug !!! E' il task 5.2.3 che deve essere ancora svolto...

cionci
19-11-2005, 09:35
Come mai in AllTests.java ci sono solo questi test ?

public static Test suite()
{
TestSuite suite = new TestSuite("Tests for it.diamonds.tests");
//$JUnit-BEGIN$
suite.addTestSuite(TestGame.class);
suite.addTestSuite(TestGemMove.class);
suite.addTestSuite(TestCellsideCollision.class);
suite.addTestSuite(TestBackground.class);
suite.addTestSuite(TestGrid.class);
//$JUnit-END$
return suite;
}

fek
19-11-2005, 09:54
Come mai in AllTests.java ci sono solo questi test ?

public static Test suite()
{
TestSuite suite = new TestSuite("Tests for it.diamonds.tests");
//$JUnit-BEGIN$
suite.addTestSuite(TestGame.class);
suite.addTestSuite(TestGemMove.class);
suite.addTestSuite(TestCellsideCollision.class);
suite.addTestSuite(TestBackground.class);
suite.addTestSuite(TestGrid.class);
//$JUnit-END$
return suite;
}


Perche' gli altri sono divisi in altri package. Ma non ho ancora capito di preciso come funziona AllTests. Io clicco col destro sul package .tests e lancio di la'.

fek
19-11-2005, 09:56
a proposito, se volete fare una prova di visualizzazione di uno score basta aggiungere un nuovo oggetto score al layer manager; come parametro al costruttore bisogna passare il nome della texture, "gfx/common/score_16x24"; poi chiamate setValue, eventualmente setOrigin, e voilà! :D

Puoi scrivereu un costruttore che fornisca gia' il nome della texture giusto? Semplifica l'interfaccia esterna.

cionci
19-11-2005, 10:03
Perche' gli altri sono divisi in altri package. Ma non ho ancora capito di preciso come funziona AllTests. Io clicco col destro sul package .tests e lancio di la'.
In questo modo lanci sia i test di AllTests che gli altri... Quindi esegui i alcuni test due volte... Io clickavo con il destro su AllTests e li lanciavo da lì...
A questo punto tanto vale eliminare AllTests...

fek: che ne dici di spostare Cell all'interno di Gem ? In questo modo semplifichiamo di molto il codice di Grid...

fek
19-11-2005, 10:29
In questo modo lanci sia i test di AllTests che gli altri... Quindi esegui i alcuni test due volte... Io clickavo con il destro su AllTests e li lanciavo da lì...
A questo punto tanto vale eliminare AllTests...

Sono d'accordo.


fek: che ne dici di spostare Cell all'interno di Gem ? In questo modo semplifichiamo di molto il codice di Grid...

Si', e' un po' che mi frulla questa idea. Vuoi provare tu a vedere come esce?
Fai il refactoring, guarda se il codice si semplifica e sembra piu' ordinato, se si' allora fai pure il commit.

cionci
19-11-2005, 10:31
Ok... Mi è venuto in mente perchè quel FindGemCell puzzava un po' :)

fek
19-11-2005, 10:31
ho fatto il commit del mio task; premesso che servono alcuni perfezionamenti, vorrei un parere di fek e di qualcun altro sul codice che ho scritto; in particolare non mi convince molto questo test:

Hai scritto il metodo draw() non Test Driven, ti taglio entrambe le manine :)

Puoi riscriverlo per favore? Non e' testato.

Ho cambiato il nome da Score a Number: effettivamente quella e' una classe che disegna un numero, un concetto piu' generale del punteggio.

Il metodo extractDigit fa parte dell'interfaccia pubblica della classe? Non ve l'ho ancora detto, ma noi stiamo facendo "Black Box Testing", testiamo solo le interfacce pubbliche delle classi. Questo metodo non ne fa parte, sembra solo un metodo di servizio, ma capisco l'esigenza di testarlo; allora consiglierei di tirare fuori una classe Digit, con un metodo extract() pubblico e testare quello. Poi Number sara' implementato in termini di Digit.

Un'ultima cosa: non lanciare eccezioni dall'interno di un catch. In un solo test hai messo il controllo su una cifra negativa e un numero piu' grande di 9: questi sono due test separati, i test non si pagano, tienili pure separati :)

fek
19-11-2005, 10:36
Ok... Mi è venuto in mente perchè quel FindGemCell puzzava un po' :)

Visto che funziona? :D

fek
19-11-2005, 10:42
Giocando con la classe Number ho scoperto un nuovo refactoring di Eclipse:

- selezionate il nome della classe in un costrutto 'new NomeClasse()'
- menu Refactoring, opzione Introduce Factory
- inserite il nome del Factory Method e il nome della classe Factory (nel mio caso sempre Number)
- et voila'.... Eclipse crea il Factory Method per voi e sostituisce tutti i costruttori con la chiamata al metodo

Adorabile :D

Imparate a usare i refactoing di Eclipse, e' un gran divertimento (ma le prime volte provate a farveli a manina per capire come si fanno).

fek
19-11-2005, 10:48
71104:


assertEquals(10.0, pt.getX(), 0.001f);


Quando leggo 'pt' non so che cosa sia se non vado a vedere la dichiarazione, ed e' un mezzo secondo che preferisco risparmiare.


assertEquals(10.0, point.getX(), 0.001f);


Ora leggo 'point' e so' che e' un punto. Se non dai nomi significativi alle variabili ti taglio le manine :)

cionci
19-11-2005, 11:09
Il refactoring di gem e grid l'ho fatto... Lo vuoi vedere prima di commitarlo ?

fek
19-11-2005, 12:02
Il refactoring di gem e grid l'ho fatto... Lo vuoi vedere prima di commitarlo ?

Si' dai, postalo. Sono curioso.

cionci
19-11-2005, 12:05
Ormai ho fatto il commit :) E avevo anche rotto la build :doh:
Ma questa volta è colpa di SVN che ha fatto le bizze :stordita:
Comunque eccolo qui:

package it.diamonds;


import it.diamonds.engine.AbstractEngine;
import it.diamonds.engine.AbstractTimer;
import it.diamonds.engine.Config;
import it.diamonds.engine.Rectangle;
import it.diamonds.engine.input.Input;
import it.diamonds.engine.video.Drawable;
import it.diamonds.engine.video.Sprite;
import it.diamonds.engine.video.Texture;
import it.diamonds.mocks.GemFactoryForTesting;


public class Grid implements Drawable
{
private long inputDelay = 100;

private long lastInputTimeStamp;

private boolean empty = true;

private Sprite background;

private Gem grid[][];
private Gem gemUnderControl;

private float xStep;
private float yStep;

private float actualGravity;
private float normalGravity;
private float gravityMultiplier;

private Rectangle bounds;

private GemFactory gemFactory;


public Grid(int rows, int columns, Rectangle bounds, Config config,
GemFactory gemFactory)
{
grid = new Gem[rows][columns];

this.bounds = bounds;

xStep = (float)bounds.getWidth() / columns;
yStep = (float)bounds.getHeight() / rows;

Rectangle area = new Rectangle(0, 0, getWidth(), getHeight());

background = new Sprite(
bounds.left(),
bounds.top(),
area,
new Texture(
"grid-background"));

normalGravity = 0.5f;
actualGravity = normalGravity;
gravityMultiplier = (float)config.getIntProperty("GravityMultiplier");

this.gemFactory = gemFactory;

insertNewGem();
}


public static Grid createForTesting()
{
Grid grid = new Grid(14, 8,
new Rectangle(40, 40, 296, 488),
Config.createForTesting(),
new GemFactoryForTesting());

grid.removeGemFromGrid(grid.getGemUnderControl());
grid.gemUnderControl = null;
grid.empty = true;

return grid;
}


private void insertNewGem()
{
insertGemIntoColumn(4, gemFactory.create());
}


public float getGravity()
{
return normalGravity;
}


public long getInputDelay()
{
return inputDelay;
}


public void setInputDelay(long newDelay)
{
inputDelay = newDelay;
}


public void insertGem(int row, int column, Gem gem)
{
if(isGemAt(row, column))
{
throw new IllegalArgumentException();
}

if(gem.isPositioned())
{
throw new IllegalArgumentException();
}

empty = false;

gem.setCellPosition(row, column);
addGemToGrid(gem);

alignGemToCellUpperBound(gem);

setGemUnderControl(gem);
}


public void insertGemIntoColumn(int column, Gem gem)
{
insertGem(0, column, gem);
}


public boolean isEmpty()
{
return empty;
}


public boolean isGemAt(int row, int column)
{
return getGemAt(row, column) != null;
}


public Gem getGemAt(int row, int column)
{
try
{
return grid[row][column];
}
catch(ArrayIndexOutOfBoundsException e)
{
throw new IllegalArgumentException();
}
}


public void draw(AbstractEngine engine)
{
background.draw(engine);

for(int y = grid.length - 1; y >= 0; y--)
{
for(int x = 0; x < grid[y].length; x++)
{
Gem gem = getGemAt(y, x);
if(gem != null)
{
gem.draw(engine);
}
}
}
}


private void handleLeftKey(AbstractTimer timer)
{
setLastInputTimestamp(timer);

if(getGemUnderControl().getCellColumn() > 0)
{
removeGemFromGrid(getGemUnderControl());
getGemUnderControl().moveOneCellLeft();
addGemToGrid(getGemUnderControl());

getGemUnderControl().move(-xStep, 0);
}
}


private void handleRightKey(AbstractTimer timer)
{
setLastInputTimestamp(timer);

if(getGemUnderControl().getCellColumn() < grid[0].length - 1)
{
removeGemFromGrid(getGemUnderControl());
getGemUnderControl().moveOneCellRight();
addGemToGrid(getGemUnderControl());

getGemUnderControl().move(xStep, 0);
}
}


public void reactToInput(Input input, AbstractTimer timer)
{
if(input.isDownKeyPressed())
{
actualGravity = normalGravity * gravityMultiplier;
}
else
{
actualGravity = normalGravity;
}

if(timeFromLastInputHasElapsed(timer)
&& !input.areRightAndLeftKeysPressed())
{
if(input.isLeftKeyPressed())
{
handleLeftKey(timer);
}

if(input.isRightKeyPressed())
{
handleRightKey(timer);
}
}
}


private void alignGemToCellUpperBound(Gem gem)
{
gem.setPos(bounds.left() + gem.getCellColumn() * xStep, bounds.top()
+ gem.getCellRow() * yStep);
}


public void update()
{
if(getGemUnderControl() == null)
{
return;
}

if(gemCantMoveDown(getGemUnderControl()))
{
alignGemToCellUpperBound(getGemUnderControl());
getGemUnderControl().dropGem();

insertNewGem();
}
else
{
moveGem(getGemUnderControl());
}
}


public void setGemUnderControl(Gem gem)
{
if(!gem.isPositioned())
{
throw new IllegalArgumentException();
}

gemUnderControl = gem;
}


public Gem getGemUnderControl()
{
return gemUnderControl;
}


public float getWidth()
{
return bounds.getWidth();
}


public float getHeight()
{
return bounds.getHeight();
}


public void setGravity(float gravity)
{
if(actualGravity == normalGravity * gravityMultiplier)
{
actualGravity = gravity * gravityMultiplier;
}
else
{
actualGravity = gravity;
}

normalGravity = gravity;
}


private void moveGem(Gem gem)
{
if(hasGemMovedToNextRow(gem))
{
updateGemCell(gem);
}

applyGravity(gem);
}


private boolean hasGemMovedToNextRow(Gem gem)
{
final float gemNextPosition = gem.getY() + actualGravity;
final float rowUpperBound = gem.getCellRow() * yStep + bounds.top();
return gemNextPosition >= rowUpperBound;
}


private void updateGemCell(Gem gem)
{
if(gem.getCellRow() < grid.length - 1)
{
removeGemFromGrid(gem);
gem.moveOneCellDown();
addGemToGrid(gem);
}
}


private void addGemToGrid(Gem gem)
{
if(grid[gem.getCellRow()][gem.getCellColumn()] != null)
{
throw new IllegalArgumentException();
}

grid[gem.getCellRow()][gem.getCellColumn()] = gem;
}


private void removeGemFromGrid(Gem gem)
{
grid[gem.getCellRow()][gem.getCellColumn()] = null;
}


private void applyGravity(Gem gem)
{
gem.move(0, actualGravity);
gem.setMoved(true);
}


private boolean hasGemCollidedWithBottom(Gem gem)
{
final float gemNextPosition = gem.getY() + actualGravity;
final float gridBottomBound = bounds.bottom() - gem.getHeight();
return gemNextPosition > gridBottomBound;
}


private void setLastInputTimestamp(AbstractTimer timer)
{
lastInputTimeStamp = timer.getTime();
}


private boolean timeFromLastInputHasElapsed(AbstractTimer timer)
{
return timer.getTime() - lastInputTimeStamp > inputDelay;
}


public boolean isCellBelowFull(Gem gem)
{
if(gem.getCellRow() < grid.length - 1)
{
return isGemAt(gem.getCellRow() + 1, gem.getCellColumn());
}

return false;
}


private boolean gemCantMoveDown(Gem gem)
{
if(hasGemCollidedWithBottom(gem))
{
return true;
}

if(hasGemMovedToNextRow(gem) && isCellBelowFull(gem))
{
return true;
}

return false;
}
}

71104
19-11-2005, 12:10
Hai scritto il metodo draw() non Test Driven, ti taglio entrambe le manine :) ops... O.o' chiedo perdono ^^'

Puoi riscriverlo per favore? Non e' testato. ok.

Il metodo extractDigit fa parte dell'interfaccia pubblica della classe? Non ve l'ho ancora detto, ma noi stiamo facendo "Black Box Testing", testiamo solo le interfacce pubbliche delle classi. Questo metodo non ne fa parte, sembra solo un metodo di servizio, ma capisco l'esigenza di testarlo; allora consiglierei di tirare fuori una classe Digit, con un metodo extract() pubblico e testare quello. Poi Number sara' implementato in termini di Digit. aaaah, perfetto, era proprio quello che non capivo!! ti ringrazio, ora sistemo tutto!! :)

Un'ultima cosa: non lanciare eccezioni dall'interno di un catch. In un solo test hai messo il controllo su una cifra negativa e un numero piu' grande di 9: questi sono due test separati, i test non si pagano, tienili pure separati :) ok, sistemo anche questo :)
grazie di tutto, l'esperienza di Diamonds sta essendo molto utile per me (spero anche che mi sia utile quando farò corsi come Ingegneria del Software :D), avevo proprio voglia di programmare in un team (e con un Coach così poi!! troppo bene che m'è andata :D).

EDIT: sistemo tutto dopo pranzo :p

fek
19-11-2005, 12:16
Ormai ho fatto il commit :) E avevo anche rotto la build :doh:
Ma questa volta è colpa di SVN che ha fatto le bizze :stordita:

Lo sto guardando ora, va molto bene :)

Ho fatto un po' di refactoring per semplificare Gem e togliere un flag.

cionci
19-11-2005, 12:21
fek: ci avevo pensato anche io a farlo così... Il problema è che dopo andrebbe generata un'eccezione in caso si acceda a questi metodi e cell sia null:
public int getCellRow()
public int getCellColumn()
public void moveOneCellDown()
public void moveOneCellLeft()
public void moveOneCellRight()

fek
19-11-2005, 12:24
fek: ci avevo pensato anche io a farlo così... Il problema è che dopo andrebbe generata un'eccezione in caso si acceda a questi metodi e cell sia null:
public int getCellRow()
public int getCellColumn()
public void moveOneCellDown()
public void moveOneCellLeft()
public void moveOneCellRight()

Vedrai che l'eccezione la genera lui :D

Se vogliamo evitare un if per ogni metodo, possiamo usare un NullObject pattern.

darp
19-11-2005, 12:30
sto dando un'occhiata al codice per mantenermi al passo con le modifiche, e sto notando l'uso di Vector in buona parte del codice, c'è un motivo particolare per preferirlo a ArrayList (in genere si preferisce il secondo)?

L'unica giustificazione per l'uso di Vector è che supporta il multithreading mentre ArrayList no, anche se c'è il modo per usare ArrayList in multithreading, cmq per il momento non vedo multithreading

cisc
19-11-2005, 12:34
ops, ho postato con il profilo di mio fratello:D:D

cionci
19-11-2005, 12:34
Non lo so... Io l'ho usato perchè si chiamava ugale al Vector del C++ :D

fek
19-11-2005, 12:36
sto dando un'occhiata al codice per mantenermi al passo con le modifiche, e sto notando l'uso di Vector in buona parte del codice, c'è un motivo particolare per preferirlo a ArrayList (in genere si preferisce il secondo)?

L'unica giustificazione per l'uso di Vector è che supporta il multithreading mentre ArrayList no, anche se c'è il modo per usare ArrayList in multithreading, cmq per il momento non vedo multithreading

Non conoscevo questa differenza e non facciamo multithreading. Se vuoi cambiare i Vector in ArrayList, sei liberissimo. Ovviamente lancia i test e assicurati che tutto sia in ordine prima del commit.

BlueDragon
19-11-2005, 12:36
Ormai ho fatto il commit :) E avevo anche rotto la build :doh:
Ma questa volta è colpa di SVN che ha fatto le bizze :stordita:
Comunque eccolo qui:

Buongiorno Cionci, sempre al lavoro sul codice! :)
Che vuol dire SVN ha fatto le bizze?
Anzi, a questo proposito volevo fare un sondaggio..voi come fate commit/update? Stiamo usando tutti l'opzione Team-Synchronize With Repository oppure no? Da Team-Synchronize è possibile vedere lo stato di tutti i nostri file rispetto al repository e scegliere di cosa fare update, cosa committare e quali file sono "in conflitto" (cioé quelli che hanno subito modifiche sia in locale che sul repository, per cui non è chiaro qual'è la versione da usare). Per quelli in conflitto si può scegliere direttamente un update che tenterà un merge delle versioni, oppure potete prima fare Revert del vostro file e poi update.

Altra cosa molto interessante è usare l'opzione Compare With -> Revision.. e guardarsi come cambiano i file man mano che facciamo refactoring...la visualizzazione delle differenze è molto carina su eclipse..decisamente migliore di altri programmi che mi è capitato di usare :)

Devo dire che superata la fase iniziale per il settaggio dei parametri di avvio di Game, sono contento che sia stato scelto Eclipse :)

cionci
19-11-2005, 12:38
Buongiorno Cionci, sempre al lavoro sul codice! :)
Che vuol dire SVN ha fatto le bizze?
Ha dato un errore quando stavo cercando di rimuovere un file dal repository...
Anche io faccio come te ed è comodissimo...

fek
19-11-2005, 12:38
I passi per fare il commit sono:

1) update
2) risoluzione di eventuali conflitti
3) comparazione dei file modificati per vedere le differenze introdotte
4) commit

VICIUS
19-11-2005, 12:49
grazie di tutto, l'esperienza di Diamonds sta essendo molto utile per me (spero anche che mi sia utile quando farò corsi come Ingegneria del Software :D), avevo proprio voglia di programmare in un team (e con un Coach così poi!! troppo bene che m'è andata :D)
Per carità non usare metodologie agili nel corsi di ingegneria del software. Risparmiati il sicuro mal di testa che ti verra ogni volta che parli con il professore. :D

ciao ;)

Jocchan
19-11-2005, 12:57
BD ci sei per il task in pair programming della storia 1, così la archiviamo?

BlueDragon
19-11-2005, 13:02
BD ci sei per il task in pair programming della storia 1, così la archiviamo?
Ora sono online ma non so se ho abbastanza tempo..stavo cmq per postare i test necessari nel thread apposito. Ora provo a contattare 71104 :)

71104
19-11-2005, 13:33
Ora sono online ma non so se ho abbastanza tempo..stavo cmq per postare i test necessari nel thread apposito. Ora provo a contattare 71104 :) ricevuto e risposto ;)

71104
19-11-2005, 14:08
ho dato una sistemata a Number: ho aggiunto Number.Digit e modificato quindi il test per l'estrazione di una cifra; inoltre, ehm, ho rifatto il metodo draw in seguito all'aggiunta di ben 3 test! :D
i test servono a testare il numero di quadrati disegnati nel mock engine nel caso di un valore uguale a 0, nel caso di un valore con leading zeroes, e nel caso di un valore senza leading zeroes.

fek
19-11-2005, 14:30
Stesso discorso di extractDigit per questo metodo:


public Point getPointFromPosition(int position)
{
return new Point(origin.getX() + position * DIGIT_WIDTH, origin.getY());
}


Non deve essere pubblico. Sono certo che troverai il modo di testare la posizione delle cifre senza aver bisogno di questo metodo pubblico ;)

Jocchan
19-11-2005, 14:36
5.2.5: Vifani
Visualizzare nella casella dello score presente alle coordinate 219x421 il numero di diamanti presenti all'interno della griglia. Ogni cifra deve essere distanziata dall'altra 11 pixel.

Aggiungo due dettagli per le specifiche del task 5.2.5:
- il punteggio deve essere visualizzato nella casella dello score, ma allineato a destra
- dato che l'allineamento è a destra, è utile sapere che la casella dello score arriva a destra fino ad una coordinata utile x=378, quindi le unità dovranno avere sempre l'hot spot in coordinata x=367
;)

fek
19-11-2005, 14:46
Ho fatto un po' di refactoring di Digit.
Risultato netto: tre metodi in meno, un campo privato in meno, una classe statica in piu'.

E poi guarda questo:


public void draw(AbstractEngine engine)
{
boolean leadingZeroes = true;

for (int position = 0; position < 8; ++position)
{
int curDigit = Digit.extract(value, 8 - position);

if (0 != curDigit)
{
leadingZeroes = false;
}
else
{
if (leadingZeroes)
{
continue;
}
}

Sprite digitSprite = digits.get(curDigit);
digitSprite.setPos(origin.getX() + position * DIGIT_WIDTH, origin.getY());
digitSprite.draw(engine);
}
}


Che diventa questo:


public void draw(AbstractEngine engine)
{
for (int position = 0; position < 8; ++position)
{
int curDigit = Digit.extract(value, 8 - position);

if (0 == curDigit)
{
continue;
}

Sprite digitSprite = digits.get(curDigit);
digitSprite.setPos(origin.getX() + position * DIGIT_WIDTH, origin.getY());
digitSprite.draw(engine);
}
}


71104, dacci un'occhiata, c'e' sempre una soluzione piu' semplice ;)

Ma per vederla spesso serve partire da una soluzione che funziona.

Fai questo esercizio ogni volta che finisci di scrivere un metodo: guarda il codice che hai scritto, e prova a semplificarlo. Hai tutti i test che ti dicono se sbagli qualcosa.

71104
19-11-2005, 15:21
E poi guarda questo:

[...]

Che diventa questo:

[...]

ennò!! non ho provato ma mi sa che stavolta hai toppato! :D
(se non è così allora sono una burba e me ne scuso :p)

prova a vedere che succede se disegni "71104" con quel codice ;)

EDIT: anzi, ora ci voglio giusto fare un test!

71104
19-11-2005, 15:29
scritto e committato, ma per farlo passare ho dovuto riscrivere il flag "leadingZeroes" e il vecchio if a 5 piani :D

71104
19-11-2005, 15:31
Stesso discorso di extractDigit per questo metodo:


public Point getPointFromPosition(int position)
{
return new Point(origin.getX() + position * DIGIT_WIDTH, origin.getY());
}


Non deve essere pubblico. Sono certo che troverai il modo di testare la posizione delle cifre senza aver bisogno di questo metodo pubblico ;) hai ragione, ci avevo pensato anche io; ora però non posso, lo farò più tardi o forse domani.

fek
19-11-2005, 15:45
ennò!! non ho provato ma mi sa che stavolta hai toppato! :D
(se non è così allora sono una burba e me ne scuso :p)

prova a vedere che succede se disegni "71104" con quel codice ;)

EDIT: anzi, ora ci voglio giusto fare un test!

Hai ragione tu :D

Scrivi un test che espone il problema, perche' quando ho fatto il refactroring tutti i test sono passati.

fek
19-11-2005, 15:50
C'e' sempre una soluzione piu' semplice :D


boolean leadingZeroes = true;

for (int position = 0; position < 8; ++position)
{
int curDigit = Digit.extract(value, 8 - position);

if (0 == curDigit && leadingZeroes)
{
continue;
}

leadingZeroes = false;

Sprite digitSprite = digits.get(curDigit);
digitSprite.setPos(origin.getX() + position * DIGIT_WIDTH, origin.getY());
digitSprite.draw(engine);
}

cionci
19-11-2005, 16:23
fek: la build è rossa, ma credo che il problema sia altrove...

fek
19-11-2005, 16:29
fek: la build è rossa, ma credo che il problema sia altrove...

Sto facendo io casino con la build machine per copiare automaticamente i documenti sul server web...

Bear with me for a second :D

(odio quando mi viene in mente un'espressione inglese precisa per quello che voglio dire ma non la so tradurre in italiano)

cionci
19-11-2005, 16:41
fek: come la posso chiamare in inglese la classe che fa il preload dei wav e li mette nei buffer ?

^TiGeRShArK^
19-11-2005, 16:43
....PreloadAudio() ????:confused:

fek
19-11-2005, 16:43
fek: come la posso chiamare in inglese la classe che fa il preload dei wav e li mette nei buffer ?

Mi viene in mente solo preloadSounds().

cionci
19-11-2005, 16:46
SoundRepository ?

fek
19-11-2005, 16:49
SoundRepository ?

Parlavi della classe, vero.
SoundBank.

cionci
19-11-2005, 16:53
Aggiudicato :)

BlueDragon
19-11-2005, 17:18
Parlavi della classe, vero.
SoundBank.
Ed i metodi per caricare e prendere i vari suoni?
deposit() e withdraw()? :D

fek
19-11-2005, 17:36
Ed i metodi per caricare e prendere i vari suoni?
deposit() e withdraw()? :D

:D

vai a fare il tuo task tu! :D

cionci
19-11-2005, 18:15
Come si fa con una assert del JUnit a testare l'uguaglianza membro-membro di due classi ?

cionci
19-11-2005, 18:22
Questa sopra mi sa che l'ho trovata...
Altra cosa come si fa a scorrere tutti gli elementi in un Map ?

cionci
19-11-2005, 18:30
Trovato :)

cionci
19-11-2005, 18:37
Come si fa con una assert del JUnit a testare l'uguaglianza membro-membro di due classi ?
Questo non mi funziona... Devo verificare con un test che due sound, uno allocato nel test ed uno allocato in SoundBank, sia uguali...ma mi sa che è un casino...

BlackQuasar
19-11-2005, 20:45
Sto facendo io casino con la build machine per copiare automaticamente i documenti sul server web...

Bear with me for a second :D

(odio quando mi viene in mente un'espressione inglese precisa per quello che voglio dire ma non la so tradurre in italiano)

Ma e' semplice....

Orso con me per un secondo....no ?

:sofico:

71104
20-11-2005, 00:41
Ma e' semplice....

Orso con me per un secondo....no ?

:sofico:
a-a-a: sbagliato!! :nonsifa: è imperativo, questa è la traduzione corretta:
orsa con me per un secondo.


:|


MHWUAHWUAHWUAHWUAHUWAHUA :|

71104
20-11-2005, 00:42
C'e' sempre una soluzione piu' semplice :D DOH!!! mi hai fregato! :D

Jocchan
20-11-2005, 09:34
DOH!!! mi hai fregato! :D

Punti cardine da tenere a mente durante i lavori:

Mai fare a gara a chi finisce il task per primo, meglio procedere con calma, altrimenti perderemo molto più tempo in seguito
Evitiamo di complicarci la vita, esiste di certo una soluzione più semplice di quella che abbiamo pensato di implementare
MAI aggiungere elementi non richiesti esplicitamente dai task: se mai serviranno, se ne parlerà nelle prossime storie
Comunichiamo il più possibile, se qualcosa non è chiaro discutiamone tutti i dettagli fino ad eliminare ogni dubbio, anche il più insignificante


Il punto cardine numero due, come vedi, sta là per un motivo preciso ;)

Tornando seri, il task è finito ora? :)
Anche se ci sono altri refactoring da fare, l'interfaccia che Vifani dovrà usare per disegnare il punteggio è pronta?

fek
20-11-2005, 10:19
Il punto cardine numero due, come vedi, sta là per un motivo preciso ;)

Tornando seri, il task è finito ora? :)
Anche se ci sono altri refactoring da fare, l'interfaccia che Vifani dovrà usare per disegnare il punteggio è pronta?

Si', Raffaele e' good to go! (Ho sempre sognato di dirlo :D)

71104
20-11-2005, 10:51
salvo refactoring di un certo metodo (GetPointFromPosition) che non influenzerà il lavoro di Vifani ;)

Jocchan
20-11-2005, 12:28
@Vifani: c'era un errore nelle specifiche dei task, comunque per la tua parte di codice non cambia praticamente nulla:

Aggiungo due dettagli per le specifiche del task 5.2.5:
- il punteggio deve essere visualizzato nella casella dello score, ma allineato a destra
- dato che l'allineamento è a destra, è utile sapere che la casella dello score arriva a destra fino ad una coordinata utile x=378, quindi le unità dovranno avere sempre l'hot spot in coordinata x=367
;)

L'unica differenza è che basta disegnare l'hot spot della cifra più a destra (le unità) alle coordinate (368, 421) invece di (367, 421).

L'errore riguardante la coordinata in alto a sx del box sinistro del punteggio, che si trova in (291, 421) e non in (219, 421) per fortuna non riguarda nessuno (è un valore tutto sommato inutile per quello che dobbiamo fare).

71104
20-11-2005, 12:47
ragazzi, alcuni todos riguardanti il mio task:
1) testare getPointFromPosition
2) sovrapporre le cifre di 5 pixels in modo che siano distanziate di 11 pixels anziché 16, e ne entrino 8 nelle caselle degli scores
3a) modificare Number.setValue: test per numeri negativi (underflow)
3b) test per numeri maggiori di 99999999 (overflow): il numero non deve superare quel valore; se lo supera setValue lo setta al massimo a 99999999 (senza lanciare nessuna eccezione però, contrariamente a quanto succede nel punto 3a)

i punti 2 e 3 sono stati appena discussi con Jocchan.

Vifani
20-11-2005, 14:24
ragazzi, alcuni todos riguardanti il mio task:
1) testare getPointFromPosition
2) sovrapporre le cifre di 5 pixels in modo che siano distanziate di 11 pixels anziché 16, e ne entrino 8 nelle caselle degli scores
3a) modificare Number.setValue: test per numeri negativi (underflow)
3b) test per numeri maggiori di 99999999 (overflow): il numero non deve superare quel valore; se lo supera setValue lo setta al massimo a 99999999 (senza lanciare nessuna eccezione però, contrariamente a quanto succede nel punto 3a)

i punti 2 e 3 sono stati appena discussi con Jocchan.

Posso iniziare a lavorare al mio task o prevedi altre modifiche a breve ?

Vifani
20-11-2005, 14:29
Si', Raffaele e' good to go! (Ho sempre sognato di dirlo :D)

Sognavi di dire "Raffaele è good to go" oppure "good to go" ? :D

fek
20-11-2005, 14:35
"Good to go!" :D

Posso iniziare a lavorare al mio task o prevedi altre modifiche a breve ?

Sicuramente l'interfaccia pubblica rimarra' invariata.

Vifani
20-11-2005, 16:55
Aggiungo due dettagli per le specifiche del task 5.2.5:
- il punteggio deve essere visualizzato nella casella dello score, ma allineato a destra
- dato che l'allineamento è a destra, è utile sapere che la casella dello score arriva a destra fino ad una coordinata utile x=378, quindi le unità dovranno avere sempre l'hot spot in coordinata x=367
;)

Jocchan guarda che non mi trovo con le tue coordinate. Sono quelle relative allo score di destra o di sinistra? Perché quelle dette inizialmente sembrano essere quelle del punto centrale del riguardo score di sinistra, mentre 378 è relativa a quella destra.

Un'altra cosa. Per come è fatta la classe Number, la distanza tra le cifre risulta essere esattamente uguale alla dimensione di ogni quad relativo ad una cifra. Quindi quando dici che devono essere distanziate 11 pixel e le dimensioni in ampiezza di ogni cifra sono pari a 16 pixel, cosa devo fare?

Attualmente accade che se la prima cifra sta a x = 200, la seconda starà a x=216, ecc... tu vuoi che la seconda stia a 200+16+11? In tal caso ti avverto che i numeri diventano illeggibili perché la distanza tra una cifra e l'alra è enorme e nel riquadro score ne entrano pochissime.

In ogni caso per il momento i test che ho intenzione di eseguire essenzialmente sono due:

1) Test del numero delle gems presenti in una grid ad un inserimento
2) Test del numero delle gems presenti in una grid ad una rimozione

Se Jocchan mi fa capire bene come devono essere disposte le cifre, aggiungerò probabilmente qualche test relativo al loro posizionamento, distanza tra cifre, ecc...

Un'ultima cosa: non è eccessivo dichiarare come static le dimensioni in ampiezza e larghezza dei caratteri? useremo solo ed esclusivamente caratteri di una sola ampiezza e larghezza sullo schermo?

cionci
20-11-2005, 17:03
Leggi qui: http://www.hwupgrade.it/forum/showthread.php?p=10268136#post10268136

^TiGeRShArK^
20-11-2005, 18:47
ehm... raffaele quando finisci avvisami che devo provare ad integrare la classe Tile di cui avevo discusso ieri con fek per risolvere un problema concettuale che i background erano Sprite mentre concettualmente gli sprite servono per gli oggetti in movimento.....

Jocchan
20-11-2005, 18:47
Jocchan guarda che non mi trovo con le tue coordinate. Sono quelle relative allo score di destra o di sinistra? Perché quelle dette inizialmente sembrano essere quelle del punto centrale del riguardo score di sinistra, mentre 378 è relativa a quella destra.

Un'altra cosa. Per come è fatta la classe Number, la distanza tra le cifre risulta essere esattamente uguale alla dimensione di ogni quad relativo ad una cifra. Quindi quando dici che devono essere distanziate 11 pixel e le dimensioni in ampiezza di ogni cifra sono pari a 16 pixel, cosa devo fare?

Attualmente accade che se la prima cifra sta a x = 200, la seconda starà a x=216, ecc... tu vuoi che la seconda stia a 200+16+11? In tal caso ti avverto che i numeri diventano illeggibili perché la distanza tra una cifra e l'alra è enorme e nel riquadro score ne entrano pochissime.

In ogni caso per il momento i test che ho intenzione di eseguire essenzialmente sono due:

1) Test del numero delle gems presenti in una grid ad un inserimento
2) Test del numero delle gems presenti in una grid ad una rimozione

Se Jocchan mi fa capire bene come devono essere disposte le cifre, aggiungerò probabilmente qualche test relativo al loro posizionamento, distanza tra cifre, ecc...

Un'ultima cosa: non è eccessivo dichiarare come static le dimensioni in ampiezza e larghezza dei caratteri? useremo solo ed esclusivamente caratteri di una sola ampiezza e larghezza sullo schermo?


Allora, le coordinate in realtà riguardavano il task di 71104, non il tuo, così come la spaziatura di 11px (che è in realtà la distanza tra un hot spot e l'altro: indipendentemente dalla larghezza delle celle avremo che, se la prima cifra ha l'hot spot a x=200, la seconda lo avrà a 211, la terza a 222, etc., ma qui se la vede 71104).
L'unico valore che effettivamente ti serve è quello che ti ho segnalato io, ossia (368, 421), dove dovrà andare l'hot spot della cifra più a destra (le unità). Ci penserà la stessa classe Number a posizionare tutto il resto, quindi i test sul posizionamento non riguardano il tuo task, ma quello di 71104 (insomma, i due che hai elencato dovrebbero essere gli unici necessari ;) ).

P.S.: Comunque, le modifiche che dovrà fare 71104 sono in ogni caso interne, quindi per il tuo task non cambia nulla... l'unica differenza è che, dato che le coordinate non erano esatte, cambia di un pixel (!) la posizione in cui dovrà trovarsi l'hot spot delle unità. Tutto qui ;)

Leonida91
20-11-2005, 19:21
edit by leron: spam

cionci
20-11-2005, 20:20
A che punto è il 5.2.3 ? DanieleC88: magari vuoi che ti posti i test ?

Jocchan
20-11-2005, 20:42
A che punto è il 5.2.3 ? DanieleC88: magari vuoi che ti posti i test ?

Il 5.2.3 dovrebbe essere fermo, dato che va fatto in pair programming e Daniele è ancora da solo. Ti stai proponendo come volontario? :p

cionci
20-11-2005, 20:49
Io gli posso dare i test... Anzi ce li ho già pronti...però non gli posso stare dietro passo passo per lo sviluppo... Tra l'altro con le ultime modifiche a Grid fare questo task dovrebbe essere di una semplicità disarmante...

Jocchan
20-11-2005, 21:13
Benissimo, allora se anche Fek e/o Vicius danno il via libera magari Daniele può farlo da solo ;)

cionci
20-11-2005, 21:49
Ecco i test da mettere in TestGrid.java per DanieleC88:

public void testRightCollisionWithGem()
{
grid.insertGem(5, 2, gem1);
grid.insertGem(5, 1, gem2);
grid.setGemUnderControl(gem1);
grid.setGravity(0.0f);

Input input = Input.createForTesting();
input.generateKey(KeyCode.vk_Left);

try
{
grid.reactToInput(input, timer);
}
catch(IllegalArgumentException e)
{
fail("fail due to exception when erroneusly trying to move gem");
}

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testLeftCollisionWithGem()
{
grid.insertGem(5, 2, gem1);
grid.insertGem(5, 1, gem2);
grid.setGemUnderControl(gem1);
grid.setGravity(0.0f);

Input input = Input.createForTesting();
input.generateKey(KeyCode.vk_Left);

try
{
grid.reactToInput(input, timer);
}
catch(IllegalArgumentException e)
{
fail("fail due to exception when erroneusly trying to move gem");
}

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testLeftCollisionWithGemWhileMoving()
{
grid.insertGem(4, 2, gem1);
grid.insertGem(5, 1, gem2);
grid.setGemUnderControl(gem1);
grid.setGravity(1.0f);

grid.update();

Input input = Input.createForTesting();
input.generateKey(KeyCode.vk_Left);

try
{
grid.reactToInput(input, timer);
}
catch(IllegalArgumentException e)
{
fail("fail due to exception when erroneusly trying to move gem");
}

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testRightCollisionWithGemWhileMoving()
{
grid.insertGem(4, 2, gem1);
grid.insertGem(5, 3, gem2);
grid.setGemUnderControl(gem1);
grid.setGravity(1.0f);

grid.update();

Input input = Input.createForTesting();
input.generateKey(KeyCode.vk_Right);

try
{
grid.reactToInput(input, timer);
}
catch(IllegalArgumentException e)
{
fail("fail due to exception when erroneusly trying to move gem");
}

assertEquals("gem has moved", 2, gem1.getCellColumn());
}

A setUp bisogna aggiungere questo codice, ed ovviamente bisogna creare una variabile membro MockTimer ed importare la relativa classe...

timer = new MockTimer(grid.getInputDelay() + 1);

Vifani
20-11-2005, 23:21
Task 5.2.5 completato.

Test inseriti:

public void testCounterAfterInsertion()
{
grid.insertGem(1, 2, gem1);
assertEquals(1,grid.getNumberOfGems());
}

public void testCounterAfterRemotion()
{
testCounterAfterInsertion();
grid.removeGemFromGrid(gem1);
assertEquals(0,grid.getNumberOfGems());
}

public void testCounterAfterTwoInsertions()
{
grid.insertGem(1, 2, gem1);
grid.insertGem(3, 0, gem2);
assertEquals(2,grid.getNumberOfGems());
}

Commit effettuata, build verde.

fek
21-11-2005, 08:56
Bene :)

cionci
21-11-2005, 09:03
fek: dai un'occhiata al thread sui bug audio...

fek
21-11-2005, 09:40
fek: dai un'occhiata al thread sui bug audio...

Fatto. Tieni SoundBank (e i test) in caldo che mi piace. Quando Jocchan ha bisogno di queste funzionalita' l'aggiungiamo. Se il bug e' un problema del file mal formato (quindi della libreria) possiamo andare tranquillamente avanti cosi'.

cionci
21-11-2005, 09:44
Risolvo il problema dell'eccezione lanciata dopo N (variabile da scheda a scheda) istanze di Sound (credo che dipenda dal numero di suoni gestibili in contemporanea dalla scheda audio)...
Basta mettere Sound come variabile privata di GameGemFactory e passare quella alle varie istanze di Gem...

DanieleC88
21-11-2005, 15:07
Gente, io ho assegnato il task 5.2.3, ma qui leggo "(solo pair programming)"! Chi è il malcapitato che vuole provarci con me? Ripeto che questa sarebbe la mia prima esperienza di pair programming e che non metto mano al codice di Diamonds da un po'. Sono disponibile in genere dalle 14:30 alle 18:00. Accorrete numerosi! :D

cionci
21-11-2005, 15:13
Hai i test già pronti :fagiano:

VICIUS
21-11-2005, 18:09
Hai i test già pronti :fagiano:
Perfetto e anche questa coppia è creata. Buon lavoro.

ciao ;)

cionci
21-11-2005, 18:35
Perfetto e anche questa coppia è creata. Buon lavoro.
Non posso stare dietro alla pair programming... I test me li sono fatti perchè stavo riflettendo un po' sul progetto... Ho pensato che dopo tutto il refactoring della classe Grid realizzare le collisioni laterali sarebbe stato molto semplice...ed ho voluto provare... Infatti in 10 minuti ho scritto i test e in 5 minuti le modifche alla classe Grid per gestire le collisioni... :D

Ogni volta che guardo il codice mi meraviglio da quanto è semplice e da come diventa facile fare le cose dopo i vari refactoring...

fek
21-11-2005, 18:43
Ogni volta che guardo il codice mi meraviglio da quanto è semplice e da come diventa facile fare le cose dopo i vari refactoring...

:)

VICIUS
21-11-2005, 18:45
Non posso stare dietro alla pair programming... I test me li sono fatti perchè stavo riflettendo un po' sul progetto... Ho pensato che dopo tutto il refactoring della classe Grid realizzare le collisioni laterali sarebbe stato molto semplice...ed ho voluto provare... Infatti in 10 minuti ho scritto i test e in 5 minuti le modifche alla classe Grid per gestire le collisioni... :D
Ah cavolo. Pensavo ti fossi offerto per fare il task con Daniele.
Dunque visto che hai gia le modifiche pronte tienile in caldo. Se nessuno si offre volontario per aiutare daniele entro domani usiamo le tue cosi terminiamo questa storia e ci teniamo qualche giorno per finire la storia 1 e fare un po di refactoring.

Ogni volta che guardo il codice mi meraviglio da quanto è semplice e da come diventa facile fare le cose dopo i vari refactoring...
Si ci sono alcune parti veramente "belle" :D

ciao ;)

BlueDragon
21-11-2005, 23:07
Risolvo il problema dell'eccezione lanciata dopo N (variabile da scheda a scheda) istanze di Sound (credo che dipenda dal numero di suoni gestibili in contemporanea dalla scheda audio)...
Basta mettere Sound come variabile privata di GameGemFactory e passare quella alle varie istanze di Gem...
Bug "noto", l'avevamo notato anche agli inizi ma non era stato corretto perché "troppo presto".. :)
E' dovuto al fatto che noi allochiamo una nuova sorgente per ogni suono, quindi dopo un po' si raggiunge il limite della scheda audio, come hai detto :)
Stranissimo invece quell'altro bug del volume che capita solo con un wav specifico...

Mi associo sulla bellezza del codice..prendersene cura tutti assieme lo mantiene bello pulito.. :)

DanieleC88
22-11-2005, 12:39
Non posso stare dietro alla pair programming...
Peccato... c'è qualche volontario?

P.S.: grazie per i test. ;)

Jocchan
22-11-2005, 13:49
Visto che non si offre nessuno, e visto che - da quanto ho capito - dopo le ultime modifiche di Grid il problema dovrebbe essere piuttosto banale, vuoi provarci da solo?

fek
22-11-2005, 13:56
Va bene concludere il task da solo.

DanieleC88
22-11-2005, 14:13
Allora ci provo da solo. ;)

DanieleC88
23-11-2005, 09:01
Ieri ho avuto alcuni problemi, dovuti alla mancanza del solito -Djava.library.path=... in VM arguments, ma oggi ho risolto e credo di aver finito (il test passa!). Il problema è che Ant rompe perché ci sono linee che si ripetono nei test scritti da cionci. Provo a modificarlo e poi faccio il commit. ;)

cionci
23-11-2005, 09:05
Fai un metodo (nota che mettendo la gravità a zero, come ho messo nei primi test, il codice è praticamente identico per tutti i test e richiamare update non comporta spostamenti)... Mettilo in un metodo che non inizia per test e che abbia come parametro il tasto da simulare...

cionci
23-11-2005, 09:26
public void updateGridAndGenerateInput(float gravity, KeyCode key)
{
grid.setGemUnderControl(gem1);
grid.setGravity(gravity);
grid.update();

Input input = Input.createForTesting();
input.generateKey(key);

try
{
grid.reactToInput(input, timer);
}
catch(IllegalArgumentException e)
{
fail("fail due to exception when erroneusly trying to move gem");
}
}



public void testRightCollisionWithGem()
{
grid.insertGem(5, 2, gem1);
grid.insertGem(5, 1, gem2);

updateGridAndGenerateInput(0.0f, KeyCode.vk_Right);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testLeftCollisionWithGem()
{
grid.insertGem(5, 2, gem1);
grid.insertGem(5, 1, gem2);

updateGridAndGenerateInput(0.0f, KeyCode.vk_Left);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testLeftCollisionWithGemWhileMoving()
{
grid.insertGem(4, 2, gem1);
grid.insertGem(5, 1, gem2);

updateGridAndGenerateInput(1.0f, KeyCode.vk_Left);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testRightCollisionWithGemWhileMoving()
{
grid.insertGem(4, 2, gem1);
grid.insertGem(5, 3, gem2);

updateGridAndGenerateInput(1.0f, KeyCode.vk_Right);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}

DanieleC88
23-11-2005, 11:37
Grazie ancora, cionci, sapevo di dover fare in quel modo, ma mi ero dovuto allontanare, sono appena tornato. Comunque, ho fatto delle prove, e i vecchi test passano tranquillamente, mentre i nuovi falliscono in testLeftCollisionWithGem() e testRightCollisionWithGem(), non capisco perché. Ho provato a stampare alcuni messaggi in console per fare del "debugging", e pare che getGemUnderControl().getCellRow() venga influenzato dalla gravità, anche se è stata impostata a '0.0f'. Faccio altre prove e vi aggiorno sulla situazione.

DanieleC88
23-11-2005, 11:47
Per la precisione i messaggi sono questi:
testLeftCollisionWithGem(): generating input...
gemCantMoveLeft(): Testing isGemAt(6, 1): false
testLeftCollisionWithGem(): done.
testRightCollisionWithGem(): generating input...
gemCantMoveRight(): Testing isGemAt(6, 3): false
testRightCollisionWithGem(): done.
testLeftCollisionWithGemWhileMoving(): generating input...
gemCantMoveLeft(): Testing isGemAt(5, 1): true
testLeftCollisionWithGemWhileMoving(): done.
testRightCollisionWithGemWhileMoving(): generating input...
gemCantMoveRight(): Testing isGemAt(5, 3): true
testRightCollisionWithGemWhileMoving(): done.

Non capisco quel '6' come ci arrivi lì! Dovrebbe essere '5', visto che la gravità è '0.0f' e la riga di partenza è '5'.

cionci
23-11-2005, 11:58
Lo sospettavo...dovrebbe essere un errore dovuto ai float... Anche se solitamente la rappresentazione dello 0 dovrebbe essere esatta... E' probabile che quello 0.0f sommato alla posizione correnta porti la gemma a superare il limite della cella...poi indago su quell'errore...

public void generateInputForGrid(KeyCode key)
{
Input input = Input.createForTesting();
input.generateKey(key);

try
{
grid.reactToInput(input, timer);
}
catch(IllegalArgumentException e)
{
fail("fail due to exception when erroneusly trying to move gem");
}
}



public void testRightCollisionWithGem()
{
grid.insertGem(5, 2, gem1);
grid.insertGem(5, 1, gem2);

grid.setGemUnderControl(gem1);

generateInputForGrid(KeyCode.vk_Right);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testLeftCollisionWithGem()
{
grid.insertGem(5, 2, gem1);
grid.insertGem(5, 1, gem2);

grid.setGemUnderControl(gem1);

generateInputForGrid(KeyCode.vk_Left);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testLeftCollisionWithGemWhileMoving()
{
grid.insertGem(4, 2, gem1);
grid.insertGem(5, 1, gem2);

grid.setGemUnderControl(gem1);
grid.setGravity(1.0f);
grid.update();

generateInputForGrid(KeyCode.vk_Left);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}


public void testRightCollisionWithGemWhileMoving()
{
grid.insertGem(4, 2, gem1);
grid.insertGem(5, 3, gem2);

grid.setGemUnderControl(gem1);
grid.setGravity(1.0f);
grid.update();

generateInputForGrid(KeyCode.vk_Right);

assertEquals("gem has moved", 2, gem1.getCellColumn());
}

cionci
23-11-2005, 12:14
Ottimo...mi ha permesso di scoprire un bug di grid... Un >= al posto di un > ;)

Appena hai fatto iol commit di test e modifiche a grid faccio il commite anche delle modifiche per risolvere questo problema...

DanieleC88
23-11-2005, 12:41
Ottimo...mi ha permesso di scoprire un bug di grid... Un >= al posto di un > ;)

Appena hai fatto iol commit di test e modifiche a grid faccio il commite anche delle modifiche per risolvere questo problema...
Strano questo problema con i float... comunque era proprio per quello che non passavano, dopo la tua correzione funzionano. ;)

Ok, io il commit l'ho fatto, ma senza poter verificare con Ant se funzionasse tutto bene (chiedo scusa :(), ci ho lottato parecchio tempo ma ho perso... Bisogna trovare una soluzione con questi percorsi di Eclipse, da me - sotto Linux - ci vogliono sempre modifiche per far partire i test, non credo di essere l'unico ad avere questo problema.
CruiseControl dice che è tutto ok. Puoi procedere. :)

VICIUS
23-11-2005, 12:49
Bene ho visto ora che Daniele ha fatto il commit del suo task. Quindi questa storia si puo considerare finita. Ora abbiamo fino a venerdi per testare la build e fare un po di refactoring.

Ottimo lavoro a tutti.

ciao ;)

DanieleC88
23-11-2005, 12:57
Ottimo lavoro a tutti.
Pure a me? :)
A dire il vero quello che ho dovuto fare io è stato davvero poco, una cosa da cinque minuti. I problemi sono venuti con i percorsi e con i float, come hai visto. Altrimenti avrei fatto il commit pure ieri.

P.S.: ma tu un avatar normale proprio non lo sai trovare, eh? :D

VICIUS
23-11-2005, 13:05
Pure a me? :)
A dire il vero quello che ho dovuto fare io è stato davvero poco, una cosa da cinque minuti. I problemi sono venuti con i percorsi e con i float, come hai visto. Altrimenti avrei fatto il commit pure ieri.
Hai fatto il tuo task e funziona. Quindi hai fatto un ottimo lavoro. :)

P.S.: ma tu un avatar normale proprio non lo sai trovare, eh? :D
Parla l'uomo della galbusera. Certo che te e ano siete proprio una palla con sti avatar. :muro:

ciao ;)

DanieleC88
23-11-2005, 14:28
Hai fatto il tuo task e funziona. Quindi hai fatto un ottimo lavoro. :)
Troppo buono! :)
Parla l'uomo della galbusera.
LOL :D
Be', almeno sono io. Vabbe', trasferiamo questo dibattito su IRC.

ciao ;)

cionci
23-11-2005, 14:57
Non era un problema di float... Era un >= che avevo introdotto io ;)

Ora faccio le modifiche...

cionci
23-11-2005, 17:43
Ho fatto un po' di refactoring e corretto quel bug (con relativo test)...

Jocchan
23-11-2005, 17:47
Ottimo ;)
Ora per chiudere la storia mancano solo quei ritocchi di 71104 per il punteggio (ed i relativi test) ;)

71104
24-11-2005, 11:54
li ho committati giusto ora (sovrapposizione di 5 pixels delle cifre della classe Number).
purtroppo questi giorni ho avuto altro per la testa e non ho badato per niente a Diamonds :cry:

fek
24-11-2005, 12:02
li ho committati giusto ora (sovrapposizione di 5 pixels delle cifre della classe Number).
purtroppo questi giorni ho avuto altro per la testa e non ho badato per niente a Diamonds :cry:

Non c'e' problema, avrai tempo per rifarti. Ora. Finendo la Storia 1 :D

Adoro i volontari.

DanieleC88
24-11-2005, 12:20
Non c'e' problema, avrai tempo per rifarti. Ora. Finendo la Storia 1 :D

Adoro i volontari.
LOL :asd:

71104
24-11-2005, 15:16
Adoro i volontari. LOL! :D
be', se vuoi mi ri-prenoto per lo stesso task ( ^^' )
però guarda che lì un po' la colpa è stata anche di BD che non mi ha più contattato!!! :Prrr:
vabbè, stavolta BD appena lo vedo su MSN non mi scappa :read:

VICIUS
24-11-2005, 17:39
LOL! :D
be', se vuoi mi ri-prenoto per lo stesso task ( ^^' )
però guarda che lì un po' la colpa è stata anche di BD che non mi ha più contattato!!! :Prrr:
vabbè, stavolta BD appena lo vedo su MSN non mi scappa :read:
Il task è tutto tuo. E visto che nessuno vuole lavorare con te puoi fare il task anche da solo. Poi se trovi qualcuno da seviziare in Pair-Programming tanto meglio. :D

ciao ;)

fek
24-11-2005, 18:17
LOL! :D
be', se vuoi mi ri-prenoto per lo stesso task ( ^^' )
però guarda che lì un po' la colpa è stata anche di BD che non mi ha più contattato!!! :Prrr:
vabbè, stavolta BD appena lo vedo su MSN non mi scappa :read:

Non si distribuiscono colpe, non mi interessa. Mi interessa che il task sia concluso :)

Per il resto mi accodo a Vicius, pair-programming se trovi qualcuno altrimenti da solo.

71104
24-11-2005, 20:22
be', veramente in teoria dovevo fare il task in pair programming con BD, ma visto che non lo vedo spesso online e che mi sembra che i test da svolgere li abbia già postati, copio-incollo i test e faccio il task :D

fek
24-11-2005, 20:38
be', veramente in teoria dovevo fare il task in pair programming con BD, ma visto che non lo vedo spesso online e che mi sembra che i test da svolgere li abbia già postati, copio-incollo i test e faccio il task :D

Ho un'idea migliore, scrivi il codice test driven e usi i test di BD come test di accettazione :)

Perche' se non scrivi il codice test driven sai che succede alle tue manine... :p

BD avra' altri impegni ed e' perfettamente normale; il nostro modello di sviluppo e' fatto in modo che eventuali impegni di questo tipo non blocchino lo sviluppo per tutti.