View Full Version : [CICLO 16] Storia 2
Storia 2: Introduzione dell’Advanced Mode, selezionabile nel menu principale. Questa modalità differisce dal Versus Mode per l’aggiunta di un nuovo pezzo, la dinamite, senza colore né valore in punteggio, la cui percentuale di occorrenza è pari alla metà di un baule e modificabile in GameConfig, e di cui possono essere presenti su schermo fino a TRE pezzi contemporaneamente.
La png di ogni candelotto di dinamite contiene un display, in cui viene mostrato un numero compreso tra 1 e 3, a seconda dell’ordine in cui i candelotti sono stati creati. Premendo il tasto E (per il giocatore 1, per il giocatore 2 il tasto sarà M), verrà attivato il candelotto più “vecchio” tra quelli presenti nella griglia: invece di 1, verranno mostrati a ciclo continuo i frame con lo zero e il display vuoto, mentre in sottofondo verrà mandato in loop un file audio di allarme, che preavviserà l’esplosione imminente. Non appena questo verrà rilasciato, per il momento, il candelotto in questione verrà cancellato dalla griglia, senza mostrare alcuna esplosione ma riproducendo solo un file audio.
Task:
16.2.1: Jappilas: completato
Creare una nuova MenuAction per l'Adavanced Mode (terza voce del menu), e renderla selezionabile tramite le frecce direzzionali. Quando viene premuto invio deve partire una nuova partita.
16.2.2: cisc: completato
Creare un nuovo tipo di Droppables di nome Dynamite. La texture da usare è presente in gfx/droppables/advanced/dynamite.png. Il punteggio di questo nuovo droppable è zero e la sua probabilità deve essere una frazione di quella dei bauli. Il divisore deve essere controllabile via GameConfig.
16.2.3: thebol: completato
Modificare l'estrazione casuale delle gemme in modo che le dinamiti presenti all'interno di ogni griglia no superi mai le 3 unita.
16.2.4: Jappilas + thebol: completato
Modificare la texture del candelotto in base al ordine in cui questi vengono creati. Il primo candelotto, quello più anziano, deve usare la texture con il numero 1 la seconda quella con il numero due e cosi via.
16.2.5: Ufo13: completato
Aggiungere un uovo handler che permette di controllare l'esplosione dei candelotti di dinamite presenti nella griglia del giocatore. I tasti da usare sono E per il player 1 e M per il player 2. Qunado il tasto viene premuto il candelotto di dinamite piu anziano, con il numero minore, deve essere rimosso dalla griglia.
16.2.6: ^TiGeRShArK^: 4 giorni
Aggiungre l'animazione del candelotto quando si preme il tasto per farla esplodere. I frame da riprodurre in ciclo continuo sono gli ultimi due. La durata di questa animazione deve essere controllabile da GameConfig. Durante tutta l'animazione deve essere riprodoto in loop il suono di pericolo presente in "audio/sfx/tnt_alarm.ogg"
16.2.7: 71104: 1 giorno
Attivare la dinamite e il tasto per l'esplosione dei candelotti sono quando si seleziona nel menu l'Advanced Mode.
16.2.8:
Quando un candelotto viene cancellato il numero presente sopra a quelli ancora presenti nella griglia devono essere aggiornati e deve essere riabilitata l'estrazione dei candelotti.
ciao ;)
Non manca un taskettino per attivare la dinamite solo nel caso siamo in Advanced Mode??
...se è previsto per il futuro....Perdono!!! :ave: :ave:
Non manca un taskettino per attivare la dinamite solo nel caso siamo in Advanced Mode??
...se è previsto per il futuro....Perdono!!! :ave: :ave:
Hai ragione. Mi sono perso un task per strada :D
ciao ;)
Non manca un taskettino per attivare la dinamite solo nel caso siamo in Advanced Mode??
...se è previsto per il futuro....Perdono!!! :ave: :ave:
Non sbagli, la dinamite deve esserci SOLO nell'Advanced Mode.
jappilas
16-05-2006, 14:38
Non sbagli, la dinamite deve esserci SOLO nell'Advanced Mode.
domanda: il task 16.2.1 deve già "predisporre" per la dinamite o è sufficiente iniziare una partita con caratteristiche per il momento uguali al versus mode normale (clonazione momentanea della MenuAction versus mode) ? ;)
nel caso, potrei farlo io :)
domanda: il task 16.2.1 deve già "predisporre" per la dinamite o è sufficiente iniziare una partita con caratteristiche per il momento uguali al versus mode normale (clonazione momentanea della MenuAction versus mode) ? ;)
nel caso, potrei farlo io :)
Deve fare solo quello che c'è scritto là :)
Non si parla di dinamite, nè di altro.
jappilas
16-05-2006, 15:24
riadattati i test di reazione ad eventi up e down
aggiunto un test di partenza del gioco dopo selezione della scelta numero 3 in testGameLoop
aggiunte 2 righe in initialiseMenuItems e una MenuAction "barebone" che per ora fa solo partire il gioco
task finito? :sofico:
ps: la build è rotta per via del famigerato testAllTexturesLoadedBefore... :O
ps: la build è rotta per via del famigerato testAllTexturesLoadedBefore... :O
Colpa mia. Ho cancellato due texture dal preload per far partire il gioco che crashava all'avvio. Strano che i test passassero prima senza i file delle texture.
ciao ;)
task finito? :sofico:
Task finito, a quanto pare :)
Task finito, a quanto pare :)
Non ho fatto in tempo ad assegnarlo che già era finito :eek:
ciao ;)
mi prenoto per il 16.2.2, tempo 2 giorni
jappilas
16-05-2006, 21:57
e io per il numero 16.2.4 ;)
prenoto per il task 5, impiego 4 giorni
Test list per cominciare:
- Testare che la creazione di una dynamite avvenga senza eccezioni
- Testare che la dynamite resti sul frame 1 senza animazioni
- Testare che la dynamite abbia punteggio zero
- Testare che le dynamite abbiano probabilità richiesta (divisore probabilità dei chest settata in Config)
prendo il 16.2.3, tempo 2 giorni.
ps. e contemplata la possibilità che una gemsPair sia composta di 2 dinamiti?
immagino di no, ma non è specificato.
task 16.2.2 completato, in GameConfig ho messo un valore che rappresenta la probabilità della dinamite, indipendente al momento da altri valori, dopo averne discusso con Jocchan
prendo il 16.2.3, tempo 2 giorni.
ps. e contemplata la possibilità che una gemsPair sia composta di 2 dinamiti?
immagino di no, ma non è specificato.
Sì, è possibile. Evento raro ma comunque possibile.
forse allora ho fatto un errore nel mio task, ho evitato che si potessero generare due dinamite consecutive.....
forse allora ho fatto un errore nel mio task, ho evitato che si potessero generare due dinamite consecutive.....
Non cambia poi molto: in casi reali sarebbe un evento piuttosto raro.
Comunque, visto che il task non ne parlava, è YAGNI :)
perdono :( ......la posso sempre modificare.....
mia test list
-aggiungere metodo a grid per contare le dynamite presenti, e testare quello che restituisce
-testare che con 0,1,2 dynamite in grid, una dynamite viene aggiunta.
-testare che con 3 o > 3 dynamite in grdi, non venga generata la dinamite.
task fatto, mi appresto a committare.
Alla fine non ho fatto un metodo in grid, ma l'ho messo private in randomDroppableFactory.
Ho avuto qualche problema a portare grid in randomDroppableFactory, ho dovuto cambiare il costruttore di queue, e di randomDroppableFactory(e qualche create).
mi rendo conto solo ora di una cosa...
io il controllo lo faccio nella randomGemFactory, che viene chiamata per riempire la queue.
Per cui io il controllo lo faccio quando magari ci sono 3 dinamite, per cui nn la creo. Pero prima che la gemma arrivi a essere messa nella gemsPair, una dinamite in grid puo essere fatta esplodere, e questo non lo posso sapere.
Sempre per lo stesso discorso, devo anche controllare se ci sono dinamiti nella queue!(cosa che non ho fatto, ci guardo domani).
Sempre per lo stesso discorso, devo anche controllare se ci sono dinamiti nella queue!(cosa che non ho fatto, ci guardo domani).
questo discorso si puo evitare tenendo la queue a lunghezza 2 e usando il controllo di cionci per vedere se sono uscite 2 diamnods consecutive(quando capita lo considero come un +1 nel computo delle dinamiti in gird)
ora la queue è a 6, faccio dei test, e verifico se con questa modifica il problema non si presenta piu(sempre che si presenti :D )
jappilas
18-05-2006, 15:10
questo discorso si puo evitare tenendo la queue a lunghezza 2 e usando il controllo di cionci per vedere se sono uscite 2 diamnods consecutive(quando capita lo considero come un +1 nel computo delle dinamiti in gird)
quindi se il secondo giocatore è "in ritardo" di più di 2 gemspair rispetto all' avversario, comincerà a ricevere delle coppie diverse da quelle capitate all' avversario? :mbe:
quindi se il secondo giocatore è "in ritardo" di più di 2 gemspair rispetto all' avversario, comincerà a ricevere delle coppie diverse da quelle capitate all' avversario? :mbe:
questo è un side-effects del task.
O meglio, quando l'altro riceve un dinamite, tu ricevi un qualcos'altro.
Poi si riprende ad andare di pari passo.
questo è un side-effects del task.
O meglio, quando l'altro riceve un dinamite, tu ricevi un qualcos'altro.
Poi si riprende ad andare di pari passo.
...mmmhhh....non è molto bello....praticamente chi scoppia più dinamiti è più avvantaggiato???
Joooocccchhh.....?!?!??! :nera:
jappilas
18-05-2006, 15:32
a parte quello, ammetto di essere in seria difficoltà a raccapezzarmi sugli sprite i frame e le animazioni: chi ha voglia di darmi una breve illuminata? :help:
questo è un side-effects del task.
O meglio, quando l'altro riceve un dinamite, tu ricevi un qualcos'altro.
Poi si riprende ad andare di pari passo.
Ovviamente :)
...mmmhhh....non è molto bello....praticamente chi scoppia più dinamiti è più avvantaggiato???
Joooocccchhh.....?!?!??! :nera:
Non è affatto un vantaggio.
Pensa a un picchiaduro tipo Street Fighter Alpha: hai 3 barre da riempire per la supermossa. Cosa fai? Ne usi una per una mossa debole, o ne accumuli 3, rischiando, per una molto più potente?
Il concetto è lo stesso, e diamo al giocatore la possibilità di scegliere la propria strategia :)
jappilas
18-05-2006, 17:46
questo è un side-effects del task.
O meglio, quando l'altro riceve un dinamite, tu ricevi un qualcos'altro.
Poi si riprende ad andare di pari passo.
l' importante è che se uno lascia cadere le gemme posizionandole con calma mentre l' altro accelera il passo facendole scendere più velocemente, il primo possa continuare ad aspettarsi le stesse pair che sono capitate al secondo, dinamiti a parte (dal pdv della strategia è una cosa importante, almeno per me)
l' importante è che se uno lascia cadere le gemme posizionandole con calma mentre l' altro accelera il passo facendole scendere più velocemente, il primo possa continuare ad aspettarsi le stesse pair che sono capitate al primo , dinamiti a parte (dal pdv della strategia è una cosa importante, almeno per me)
E' fondamentale :) A parte i candelotti, tutto il resto deve restare uguale :)
jappilas
18-05-2006, 18:43
bene:
ora il problema è: come faccio a pescare il numero delle dinamiti da dentro la abstractDroppable... un aiutino? è tutto il pomeriggio che mi ci sto scervellando... :uh::what: :muro:
E' fondamentale :) A parte i candelotti, tutto il resto deve restare uguale :)
Capito...ma allora ci vuole un "padding" per la Pair che ha la dinamite.
Ovvero:
(D=dinamite, R=rubino,S=smeraldo,T=topazio)
P1|P2
----
R |R
R |R
----
D |S
S |S
----
S |T
T |T
----
Si può notare come ci sia uno sfasamento nella pair di P1....il problema è che padding metterci???
jappilas
18-05-2006, 19:21
Capito...ma allora ci vuole un "padding" per la Pair che ha la dinamite.
Si può notare come ci sia uno sfasamento nella pair di P1....il problema è che padding metterci???
io ci metterei una gemma qualunque di riempimento senza sfasare ;)
io ci metterei una gemma qualunque di riempimento senza sfasare ;)
è il qualunque che mi preoccupa...se poi capita una bella flashing-gem??
è un bel vantaggio se sei con l'acqua alla gola ;)
jappilas
18-05-2006, 20:22
intendevo una gemma normale ma si potrebbe mettere una stone compensativa :D
uh, anzi... :idea: si potrebbero mettere anche le stone nella coda delle gemspair :D
intendevo una gemma normale ma si potrebbe mettere una stone compensativa :D
uh, anzi... :idea: si potrebbero mettere anche le stone nella coda delle gemspair :D
Mi piace l'idea di una gemma semplice.
Si potrebbe fare un queue solo di gemme dal quale si pesca la gemma di padding.
In questo modo entrambi i giocatori si beccano le stesse gemme di padding ;)
Perfetto, vada per la queue :)
bene:
ora il problema è: come faccio a pescare il numero delle dinamiti da dentro la abstractDroppable... un aiutino? è tutto il pomeriggio che mi ci sto scervellando... :uh::what: :muro:
edit cazzata :\
bene:
ora il problema è: come faccio a pescare il numero delle dinamiti da dentro la abstractDroppable... un aiutino? è tutto il pomeriggio che mi ci sto scervellando... :uh::what: :muro:
non ho capito il problema....
Perfetto, vada per la queue :)
L'idea piace molto anche a me(mi basterebbe a questo punto passare grid solo a queue, e non a randomdroppableFActory) ma come la riempo la queue :D
L'idea piace molto anche a me(mi basterebbe a questo punto passare grid solo a queue, e non a randomdroppableFActory) ma come la riempo la queue :D
Sul codice relativo alla queue sono poco informato, ma io la gestirei come l'altra: ovvero seed iniziale e riempirla di solo droppableType.GEM
EDIT:Poi una volta che si ha la queue di Padding ci sarà JOC che deciderà con cosa è giusto rimepirla...anche perchè ci servirà anche per gli orologi ;)
Sul codice relativo alla queue sono poco informato, ma io la gestirei come l'altra: ovvero seed iniziale e riempirla di solo droppableType.GEM
EDIT:Poi una volta che si ha la queue di Padding ci sarà JOC che deciderà con cosa è giusto rimepirla...anche perchè ci servirà anche per gli orologi ;)
Allora dallo stesso seed faccio partire 2 random generator.
Il primo lo uso per la queue generale, il secondo per la queue delle gemme padding.
Approved?
jappilas
19-05-2006, 12:02
edit cazzata :\
no no no, adesso mi dici cosa intendevi prima di cancellare il post :D
non so come contare le dinamiti gia' in griglia prima della creazione della nuova Droppable, sicuramente sto sbagliando da qualche parte e qualsiasi cosa mi puo' dare un' ispirazione per capire dove ;)
Allora dallo stesso seed faccio partire 2 random generator.
Il primo lo uso per la queue generale, il secondo per la queue delle gemme padding.
Approved?
Per me è OK :D
Perfetto :)
Ovviamente la queue di padding deve contenere SOLO gemme :)
Perfetto :)
Ovviamente la queue di padding deve contenere SOLO gemme :)
Stasera se ho tempo mi ci metto :)
Prima buona notizia, la coda impostata a lunghezza 2 continua a funzionare perfettamente e dovrebbe da sola evitare il bug(da dimostrare con test =D) della 4 dinamite creata quando la terza era in coda ma non ancora messa in grid.
Ora guardo dove implementare il padding, se in Queue o in RandomDroppableFactory.
Oggi giocando ho notato una cosa stana. Se faccio un gruppo di candelotti di dinamite e ci appoggio sopra una FlashingGem questa cancella tutti i candelotti. Non dovrebbe comportarsi cosi giusto ?
ciao ;)
Oggi giocando ho notato una cosa stana. Se faccio un gruppo di candelotti di dinamite e ci appoggio sopra una FlashingGem questa cancella tutti i candelotti. Non dovrebbe comportarsi cosi giusto ?
ciao ;)
onestamente boh :D
aspettiamo cosa dice Jocchan :)
A lavoro non ho un cazzo da fare è ho introdotto il padding(un ulteriore randomDroppableFactory in queue, usate per prendere le gemme).
Appena arrivo a casa faccio commit :)
A lavoro non ho un cazzo da fare è ho introdotto il padding(un ulteriore randomDroppableFactory in queue, usate per prendere le gemme).
Appena arrivo a casa faccio commit :)
Solo se ci sono anche tutti i test :Prrr: :Prrr:
:D :D :D
Solo se ci sono anche tutti i test :Prrr: :Prrr:
:D :D :D
presenti =D
Oggi giocando ho notato una cosa stana. Se faccio un gruppo di candelotti di dinamite e ci appoggio sopra una FlashingGem questa cancella tutti i candelotti. Non dovrebbe comportarsi cosi giusto ?
ciao ;)
Hmmm... è una cosa imprevista, ma che sinceramente mi tenta :eek:
Comunque no, facciamo in modo che non avvenga, e cancelli SOLO gemme e bauli :)
Come vanno i task 3 e 4?
il 3 e stato committato ma manca ancora il padding.
L'ho gia implementato, ma riusciva a crearmi cmq 4 dinamiti, ora sto cercando di risolverlo.
Ho risolto il problema :D
pero ho 2 versioni della soluzione.
Una che funziona solo per queue di lunghezza 2, e l'altra che funziona per queue di lunghezza n(la seconda per decidere se si puo creare una dinamite controlla anche il numero di dinamiti presenti attualmente nella coda).
Quale rilascio?(direi la prima, se la coda > 2 e YANGI)
Ho risolto il problema :D
pero ho 2 versioni della soluzione.
Una che funziona solo per queue di lunghezza 2, e l'altra che funziona per queue di lunghezza n(la seconda per decidere se si puo creare una dinamite controlla anche il numero di dinamiti presenti attualmente nella coda).
Quale rilascio?(direi la prima, se la coda > 2 e YANGI)
ho rilasciato la versione che funziona con la coda lunga n(per arrivare a quell'altra basta togliere un metodo).
Una cosa che non ho fatto, ma secondo me sarebbe da fare, sarebbe introdurre il padding anche per quando non si possono creare delle flash?
Lo faccio?
ho rilasciato la versione che funziona con la coda lunga n(per arrivare a quell'altra basta togliere un metodo).
Una cosa che non ho fatto, ma secondo me sarebbe da fare, sarebbe introdurre il padding anche per quando non si possono creare delle flash?
Lo faccio?
Non ho capito. In quale caso non si possono creare delle flash??
Non ho capito. In quale caso non si possono creare delle flash??
In nessun caso :)
In nessun caso :)
possono esserci 2 flash di fila? ;)
possono esserci 2 flash di fila? ;)
pero in effetti in questo caso non ci puo essere disallineamento fra le 2 griglie....
pero in effetti in questo caso non ci puo essere disallineamento fra le 2 griglie....
Appunto ;)
vabbè va', siccome la classe LogPlayer ancora non si può scrivere e la storia 3 è bloccata, mi prendo il task 7; un giorno per realizzare l'abilitazione della dinamite, ma per l'abilitazione del tasto dovrò aspettare che il tasto venga introdotto ^^
^TiGeRShArK^
21-05-2006, 23:42
uff...
finalmente ho messo in piedi tutto l'ambiente sul pc "temporaneo"...
Per ora il merge con java web start non è possibile farlo xkè è tutto sull'altro pc, qdi mi prenderei il task 6...
Tempo previsto...boh... dato ke è da un bel pò ke non tocco il codice direi 4 giorni....
jappilas
22-05-2006, 11:38
seguendo il suggerimento dato nell' altro thread, controllo la gemspair e cambio il frame
l' idea sarebbe di controllare in successione:
if (gemPair.GetPivot()....isDynamite()) {...}
if (gemPair.GetSlave()....isDynamite()) {...}
quindi anche la numerazione verrebbe data prioritizzando la Pivot gem: e' un comportamento accettabile? ;)
lo scorso weekend non ho potuto dedicarmici (studio, MARC in FdG, varie ed eventuali), stasera dovrei rimetterci e possibilmente completare il task entro domani :sperem:
mi scuso per il ritardo e per il rompimento di scatole... :cry:
seguendo il suggerimento dato nell' altro thread, controllo la gemspair e cambio il frame
l' idea sarebbe di controllare in successione:
if (gemPair.GetPivot()....isDynamite()) {...}
if (gemPair.GetSlave()....isDynamite()) {...}
quindi anche la numerazione verrebbe data prioritizzando la Pivot gem: e' un comportamento accettabile? ;)
lo scorso weekend non ho potuto dedicarmici (studio, MARC in FdG, varie ed eventuali), stasera dovrei rimetterci e possibilmente completare il task entro domani :sperem:
mi scuso per il ritardo e per il rompimento di scatole... :cry:
direi che l'ordine è indifferente, visto che per gemsPair ci puo essere solo una dinamite :)
jappilas
22-05-2006, 12:00
direi che l'ordine è indifferente, visto che per gemsPair ci puo essere solo una dinamite :)
ah ok, mi sembrava che jocchan volesse non escludere le due dinamiti per pair, come eventualita' rara ma possibile :stordita:
seguendo il suggerimento dato nell' altro thread, controllo la gemspair e cambio il frame
l' idea sarebbe di controllare in successione:
if (gemPair.GetPivot()....isDynamite()) {...}
if (gemPair.GetSlave()....isDynamite()) {...}
quindi anche la numerazione verrebbe data prioritizzando la Pivot gem: e' un comportamento accettabile? ;)
lo scorso weekend non ho potuto dedicarmici (studio, MARC in FdG, varie ed eventuali), stasera dovrei rimetterci e possibilmente completare il task entro domani :sperem:
mi scuso per il ritardo e per il rompimento di scatole... :cry:
Entro oggi non riesci?
ah ok, mi sembrava che jocchan volesse non escludere le due dinamiti per pair, come eventualita' rara ma possiible :stordita:
ah e vero :|
pero l'implementazione non è ancora stata tolta.
jappilas
22-05-2006, 12:05
Entro oggi non riesci?
:sperem:
jappilas
22-05-2006, 19:45
update:
no entro oggi non riesco e penso non finchè non scopro che fine ha fatto il metodo setCurrentFrame() ... :mbe:
è stato spostato in qualche interfaccia, Marco; se ci fai caso, Bonfo ha fatto un refactoring (approvato da fek) per suddividere i compiti di Droppable in più interfacce, adesso il getter e il setter del current frame credo stiano nell'interfaccia AnimatedObject, implementata da AbstractDroppable.
update:
no entro oggi non riesco e penso non finchè non scopro che fine ha fatto il metodo setCurrentFrame() ... :mbe:
Come ha detto 71104:
droppable.getAnimatedObject().setCurrentFrame();
;)
jappilas
22-05-2006, 20:59
Come ha detto 71104:
droppable.getAnimatedObject().setCurrentFrame();
;)
quella l' ho superata
Dynamite dynamite = (Dynamite) gem; (con gem tipo Droppable)
dynamite.setCurrentFrame(3-count);
;)
adesso quel che perplime è che
if (gem.getGridObject().getType().isDynamite())
funziona per la pivot gem e solo per lei
se gem è la slave, saltano fuori N nullpointer exception... :mbe:
EDIT: per adesso faccio un controllo (if (gem != null) ) ma ci sarebbero un po' di test da rifattorizzare, in parecchi creano una gemsPair senza inizializzare la gemma slave ;)
Già...sono una marea i test da mettere a posto.
Ho già proposto una storia di solo refactoring dei test. :sofico:
In ogni caso...piuttosto che il cast usa il getter dell'interfaccia AnimatedObject ;)
^TiGeRShArK^
23-05-2006, 19:11
Aggiungre l'animazione del candelotto quando si preme il tasto per farla esplodere. I frame da riprodurre in ciclo continuo sono gli ultimi due. La durata di questa animazione deve essere controllabile da GameConfig. Durante tutta l'animazione deve essere riprodoto in loop il suono di pericolo presente in "audio/sfx/tnt_alarm.ogg"
Allora... così solo a leggere il task farei la seguente test-list (probabilmente da modificare a mano a mano che comprenderò meglio il codice):
1)Prima che il tasto esplosione venga spinto non deve partire l'animazione.
2)Prima che il tasto esplosione venga spinto non deve esserci il suono in riproduzione.
3)Quando il tasto esplosione è premuto deve iniziare la riproduzione dell'animazione.
4)Quando il tasto esplosione è premuto deve iniziare la riproduzione in loop del suono corretto.
5)Scaduto il tempo impostato in GameConfig deve finire l'animazione.
6)Scaduto il tempo impostato in GameConfig deve finire la riproduzione audio.
Ora inizio a guardare il codice e vedo :p
^TiGeRShArK^
23-05-2006, 19:29
mmmm...
domandina che mi sfugge...
devo fare partire SOLO l'animazione del candelotto o devo anche inserire l'esplosione? :mbe:
anke perkè da quello ke ho visto le esplosioni sono texture + grandi dei candelotti, quindi mi sa che sono proprio un oggetto a parte...
e nel primo caso, quali sarebbero i due frame da loopare?
Perchè nella dynamite vedo solo che ci sono i frame che visualizzano 3, 2, 1, 0 e niente.
Quello che è visualizzato ora tra l'altro è il 3....
SE non ho capito male, dovrebbe essere senza l'animazione dell'esplosione e dovresti passare tra il farme corrente e quello con lo 0.
I frame con 1, 2 o 3 vengono settati all'inserimento della dinamite in base all'ordine.
Spero di non aver sbagliato :rolleyes:
EDIT: comunque il task di UFo non è ancora stato completato, anzi...nemmeno quello di jappilas ;)
Esatto, per ora niente esplosione. I frame da mostrare in loop sono quello senza numeri e con lo zero.
ciao ;)
^TiGeRShArK^
23-05-2006, 20:43
Ok perfetto....
Per ora ho messo quest'animazione in loop con i relativi test...
ora mi resta da testare e implementare che dopo il timeout impostato da config l'animazione termini....
jappilas
23-05-2006, 21:37
Allora... così solo a leggere il task farei la seguente test-list (probabilmente da modificare a mano a mano che comprenderò meglio il codice):
1)Prima che il tasto esplosione venga spinto non deve partire l'animazione.
2)Prima che il tasto esplosione venga spinto non deve esserci il suono in riproduzione.
3)Quando il tasto esplosione è premuto deve iniziare la riproduzione dell'animazione.
4)Quando il tasto esplosione è premuto deve iniziare la riproduzione in loop del suono corretto.
5)Scaduto il tempo impostato in GameConfig deve finire l'animazione.
6)Scaduto il tempo impostato in GameConfig deve finire la riproduzione audio.
Ora inizio a guardare il codice e vedo :p
se non ricordo male, riparlandone con jocchan e riguardando il dev plan era emerso che l' animazione doveva sussistere tra gli eventi pressione e rilascio del tasto, e l' impostazione servire per l' intervallo di lampeggiamento ;)
jappilas
23-05-2006, 21:42
EDIT: comunque il task di UFo non è ancora stato completato, anzi...nemmeno quello di jappilas ;)
ieri sera era quasi pronta un ' implementazione che mostrava il display vuoto durante la caduta della gempair e il settaggio del numero al termine , a mo' di dinamite che "si arma" appena giunta a terra (cosa che mi era parsa di capire leggendo questo o il thread della storia 1)
siccome avevo capito male, devo ricominciare il task e r inviarne ulteriormente la conclusione, scusatemi :O
EDIT: se è accettabile mostrare il frame neutro nella "next box" e il frame col numero corretto mentre la gempair sta cadendo nella griglia il task è quasi completo :)
^TiGeRShArK^
23-05-2006, 22:14
Ok...
x stasera ho fatto un commit parziale con l'implementazione delle animazioni SENZA gestione del suono e SENZA la gestione dei tasti.
Tutti i test sono GREEN:
testIsAnimatedAfterActivation()
testAnimationLessThanUpdateRate()
testAnimationIsLooping()
testIsNotAnimatedAfterTimeout()
domani si continua....
jappilas
23-05-2006, 23:46
idea di test:
creo due droppable di tipo dynamite,
testo che appena create siano al frame neutro
le setto una a pivot e la inserisco alla griglia
l' altra a slave e la inserisco alla griglia
testo che abbiano i frame con i numero 1 e 2 rispettivamente
public void testDynamiteFrameUpdate()
{
Droppable dynamite1 = gemFactory.createDynamite();
Droppable dynamite2 = gemFactory.createDynamite();
assertEquals("Dynamite1 must start at neutral frame", 3,
dynamite1.getAnimatedObject().getCurrentFrame());
assertEquals("Dynamite2 must start at neutral frame", 3,
dynamite2.getAnimatedObject().getCurrentFrame());
DroppablesPair gemsPair = new DroppablesPair(grid, environment.getConfig());
grid.insertDroppable(dynamite1, 13, 4);
gemsPair.setPivot(dynamite1);
grid.insertDroppable(dynamite2, 12, 4);
gemsPair.setSlave(dynamite2);
dynamite1.getFallingObject().drop();
dynamite2.getFallingObject().drop();
grid.updateDroppable(dynamite1);
grid.updateDroppable(dynamite2);
assertEquals("Dynamite1 must count 1", 2,
dynamite1.getAnimatedObject().getCurrentFrame());
assertEquals("Dynamite2 must count 2", 1,
dynamite2.getAnimatedObject().getCurrentFrame());
}
con le aggiunte che ho fatto
a Dynamite (3 addframe per: numeri 2 , 1 e diplay vuoto )
a Grid (metodo updateDynamiteCounters(Droppable gem) che chiama la countDynamitesAction)
ai metodi setSlave e setPivot di DroppablesPair,
questo test passa...domanda: il test è accettabile?
idea di test:
creo due droppable di tipo dynamite,
testo che appena create siano al frame neutro
le setto una a pivot e la inserisco alla griglia
l' altra a slave e la inserisco alla griglia
testo che abbiano i frame con i numero 1 e 2 rispettivamente
public void testDynamiteFrameUpdate()
{
Droppable dynamite1 = gemFactory.createDynamite();
Droppable dynamite2 = gemFactory.createDynamite();
assertEquals("Dynamite1 must start at neutral frame", 3,
dynamite1.getAnimatedObject().getCurrentFrame());
assertEquals("Dynamite2 must start at neutral frame", 3,
dynamite2.getAnimatedObject().getCurrentFrame());
DroppablesPair gemsPair = new DroppablesPair(grid, environment.getConfig());
grid.insertDroppable(dynamite1, 13, 4);
gemsPair.setPivot(dynamite1);
grid.insertDroppable(dynamite2, 12, 4);
gemsPair.setSlave(dynamite2);
dynamite1.getFallingObject().drop();
dynamite2.getFallingObject().drop();
grid.updateDroppable(dynamite1);
grid.updateDroppable(dynamite2);
assertEquals("Dynamite1 must count 1", 2,
dynamite1.getAnimatedObject().getCurrentFrame());
assertEquals("Dynamite2 must count 2", 1,
dynamite2.getAnimatedObject().getCurrentFrame());
}
con le aggiunte che ho fatto
a Dynamite (3 addframe per: numeri 2 , 1 e diplay vuoto )
a Grid (metodo updateDynamiteCounters(Droppable gem) che chiama la countDynamitesAction)
ai metodi setSlave e setPivot di DroppablesPair,
questo test passa...domanda: il test è accettabile?
se il test prima non passava e dopo le modifiche si, è gia qualcosa :)
unici appunto:
dal test non si capisce quando i frame vengono aggiornati, potrebbe essere la gemsPair.setPivot(dynamite1); la dynamite1.getFallingObject().drop(); o la grid.updateDroppable(dynamite2);
Mi fate un aggiornamento dei task?
jappilas
24-05-2006, 10:42
se il test prima non passava e dopo le modifiche si, è gia qualcosa :)
prima non poteva materialmente passare, nè il frame neutro nè il frame numerato venivano settati da nessuna parte (infatti con un solo addframe(0,0) nel costruttore di abstractdroppable, il frame iniziale della dinamite diventava quello che visualizava 3 sul display
invece capisco che come test sia abbastanza lungo da poter essere spezzato in almeno due sottotest, ma era una prima stesura, adesso riscrivo la test list :O
unici appunto:
dal test non si capisce quando i frame vengono aggiornati, potrebbe essere la gemsPair.setPivot(dynamite1); la dynamite1.; o la grid.updateDroppable(dynamite2);
scusate la svista, getFallingObject().drop() c' era quando stavo scrivendo il driver pensando a come gestire la gemspair in caduta , ma non serve più
edit: il test è stato riscritto, ed è diventato 4 test atomici
in realtà per ora l' aggiornamento è effettuato dentro setPivot() e setSlave()
questo perchè , se non ho sbagliato a tracciare il code path, sono le ultime funzioni che possono accedere la gemspair all' ultimo momento prima che questa venga messa in griglia, però non sono fiero di questa soluzione.. :cry:
^TiGeRShArK^
24-05-2006, 12:43
Mi fate un aggiornamento dei task?
:fiufiu:
Ok...
x stasera ho fatto un commit parziale con l'implementazione delle animazioni SENZA gestione del suono e SENZA la gestione dei tasti.
praticamente sono ad un terzo del task...
stasera dovrei fare un altro terzo e domani finire....
potrebbe essere anke ke finisco stasera, ma la vedo dura, perchè la parte degli input non la guarda da un'eternità e nn ho la minima idea di dove mettere le mani....
ah...e anke quella del suono ora ke ci penso... :stordita:
Cmq per giov sera/ven mattina presto (3.00/4.00...ad libitum :D)dovrebbe essere finito :p
ah e vero :|
pero l'implementazione non è ancora stata tolta.
Se è ancora presente, per favore NON toglietela.
Discutendo con Jappilas, mi sono accorto che ci risparmia un bel pò di seccature, ed in ogni caso si tratta di un evento molto raro, dunque portare questa probabilità a zero è un compromesso accettabilissimo.
se non ricordo male, riparlandone con jocchan e riguardando il dev plan era emerso che l' animazione doveva sussistere tra gli eventi pressione e rilascio del tasto, e l' impostazione servire per l' intervallo di lampeggiamento ;)
Inizialmente era così, ma parlandone con Vicius - non appena finalizzati i task - abbiamo deciso di aggiungere direttamente questo "timer" per l'esplosione (Jappilas, te l'avevo detto su MSN).
Rileggendo il testo del task, però, ho notato che manca un dettaglio fondamentale: oltre al timer, l'animazione deve terminare non appena il tasto viene rilasciato!
Se è ancora presente, per favore NON toglietela.
Discutendo con Jappilas, mi sono accorto che ci risparmia un bel pò di seccature, ed in ogni caso si tratta di un evento molto raro, dunque portare questa probabilità a zero è un compromesso accettabilissimo.
l'ho gia tolta :| :|
scherzavo =D
nella build di stamattina il controllo c'era ancora :)
l'ho gia tolta :| :|
scherzavo =D
nella build di stamattina il controllo c'era ancora :)
Va benissimo così.
Inizialmente era così, ma parlandone con Vicius - non appena finalizzati i task - abbiamo deciso di aggiungere direttamente questo "timer" per l'esplosione (Jappilas, te l'avevo detto su MSN).
Rileggendo il testo del task, però, ho notato che manca un dettaglio fondamentale: oltre al timer, l'animazione deve terminare non appena il tasto viene rilasciato!
Voglio che questo concetto d'ora in poi sia chiarissimo, e lo ripeteremo in ogni descrizione delle storie d'ora in poi: se in un task manca un qualsiasi dettagli, SI DEVE CHIEDERE SPIEGAZIONI. Non voglio che accada ancora che i dettagli mancanti siano aggiunti a propria totale discrezione, perche' potrebbero andare in conflitto con la visione del Customer. Non siamo noi il Customer, e' Jocchan. Noi cercheremo di essere il piu' possibile esaustivi nella descrizione dei task, ma voi chiedete al minimo dubbio.
Ripeto: chiedete informazioni per OGNI dettaglio mancante nella descrizione dei task.
jappilas
24-05-2006, 15:59
visto che visualizzare la dinamite col display vuoto nella box NEXT non soddisfa le specifiche, devo scoprire come passare al costruttore della Dynamite stessa o alla DroppableFactory un riferimento alla Grid in cui la droppable finirà ... un aiutino? :help:
Inizialmente era così, ma parlandone con Vicius - non appena finalizzati i task - abbiamo deciso di aggiungere direttamente questo "timer" per l'esplosione (Jappilas, te l'avevo detto su MSN).
si scusa, ultimamente sono davvero stordito :(
Ufo, mi dai una stima del tuo task? Sta bloccando l'avanzamento della Storia e abbiamo bisogno di completarlo o riassegnarlo entro domani.
jappilas
24-05-2006, 16:02
Sta bloccando l'avanzamento della Storia e abbiamo bisogno di completarlo o riassegnarlo entro domani.
anche il mio blocca tutto... mi dispiace... :O :cry:
anche il mio blocca tutto... mi dispiace... :O :cry:
Per favore, completalo col frame vuoto in Next, rimedieremo in seguito.
Abbiamo ancora troppe cose da fare.
anche il mio blocca tutto... mi dispiace... :O :cry:
Non serve dispiacerti, serve completarlo :)
Quindi sotto col lavoro, che siamo in ritardo con la Storia.
visto che visualizzare la dinamite col display vuoto nella box NEXT non soddisfa le specifiche, devo scoprire come passare al costruttore della Dynamite stessa o alla DroppableFactory un riferimento alla Grid in cui la droppable finirà ... un aiutino? :help:
perche al costruttore?
la dinamite viene costruita nella coda, se si assegnasse il valore 2, e poi prima che la gemma arrivi effettivamente sulla griglia si fa scoppiare quella precedente, il valore 2 è errato o sbaglio?
il valore non deve essere assegnato quando si ferma?
ps. non avevo letto il post di jocchan, cmq il problema rimane
jappilas
24-05-2006, 16:07
perche al costruttore?
la dinamite viene costruita nella coda, se si assegnasse il valore 2, e poi prima che la gemma arrivi effettivamente sulla griglia si fa scoppiare quella precedente, il valore 2 è errato o sbaglio?
il valore non deve essere assegnato quando si ferma?
fino a poco fa lo assegnavo chiamando una funzione di Grid da DroppablePair.setPivot /setSlave, cioè quando la gemspair è "concretizzata" per farla cadere nella griglia, correggetemi se sbaglio
ma l' idea era di visualizzare il numero corretto già nella casella Next... howto?
Thebol, il valore per ora viene dato in base all'ordine di creazione, nel task 8 penseremo ad aggiornare i valori.
jappilas
24-05-2006, 16:10
Quindi sotto col lavoro, che siamo in ritardo con la Storia.
tra l'altro mi fai pensare che sono anche in ritardo con gli esami e la tesi... :(
Per favore, completalo col frame vuoto in Next, rimedieremo in seguito.
Abbiamo ancora troppe cose da fare.
argh quando mi hai detto che non andava bene ho fatto revert di tutti i file editati... :cry:
argh quando mi hai detto che non andava bene ho fatto revert di tutti i file editati... :cry:
Basta piangere e rifai semplicemente il task. E rifallo semplice.
tra l'altro mi fai pensare che sono anche in ritardo con gli esami e la tesi... :(
argh quando mi hai detto che non andava bene ho fatto revert di tutti i file editati... :cry:
eclipse salva una local history per tutti i file
eclipse salva una local history per tutti i file
No no, meglio ripartire da zero.
jappilas
24-05-2006, 16:33
Basta piangere e rifai semplicemente il task. E rifallo semplice.
l' idea era di piazzare un
droppable.getAnimatedObject().setCurrentFrame(3 - grid.dynamiteCountAction.getNumOfDynamite());
più a monte possibile (cioè più vicino possibile alla creazione della droppable generica)
..con meno codice credo sia impossibile :stordita:
il punto è che mi serve un collegamento all' istanza di Grid ed è quello che non so come pescare ... :stordita: :stordita:
il punto è che mi serve un collegamento all' istanza di Grid ed è quello che non so come pescare ... :stordita: :stordita:
Sono certo che un modo (semplice) per far arrivare il valore che ti serve fin li' esiste. Non affogare in un bicchiere d'acqua.
jappilas
24-05-2006, 16:48
Sono certo che un modo (semplice) per far arrivare il valore che ti serve fin li' esiste. Non affogare in un bicchiere d'acqua.
forse passando per i costruttori di
GemQueue,
RandomDroppableFactory
DroppableFactory
ma, ehm, ho l' impressione che cambiando la parametrizzazione dei metodi si romperanno un po' di test... :stordita:
jappilas
24-05-2006, 17:02
Ho detto semplice.
com' era quel... "la semplicità richiede notevoli capacità di design"
appunto quelle che mi mancano per addentrarmi in quella parte del codice ... non è che posso tornare quando ho dato una ripassata a Ing del SW? :fagiano:
com' era quel... "la semplicità richiede notevoli capacità di design"
appunto quelle che mi mancano per addentrarmi in quella parte del codice ... non è che posso tornare quando ho dato una ripassata a Ing del SW? :fagiano:
Non faresti che peggiorare la situazione :p
Perché non provi con la prima idea che ti è venuta in mente? Non è il massimo dell'eleganza ma dovrebbe essere molto più semplice di tutti questi giri di costruttori :)
ciao ;)
^TiGeRShArK^
24-05-2006, 21:53
HELP!
Ho bisogno di creare un MockOggPlayer per testare l'audio di dynamite.....
Infatti l'OggPlayer dovrebbe permettere la riproduzione di un ogg in loop in un nuovo thread a quanto ho capito....
Il problema è ke devo fare implementare un interfaccia AudioPlayer sia a OggPlayer che al MockOggPlayer, altrimenti non ho come passare il mio mock a tutti...
BLue Dragon si era occupato della modifica della lib trb???
Cmq mi servono i sorgenti della lib modificata per Fargli estendere l'interfaccia comune...altrimenti non posso procedere col task....:help:
HELP!
Ho bisogno di creare un MockOggPlayer per testare l'audio di dynamite.....
Infatti l'OggPlayer dovrebbe permettere la riproduzione di un ogg in loop in un nuovo thread a quanto ho capito....
Il problema è ke devo fare implementare un interfaccia AudioPlayer sia a OggPlayer che al MockOggPlayer, altrimenti non ho come passare il mio mock a tutti...
BLue Dragon si era occupato della modifica della lib trb???
Cmq mi servono i sorgenti della lib modificata per Fargli estendere l'interfaccia comune...altrimenti non posso procedere col task....:help:
Scusa...ma i test relativi al loop della canzone di sottofondo di Rock allora non esistono???
Prova a veder come sono testati quelli.
^TiGeRShArK^
25-05-2006, 00:44
eh si ke esistono...
il problema è che quei test testano solamente un booleano in mockaudio ma in quest'ultima non è presente un musicplayer...
mi pare di aver capito che sia possibile istanziare solo UNA classe audio perchè altrimenti openAL da un errore dicendo che è stato già inizializzato...
Per questo avevo creato un getter nella classe audio per estrarmi il musicPlayer, in modo da potergli dire quale file audio riprodurre e per non interferire con la musica in sottofondo...
Ora però per testare questo musicPlayer devo crearmi un MockOggPlayer testabile.... e per fare questo la strada migliore penso sia crearmi un interfaccia e fare estendere quest'interfaccia sia al Mock ke all'Ogg...Se avete altri suggerimenti sparate pure :p
^TiGeRShArK^
25-05-2006, 00:50
mmmmm...
forse potrei pure provare un'altra strada...
ridefinirmi il metodo playMusic in audio passandogli il nome del file e facendolo suonare in un altro thread...
però se avessi i sorgenti sarebbe cmq meglio perchè come apro il file lo dovrei anke kiudere...
e non mi pare che ci sia niente di simile nella classe oggPlayer..
Se non chiudo niente rischiamo di portarci dietro un pò troppe cose sporche nella classe Audio :p
mmmmm...
forse potrei pure provare un'altra strada...
ridefinirmi il metodo playMusic in audio passandogli il nome del file e facendolo suonare in un altro thread...
però se avessi i sorgenti sarebbe cmq meglio perchè come apro il file lo dovrei anke kiudere...
e non mi pare che ci sia niente di simile nella classe oggPlayer..
Se non chiudo niente rischiamo di portarci dietro un pò troppe cose sporche nella classe Audio :p
Scusa....ma noi oltre al playBack del tema di Rock abbiamo il rmore delle gemme che cadono.
Questo come è testato???
mmmmm...
forse potrei pure provare un'altra strada...
ridefinirmi il metodo playMusic in audio passandogli il nome del file e facendolo suonare in un altro thread...
però se avessi i sorgenti sarebbe cmq meglio perchè come apro il file lo dovrei anke kiudere...
e non mi pare che ci sia niente di simile nella classe oggPlayer..
Se non chiudo niente rischiamo di portarci dietro un pò troppe cose sporche nella classe Audio :p
Tiger lascia perdere il suono. Il Task per aggiungere la riproduzione dei suoni .ogg è nella terza storia quindi ovviamente tu ora non puoi fare niente.
ciao ;)
cdimauro
25-05-2006, 08:38
com' era quel... "la semplicità richiede notevoli capacità di design"
Lascialo perdere quello, che è ancora fermo al K & R. :asd:
appunto quelle che mi mancano per addentrarmi in quella parte del codice ... non è che posso tornare quando ho dato una ripassata a Ing del SW? :fagiano:
Non è questo il problema, Marco: io nemmeno mi ricordo più come tirare fuori un diagramma dei casi d'uso, e per questo non mi autofustigo e corro a ripassare i testi universitari su cui ho studiato. Anzi, sinceramente non me ne frega niente di quello che ho DOVUTO studiare per passare quell'esame.
Il mio personalissimo consiglio che ti posso dare è: cerca di svuotare la mente da tutto quel nozionismo e concentrati soltanto sul problema che hai da affrontare.
Da esso estrapola i REQUISITI (questo sì) che il codice deve soddisfare, e ponili sotto forma di test.
Red: fai in modo che i test FALLISCANO.
Green: applica le MINIME modifiche al codice affinché non falliscano.
Refactor: se è possibile, rifattorizza il codice.
Quindi concentrati in primis soltanto sui test: tira fuori il codice che metta nero su bianco il "contratto" che dev'essere soddisfatto.
Una volta scritto un test, vedrai che il codice necessario per farlo passare per lo più "verrà fuori da sé".
Non so come spiegartelo in altro modo. Si tratta di un modus operandi che si acquisisce con l'esperienza: più ti eserciti a pensare Test Driven, più quest'approccio diventerà per te "naturale".
Appena ho un po' di tempo cerco di darti una mano per il tuo task (ma anche per gli altri: se avete la possibilità di farlo, aiutatelo!).
cdimauro
25-05-2006, 08:39
HELP!
Ho bisogno di creare un MockOggPlayer per testare l'audio di dynamite.....
Infatti l'OggPlayer dovrebbe permettere la riproduzione di un ogg in loop in un nuovo thread a quanto ho capito....
Il problema è ke devo fare implementare un interfaccia AudioPlayer sia a OggPlayer che al MockOggPlayer, altrimenti non ho come passare il mio mock a tutti...
BLue Dragon si era occupato della modifica della lib trb???
Cmq mi servono i sorgenti della lib modificata per Fargli estendere l'interfaccia comune...altrimenti non posso procedere col task....:help:
La butto lì: non potresti semplicemente estendere AudioInterface e/o SoundInterface per aggiungere questa funzionalità?
^TiGeRShArK^
25-05-2006, 09:47
Tiger lascia perdere il suono. Il Task per aggiungere la riproduzione dei suoni .ogg è nella terza storia quindi ovviamente tu ora non puoi fare niente.
ciao ;)
ah ecco..
non me n'ero accorto :fiufiu:
appena torna su il server reverto la parte del suono e faccio la gestione dei tasti :p
^TiGeRShArK^
25-05-2006, 09:49
La butto lì: non potresti semplicemente estendere AudioInterface e/o SoundInterface per aggiungere questa funzionalità?
no...avevo provato ovviamente, ma anke modificandolo non posso nè passare un OggPlasyer null ke mi da eccezione nè passare un OggPlayer reale perkè dopo un pò i test danno un errore di memoria piena.....
Cmq mi sa ke x ora salta il suono visto ke vicius mi ha giustamente fatto notare che la riproduzione degli ogg è nella terza storia :fiufiu:
Il mio personalissimo consiglio che ti posso dare è: cerca di svuotare la mente da tutto quel nozionismo e concentrati soltanto sul problema che hai da affrontare.
Svuotare la mente e' un ottimo consiglio. Quando io mi "pianto" su un problema da risolvere, nove volte su dieci accade perche' sto cercandi di pensare troppo in la' e di prevedere il futuro, e cerco di risolvere il problema nel modo migliore possibile al primo colpo.
Dopo un po' rinsavisco, capisco di non essere abbastanza intelligente per risolvere il problema bene e subito, mi resetto e prendo a calci e sputi il codice, scrivendo le peggiori cose possibili, per arrivare il piu' velocemente possibile alla soluzione. Poi mi fermo di nuovo, guardo la soluzione, e inizio a semplificarla prima del commit.
jappilas
25-05-2006, 13:34
Non è questo il problema, Marco:
....
Cesare, grazie per l' incoraggiamento :)
Il mio personalissimo consiglio che ti posso dare è: cerca di svuotare la mente da tutto quel nozionismo e concentrati soltanto sul problema che hai da affrontare.
però ehm, in questi giorni il problema per me è stato, per un task che in apparenza mi sembrava banale, acquisire dimestichezza con una parte di codice che prima consideravo una scatola nera, rispolverare quel poco che sapevo dei design pattern per capire cosa stava dietro alla struttura delle interfaccie ed entrare in modalità "code tracing" per seguire la catena di riferimenti tra oggetti Grid e Droppable, la catena di chiamate ecc ...
poi devo mettere in conto la mia emotività, il fatto che a insistere con "va bene così?" "dove sbaglio?" sul forum o msn so di fare la figura dell' incapace e rompiscatole, fare figure di cacca mi deprime terribilmente, e più mi deprimo peggio riesco a lavorare e più voglia ho di lasciar perdere tutto (infatti è probabile che dopo questo, non mi si veda più per un pezzo)... :(
Da esso estrapola i REQUISITI (questo sì) che il codice deve soddisfare, e ponili sotto forma di test.
....
Quindi concentrati in primis soltanto sui test: tira fuori il codice che metta nero su bianco il "contratto" che dev'essere soddisfatto.
ma in effetti è il procedimento che forzavo me stesso a seguire (a parte all' inizio quando non avendo bene idea di come scrivere i test, ho scritto del codice che rispettasse un "test" (nel senso di specifiche su precondizioni -> postcondizioni) che tenevo fisse a mente ): poi ripensandoci, ho fino a ieri usato questo test e uno simile per il caso di due dynamiti nella gempair... peccato che mi sbagliassi come specifiche originale, il frame con il numero va settato alla creazione della droppable, in modo da visualizzarlo nella casella NEXT e questo non lo avevo capito...
grid.insertDroppable(gem, 13, 4);
gemsPair.setPivot(gem);
grid.insertDroppable(dynamite, 12, 4);
gemsPair.setSlave(dynamite);
assertEquals("The Dynamite must be using the third frame, counting 1", 2,
dynamite.getAnimatedObject().getCurrentFrame());
cdimauro
25-05-2006, 14:22
Cesare, grazie per l' incoraggiamento :)
però ehm, in questi giorni il problema per me è stato, per un task che in apparenza mi sembrava banale, acquisire dimestichezza con una parte di codice che prima consideravo una scatola nera, rispolverare quel poco che sapevo dei design pattern per capire cosa stava dietro alla struttura delle interfaccie ed entrare in modalità "code tracing" per seguire la catena di riferimenti tra oggetti Grid e Droppable, la catena di chiamate ecc ...
Più o meno vale lo stesso per me, te lo posso assicurare. Io non ha una visione completa delle varie parti del codice: quando prendo un task e ci sono parti "oscure", me le vado a studiare. Come hai fatto tu. Il know-how di Diamonds lo acquisisco man mano.
poi devo mettere in conto la mia emotività, il fatto che a insistere con "va bene così?" "dove sbaglio?" sul forum o msn so di fare la figura dell' incapace e rompiscatole, fare figure di cacca mi deprime terribilmente, e più mi deprimo peggio riesco a lavorare e più voglia ho di lasciar perdere tutto (infatti è probabile che dopo questo, non mi si veda più per un pezzo)... :(
Non è con questo spirito che devi partecipare al progetto. Nessuno nasce "imparato", e qui è la stessa cosa. Alcune volte ho fatto delle cazzate, e il mio codice è volato via, ma non ho nessun rimpianto. Idem per qualche ramanzina.
Sbagliare è umano, ma siamo qui per imparare come si lavora su progetti "di spessore", con una metodologia giovane qual è il TDD, e portare avanti questo progetto. Anche se scappa qualche stronzata.
Questo non te lo dico tanto per fare la classica paternale: non è nel mio stile perdere tempo su frasette di circostanza. So che sei una persona che ha delle notevoli capacità, e che ha tanta voglia di migliorare.
Il nocciolo della questione è: vuoi arricchire il tuo bagaglio culturale? Vuoi acquisire degli strumenti che ti saranno utili per il lavoro? Se la tua risposta è sì, allora non mettere al centro della tua esistenza l'emotività e datti da fare. Anche sbagliando, ma non credo che il tuo obiettivo sia quello di sbagliare tutta la vita, giusto?
ma in effetti è il procedimento che forzavo me stesso a seguire (a parte all' inizio quando non avendo bene idea di come scrivere i test, ho scritto del codice che rispettasse un "test" (nel senso di specifiche su precondizioni -> postcondizioni) che tenevo fisse a mente ): poi ripensandoci, ho fino a ieri usato questo test e uno simile per il caso di due dynamiti nella gempair... peccato che mi sbagliassi come specifiche originale, il frame con il numero va settato alla creazione della droppable, in mdoo da visualizzarlo nella casela NEXT e questo non lo avevo capito...
grid.insertDroppable(gem, 13, 4);
gemsPair.setPivot(gem);
grid.insertDroppable(dynamite, 12, 4);
gemsPair.setSlave(dynamite);
assertEquals("The Dynamite must be using the third frame, counting 1", 2,
dynamite.getAnimatedObject().getCurrentFrame());
Le specifiche originali se non sono chiare si chiede al customer di disambiguarle: Jocchan c'è apposta per questo, per cui non ti devi preoccupare di rompergli le scatole. :D
Anch'io ho commesso numerosi errori di interpretazione, che hanno portato anche alla completa eliminazione del mio codice, come ti dicevo: se vai a vedere le storie passate, te ne renderai conto tu stesso.
Però, come vedi, sono ancora qui. ;)
Allora, che si fa? Al lavoro, sù. E per qualunque dubbio chiedi pure nel forum o su MSN. :)
^TiGeRShArK^
25-05-2006, 14:30
poi devo mettere in conto la mia emotività, il fatto che a insistere con "va bene così?" "dove sbaglio?" sul forum o msn so di fare la figura dell' incapace e rompiscatole, fare figure di cacca mi deprime terribilmente, e più mi deprimo peggio riesco a lavorare e più voglia ho di lasciar perdere tutto (infatti è probabile che dopo questo, non mi si veda più per un pezzo)... :(
e coraggio però :D
non ti deprimere così :p
che ti sembra che noi sappiamo già fare tutto?
non hai idea della quantità di bestemmie, di sigarette e di bottiglie di birra che mi ci sono volute x completare certi task...
alla fine l'importante è che capisci ke siamo tutti qui x imparare...
non certo x demoralizzarci xkè non ci sentiamo in grado :p
Prova a lasciar perdere tutto ke organizziamo all'istante una spedizione e ti spezziamo tutte le falangi, falangine e falangette ke troviamo :sofico:
;)
jappilas
25-05-2006, 17:29
ok, tornando al lavoro, e' uscita questa nuova idea di test:
pseudocodice
creo una dynamite (*) (presupponendo che sia l' unica e quindi la prima)
asserisco che il suo frame sia quello col numero 1
per definizione fallisce
(*):
nuova idea su come creare la droppable di tipo dynamite:
- gemFactory.create(...)
per mantenere la semplicita ' a livello di codifica del test, e per non rischiare di rompere altri test usare gemFactory.create potrebbe essere considerata anch' essa una "specifica";
- this.setCurrentFrame(3-count) (**) direttamente nel costruttore della dynamite;
-> nuova problematica: gemFactory abbisogna di un riferimento a Grid per istanziare la dynamiteCountAction
(o chiamare un mio metodo, sempre in Grid (one liner, nulla di complesso) che la incapsula e ritorna un intero)
ma per il momento droppablefactory non ha accesso alla Grid;
GemQueue, invece:
possiede un' istanza di Grid (e per questo motivo ieri ero tentato di lavorare direttamente sulla coda) che usa, guarda un po', per contare le dinamiti presenti in griglia nel momento che si estrae una droppable, (per valutare la "estraibilita' " di un' ulteriore dynamite, che quindi ha una vera e propria probabilita' condizionata)..
possiede un' istanza di abstractDroppableFactory
abstractDroppableFactory a sua volta istanzia la DroppableFactory
->nuova strada:
un metodo setGrid e una variabile membro grid in droppableFactory,
e un metodo di passaggio che chiamato dalla gemequeue, passa la grid di quest' ultima alla setGrid della droppableFactory
non mi ricordo che DP sia, :D ma riesco con 4 righe di codice a risolvere uno dei problemi che avevo all' inizio ( chiunque abbia codice piu' semplice in mente, parli! ;) ) ora rimane "solo" da sistemare gli indici dei frame...
(**) : il 3 - count nasceva dal fatto che il frame aggiunto per default dalla abstractdroppable ha origine a 0,0 (per la dinamite e' quello che "visualizza" 3), il che mi porterebbe a usare la progressione inversa per l' indice dei frame numerali...
jappilas
25-05-2006, 23:33
e coraggio però :D
non ti deprimere così :p
che ti sembra che noi sappiamo già fare tutto?
pensavo, indubbiamente loro, lavorandoci da molto più tempo di me, hano una competenza su tutto il codice e sulle metodiche di sviluppo che io no riuscirò di certo a recuperare in pochi giorni... :O
alla fine l'importante è che capisci ke siamo tutti qui x imparare...
non certo x demoralizzarci xkè non ci sentiamo in grado :p:)
... comunque: avrei bisogno di sapere per il task dell' animazione, se hai imposto esplicitamente una sequenza di addFrame() e se sì in che ordine:
io avevo in mente di eseguire qualcosa del genere (tenendo conto che il frame che conta 3 , a 0,0 nella texture, è già "addato" nella AbstractDroppable, quindi avrà indice zero, quindi m' induce a usare un indicizzazione "inversa" rispetto al conto delle dinamiti (*))
this.addFrame(0, 32, animationDelay); // il frame che conta 2
this.addFrame(0, 64, animationDelay); // quello che conta 1
this.addFrame(0, 96, animationDelay); //quello che conta 0
this.addFrame(0, 128, animationDelay); //quello col display vuoto
this.setCurrentFrame(3-dynaCount); //imposto dall' inizio il frame nella "sequenza numerale inversa"
nel costruttore (riparametrizzato) della dynamite
ma fallisce oltre al mio test alliscono anche quelli riguardanti l' animazione, e credo sia un problema di ordine di aggiunta ...
(*): fosse per me eliminerei l' addFrame(0,0) dalla AbstractDroppable e lo replicherei nei singoli costruttori ( la sequenza dei frame è una specializzione delle sottoclassi) per usare una sequenza diretta
^TiGeRShArK^
25-05-2006, 23:41
pensavo, indubbiamente loro, lavorandoci da molto più tempo di me, hano una competenza su tutto il codice e sulle metodiche di sviluppo che io no riuscirò di certo a recuperare in pochi giorni... :O
:)
tranquillo..
pure io è da un mese e mezzo ke non faccio task e ho perso completamente la cognizione del codice...
ho avuto il periodo di pausa forzata x un concorso (ke non vi dico com'è andata xkè nn c credereste MAI x la sfiga ke ho avuto! :muro: ) e poi mi sono messo a fare il refactoring x java Web Start ke NON posso mergiare fino a domani o dopodomani xkè x ora sono col pc temporaneo e ho paura a farlo xkè nn so se avevo commitatto tutto nel branch....
Inoltre, ciliegina sulla torta, mi devo scusare xkè x stasera nn posso materialmente mettermi a scrivere il codice x finire il task xkè sn troppo stanko, inkazzato e 'mbriako* e riskio d fare + danni ke altro.......
Il tutto è rimandato a domani pomeriggio (sperando di avere ancora un pc del cavolo funzionante qdo scendo a reggio :muro: )
km vedi nn sei l'unico messo male :p
;)
*ubriaco :fagiano:
jappilas
26-05-2006, 00:20
ho un serio problema, evidenziato dal fallimento di uno dei test di tiger:
testNoAnimation(it.diamonds.tests.gems.TestDynamite)
la dynamite viene visualizzata col numero progressivo giusto finchè è nella NEXT box, ma quella che cade nella Grid ha il frame con lo zero (che corrisponde all' indice 0 )
avrei bisogno di un indizio sul punto del codice in cui avviene il passaggio dalla droppable che esce dalla droppablefactory a quella effettivamente immessa in griglia
^TiGeRShArK^
26-05-2006, 01:53
ho un serio problema, evidenziato dal fallimento di uno dei test di tiger:
testNoAnimation(it.diamonds.tests.gems.TestDynamite)
la dynamite viene visualizzata col numero progressivo giusto finchè è nella NEXT box, ma quella che cade nella Grid ha il frame con lo zero (che corrisponde all' indice 0 )
avrei bisogno di un indizio sul punto del codice in cui avviene il passaggio dalla droppable che esce dalla droppablefactory a quella effettivamente immessa in griglia
ehm...
vedi ke io avevo fatto il test in quel modo xkè qdo ho preso in mano il codice veniva visualizzato quel frame nel gioco e credevo fosse la situazione giusta...
Lo puoi cambiare benissimo in modo ke rispekki la realtà..
anzi... se magari mi spieghi qual'è il primo frame da visualizzare sarebbe pure meglio xkè non ho capito molto come funzionano queste dinamiti... :stordita:
e una volta ke capisco qual'è il primo frame da visualizzare lo potrei pure cambiare io domani :p
jappilas
26-05-2006, 13:54
ehm...
vedi ke io avevo fatto il test in quel modo xkè qdo ho preso in mano il codice veniva visualizzato quel frame nel gioco e credevo fosse la situazione giusta...
Lo puoi cambiare benissimo in modo ke rispekki la realtà..
anzi... se magari mi spieghi qual'è il primo frame da visualizzare sarebbe pure meglio xkè non ho capito molto come funzionano queste dinamiti... :stordita:
e una volta ke capisco qual'è il primo frame da visualizzare lo potrei pure cambiare io domani :p
allora, seguendo il mio solito modo di procedere , cioè da panzer, :D ho fatto un leggero refactoring di tutti i droppable: tutti tranne la dynamite eseguono addrame(0, 0, animationDelay) nel proprio costruttore, subito dopo la chiamata a super() e lo stesso statement sparito dalla abstractdroppable
mentre la dynamite fa
this.addFrame(0, 96, animationDelay);//0
this.addFrame(0, 64, animationDelay);//1
this.addFrame(0, 32, animationDelay);//2
this.addFrame(0, 0, animationDelay);//3
this.addFrame(0, 128, animationDelay);//neutral
this.setCurrentFrame(dynaCount+1);
quindi l' idea sarebbe che l' indice del frame della dinamite corrente sarebbe il numero complessivo di dinamiti con lei compresa, uguale all' ordine progressivo della dinamite corrente ;)
però il test che citavo mi pareva sostanzialmente giusto, infatti "campionando" lo "startingframe" prima dell' avanzamento del timer e verificando che non sia cambiato dopo, non è vincolato a un particolare numero hardcoded... ;)
invece mi ha evidenziato che da qualche parte al momento dell' immissione nelle griglia della gemspair il frame risettato a 0... ci dev' essere un setcurrentframe da qualche parte...
hai testao il funzionamento con 2 griglie??
Se dynaCount (che io chiamerei proprio dynamiteCount) e relativo alla classe, mi sa che se si lavora con due griglie ti trovi presto un ArrayOutOfBoundException ;)
jappilas
26-05-2006, 14:14
hai testao il funzionamento con 2 griglie??
Se dynaCount (che io chiamerei proprio dynamiteCount) e relativo alla classe, mi sa che se si lavora con due griglie ti trovi presto un ArrayOutOfBoundException ;)
per il nome no problem, però, pensavo che già ci fossero due istanze diverse di Grid,
in cui ognuna passa il risultato della countDynamites() su se stessa, come prametro al costruttore della dynamite (e che quindi non si potesse andare oltre le 3 ) :stordita:
ps: scusatemi, ma pensavo anche che nel gioco ci fossero già due istanze di Grid separate e il task della limitazione a 3 fosse già "per-grid-instance-safe", e quindi potessi preoccuparmi "solo" del frame iniziale (che di problemi me ne sta dando già una certa quantità) :fagiano:
PPS: edit: comunque se invece di setCurrentFrame (count) fosse setCurrentFrame( count mod 3 ), risolverei il problema dell' eventuale out of bound error
nella teorica possibilità di andare otre le 3 dinamiti in campo i numeri sul display ciclerebbero, ma questo dovrebbe essere comunque evitato se la variazione della probabilità di estrazione , funziona
Rileggendo il testo del task, però, ho notato che manca un dettaglio fondamentale: oltre al timer, l'animazione deve terminare non appena il tasto viene rilasciato!
Danilo, non avevi risposto a questo mio post.
jappilas
26-05-2006, 16:18
hai testao il funzionamento con 2 griglie??
Se dynaCount (che io chiamerei proprio dynamiteCount) e relativo alla classe, mi sa che se si lavora con due griglie ti trovi presto un ArrayOutOfBoundException ;)
update: niente da fare, dalla droppableFactory non riesco accedere all' istanza di Grid, e quindi alla countDynamites(), in nessun modo :fagiano:
se qualcuno mi dà una dritta posso provare entro le 5 di oggi a sistemare la questione... altrimenti sono costretto a dare forfait (anche perchè non potrò usare il pc di casa per un po' di tempo, sia perchè ultimamente ho trascurato un po' gli studi, sia per problemi in famiglia :()
SO sorry :(
update: niente da fare, dalla droppableFactory non riesco accedere all' istanza di Grid, e quindi alla countDynamites(), in nessun modo :fagiano:
se qualcuno mi dà una dritta posso provare entro le 5 di oggi a sistemare la questione... altrimenti sono costretto a dare forfait (anche perchè non potrò usare il pc di casa per un po' di tempo, sia perchè ultimamente ho trascurato un po' gli studi, sia per problemi in famiglia :()
SO sorry :(
lo passi nel costruttore.
Io all'inizio avevo fatto cosi, poi ho spostato il controllo appositio in queue e non ne ho piu avuto bisogno.
Tanto è un oggetto che viene costruito da queue e queue ha la grid
jappilas
26-05-2006, 16:53
lo passi nel costruttore.
Io all'inizio avevo fatto cosi, poi ho spostato il controllo appositio in queue e non ne ho piu avuto bisogno.
suggerisci di demandare il setframe della dinamite alla gemqueue?
Tanto è un oggetto che viene costruito da queue e queue ha la grid
cioè quando un test chiama gemfactory.create() viene chiamata direttamente la queue? non mi sembrava... :stordita:
jappilas
26-05-2006, 17:30
la mia FdM è completa: in questo tempo non ho cavato un ragno dal buco, adesso devo uscire per delle commissioni e probabilmente mi toccherà subire una separazione forzata dal pc di casa e dal progetto per una settimana o due :(
... mi faccio schifo... mi sono lasciato assorbire dal task trascurando per due sttimane lo studio e il resto, per poi non riuscire a concludere nulla lo stesso... :(
la mia FdM è completa: in questo tempo non ho cavato un ragno dal buco, adesso devo uscire per delle commissioni e probabilmente mi toccherà subire una separazione forzata dal pc di casa e dal progetto per una settimana o due :(
Dobbiamo riassegnare il task... Qualcuno può farlo entro domani pomeriggio?
la mia FdM è completa: in questo tempo non ho cavato un ragno dal buco, adesso devo uscire per delle commissioni e probabilmente mi toccherà subire una separazione forzata dal pc di casa e dal progetto per una settimana o due :(
... mi faccio schifo... mi sono lasciato assorbire dal task trascurando per due sttimane lo studio e il resto, per poi non riuscire a concludere nulla lo stesso... :(
Come ti fai schifo...che ci stiamo qui a fare se non impariamo un po'??
E il saggio non dice "si impara dai propri errori"?? :D
In bocca al lupo per tutto ;)
Come ti fai schifo...che ci stiamo qui a fare se non impariamo un po'??
E il saggio non dice "si impara dai propri errori"?? :D
In bocca al lupo per tutto ;)
Hai detto esattamente quello che avrei voluto dire io ;)
Non dimentichiamo che Diamonds è un progetto didattico :)
Thebol, il valore per ora viene dato in base all'ordine di creazione, nel task 8 penseremo ad aggiornare i valori.
se mi confermate sta cosa, lo faccio io entro stasera.
se mi confermate sta cosa, lo faccio io entro stasera.
Confermo. Il task 8 serve ad aggiornare i valori dopo un'esplosione.
Confermo. Il task 8 serve ad aggiornare i valori dopo un'esplosione.
ok, server permettendo, visto che ho ancora la build rossa e non riesco a capire se faccio danni :\
cmq questa cosa porterà qualche problema, visto che durante l'aggiornamento bisognerà avere accesso anche alla queue.
ps.ho messo apposto la build in locale, è bastato aggiungere la properties ;)
jappilas
26-05-2006, 20:15
Come ti fai schifo...che ci stiamo qui a fare se non impariamo un po'??
mi faccio schifo perchè non mi sono saputo gestire, non ho saputo risolvere un problema anche con gli aiuti che ho ricevuto rompendo le scatole a tutti, e molto probabilmente vi ho messo in difficoltà perdendo due settimane che potevano essere dedicate alle altre storie, e in ultimo perchè mi sono bruciato la reputazione :( :cry:
E il saggio non dice "si impara dai propri errori"?? :D
una cosa l' ho imparata... a non prendere sottogamba i compiti (quindi sostanzialmente a priori ogni incarico è al di là delle mie scarse capacità di analisi)
se mi confermate sta cosa, lo faccio io entro stasera.
ecco, lo sapevo... ho lottato a vuoto 2 settimane con una cosa che sicuramente poteva essere risolta in mezz' ora di lavoro... :cry:
ps.ho messo apposto la build in locale, è bastato aggiungere la properties ;)
lì bisognerebbe che "qualcuno" committi la modifica a gameconfig.xml... :D
mi faccio schifo perchè non mi sono saputo gestire, non ho saputo risolvere un problema anche con gli aiuti che ho ricevuto rompendo le scatole a tutti, e molto probabilmente vi ho messo in difficoltà perdendo due settimane che potevano essere dedicate alle altre storie, e in ultimo perchè mi sono bruciato la reputazione :( :cry:
una cosa l' ho imparata... a non prendere sottogamba i compiti (quindi sostanzialmente a priori ogni incarico è al di là delle mie scarse capacità di analisi)
ecco, lo sapevo... ho lottato a vuoto 2 settimane con una cosa che sicuramente poteva essere risolta in mezz' ora di lavoro... :cry:
lì bisognerebbe che "qualcuno" committi la modifica a gameconfig.xml... :D
Non essere così drammatico: nel nostro progetto, non esistono perdite di tempo. Ok, siamo in ritardo sulla tabella di marcia, ma hai avuto la possibilità di approfondire le tue conoscenze, e di fare pratica con il codice.
Questo non è mai tempo buttato.
la mia FdM è completa: in questo tempo non ho cavato un ragno dal buco, adesso devo uscire per delle commissioni e probabilmente mi toccherà subire una separazione forzata dal pc di casa e dal progetto per una settimana o due :(
... mi faccio schifo... mi sono lasciato assorbire dal task trascurando per due sttimane lo studio e il resto, per poi non riuscire a concludere nulla lo stesso... :( troppo tempo passato lontano dal codice, troppa poca conoscenza del suo funzionamento; ma non farti schifo, è normale: quasi nessuno al posto tuo e nelle tue condizioni sarebbe riuscito a portare a termine il task, solo quelli con un'attitudine veramente forte verso la programmazione. avrai sicuramente modo di rifarti e di dimostrare a te stesso che non fai schifo ;)
mi spiace non averti potuto aiutare spiegandoti per bene in dettaglio come funziona il codice e come avresti dovuto lavorare per il tuo task, ma il tempo è carente nella mia vita :(
oltrettutto se tu anziché passare il tempo a dispiacerti e autocommiserarti e dire che fai schifo provassi un po' ad immaginare tra tutte le soluzioni quella più semplice per portare a termine quel task magari adesso nella prima pagina del topic accanto a jappilas ci sarebbe scritto "completo"!! :Prrr:
ha detto bene fek:
Non serve dispiacerti, serve completarlo :)
Quindi sotto col lavoro, che siamo in ritardo con la Storia.
lì bisognerebbe che "qualcuno" committi la modifica a gameconfig.xml... :D
lo faccio io, lo setto a un forfettario 100(non ho trovato nel thread quale valore preciso metterci)
jappilas
26-05-2006, 20:46
avrai sicuramente modo di rifarti e di dimostrare a te stesso che non fai schifo
oramai è dura... se ne è andato l' entusiasmo che nell' ultimo mese ha fatto sì che pensassi solo a DC ed è rimasta solo la rabbia verso me stesso :(
oltrettutto se tu anziché passare il tempo a dispiacerti e autocommiserarti e dire che fai schifo provassi un po' ad immaginare tra tutte le soluzioni quella più semplice per portare a termine quel task magari adesso nella prima pagina del topic accanto a jappilas ci sarebbe scritto "completo"!! :Prrr:
così mi fai stare ancora peggio... :( :( :(
lo faccio io, lo setto a un forfettario 100(non ho trovato nel thread quale valore preciso metterci)
se sono millisecondi, forse è meglio 3000, (100 mi pare sia il delay tra un frame e l' altro per il "lampeggiamento") ;)
se sono millisecondi, forse è meglio 3000, (100 mi pare sia il delay tra un frame e l' altro per il "lampeggiamento") ;)
ok
questi è il test principale del task(ce ne sono altri 3, frutto del TDD ;) ma sono "racchiusi" in questo)
public void testGemQueueCreateDynaWithProperlyFrame()
{
int flashProb = environment.getConfig().getInteger("FlashProbability");
int startDynamite = flashProb;
int mockValues[] = { startDynamite};
randomGenerator = new MockRandomGenerator(
mockValues);
gemQueue = GemQueue.createForTesting(environment, randomGenerator, grid);
gemQueue.fillQueueRandomly();
for (int i=0;i<100;i++)
{
assertEquals(3, gemQueue.extract().getAnimatedObject().getCurrentFrame());
gemQueue.extract();
assertEquals(2, gemQueue.extract().getAnimatedObject().getCurrentFrame());
gemQueue.extract();
assertEquals(1, gemQueue.extract().getAnimatedObject().getCurrentFrame());
gemQueue.extract();
}
}
ero indeciso a che livello fare la modifica, se a livello di gemQueue, randomDroppableFactory, o droppableFactory, alla fine lo messo a livello di gemQueue.
Ora magno e poi committo(se i test soddisfano il task).
jappilas
26-05-2006, 21:28
:O
jappilas
27-05-2006, 11:47
C'è un problema (spero di averlo solo io ...)
quando la casella NEXT mostra la dinamite in arrivo, il frame settato è quello con il numero progressivo (anche se si parte da 0 e non da 1)
ma il candelotto che cade effettivamente nella griglia ha sempre il numero 3 e rimane fisso anche al termine della caduta)
anche da voi è così?
C'è un problema (spero di averlo solo io ...)
quando la casella NEXT mostra la dinamite in arrivo, il frame settato è quello con il numero progressivo (anche se si parte da 0 e non da 1)
ma il candelotto che cade effettivamente nella griglia ha sempre il numero 3 e rimane fisso anche al termine della caduta)
anche da voi è così?
Si anche qui da lo stesso problema.
ciao ;)
jappilas
27-05-2006, 12:09
questo codice (in Dynamite.update() ) non mi è del tutto chiaro :fagiano:
è possibile che il problema abbia che vedere con quel setCurrentFrame(0) ? :stordita:
if(exploding && (timer - startExplosionTimeStamp < animationTimeout))
{
if(getCurrentFrame() != 3)
{
setCurrentFrame(3);
}
else
{
setCurrentFrame(4);
}
}
else
{
setCurrentFrame(0);
exploding=false;
startExplosionTimeStamp = timer;
}
mentre provavo a svolgere io il task, avevo sostituito quello 0 con ordinal (= previousDynamiteCount+1) per quel motivo se non ricordo male, ovviamente ricontrollando e riadattando gli indici in tutti i test di tiger... :stordita:
x bol: i frame successivi della dinamite, io avevo pensato di aggiungerli nel costruttore della dynamite stessa, tu in che punto del codice lo fai ? ;)
questo codice (in Dynamite.update() ) non mi è del tutto chiaro :fagiano:
è possibile che il problema abbia che vedere con quel setCurrentFrame(0) ? :stordita:
if(exploding && (timer - startExplosionTimeStamp < animationTimeout))
{
if(getCurrentFrame() != 3)
{
setCurrentFrame(3);
}
else
{
setCurrentFrame(4);
}
}
else
{
setCurrentFrame(0);
exploding=false;
startExplosionTimeStamp = timer;
}
mentre provavo a svolgere io il task, avevo sostituito quello 0 con ordinal (= previousDynamiteCount+1) per quel motivo se non ricordo male, ovviamente ricontrollando e riadattando gli indici in tutti i test di tiger... :stordita:
x bol: i frame successivi della dinamite, io avevo pensato di aggiungerli nel costruttore della dynamite stessa, tu in che punto del codice lo fai ? ;)
quando i test danno troppa sicurezza :asd:
risolto il primo bug, ora parte da 1 e arriva correttamente a 3 :)
per il secondo, ho visto anche io che la update probabilmente forza il frame a 3, ora cerco di renderla safe, e dovremmo avere risolto.
x jappilas.
In gemQueue controllo se la gemma estratta è una dinamite e in caso affermativo setto il frame giusto(tengo un contatore delle dinamiti estratte e uso il %)
jappilas
27-05-2006, 12:24
In gemQueue controllo se la gemma estratta è una dinamite e in caso affermativo setto il frame giusto(tengo un contatore delle dinamiti estratte e uso il %)
ma i 4 addFrame (0, Nx32, ...) che mi sembravano necessari servivano veramente o , oppure bastava settare da qualche parte quanti frame sono contenuti nella texture o... ?
siccome non ne trovo traccia, chiedevo per capire come si "addano" visto che sbagliavo io prima... :fagiano:
mi faccio schifo perchè non mi sono saputo gestire,
Ma la smetti di piangerti addosso? Pensi che autocommiserandoti risolvi qualcosa? No, non lo risolvi. I problemi si risolvono lavorando, non piangendo.
quando i test danno troppa sicurezza :asd:
risolto il primo bug, ora parte da 1 e arriva correttamente a 3 :)
per il secondo, ho visto anche io che la update probabilmente forza il frame a 3, ora cerco di renderla safe, e dovremmo avere risolto.
x jappilas.
In gemQueue controllo se la gemma estratta è una dinamite e in caso affermativo setto il frame giusto(tengo un contatore delle dinamiti estratte e uso il %)
confermo il bug e la sua risoluzione(con test ;) )
praticamente settava il frame a 3 anche quando non era in exploding.
faccio girare tutti i test e committo :)
ma i 4 addFrame (0, Nx32, ...) che mi sembravano necessari servivano veramente o , oppure bastava settare da qualche parte quanti frame sono contenuti nella texture o... ?
siccome non ne trovo traccia, chiedevo per capire come si "addano" visto che sbagliavo io prima... :fagiano:
nella coda mi arrivava gia con i frame creati :)
ps.fatto commit
gia che ci sono prendo anche l'8 :)
però le specifiche non mi sono chiarissime =D
Ora la dinamite puo essere cancellata solo da una flash, questo comportamento è corretto o è da eliminare?
Perche se il comportamento è corretto, potrei inserire nella update della dinamite un controllo su quante dinamiti ci sono in griglia, e in caso ne manchi una(cancellata da una flash o dall'utente) si decrementa(sempre che non sia gia a 1).
Altrimenti aspetterei che il task che cancella la gemma, e metterei lì l'update delle dinamiti rimaste :)
gia che ci sono prendo anche l'8 :)
però le specifiche non mi sono chiarissime =D
Ora la dinamite puo essere cancellata solo da una flash, questo comportamento è corretto o è da eliminare?
Perche se il comportamento è corretto, potrei inserire nella update della dinamite un controllo su quante dinamiti ci sono in griglia, e in caso ne manchi una(cancellata da una flash o dall'utente) si decrementa(sempre che non sia gia a 1).
Altrimenti aspetterei che il task che cancella la gemma, e metterei lì l'update delle dinamiti rimaste :)
Questo comportamento è da eliminare, la dinamite si cancella solo facendola esplodere (e qui va fatto l'update degli altri candelotti) ;)
Questo comportamento è da eliminare, la dinamite si cancella solo facendola esplodere (e qui va fatto l'update degli altri candelotti) ;)
ok, tolgo questa cosa, e il tempo per il task sarà 2 giorni a partire da quando viene completato quello della cancellazione :)
test list provvisioria.
controllare che se una dinamite è in grid e avviene una cancellazione, il frame sia aggiornato(3->2, 2->1)
controllare che se una dinamite è in gemQueue e avviene una cancellazione, il frame sia aggiornato(3->2, 2->1)
^TiGeRShArK^
27-05-2006, 19:03
Danilo, non avevi risposto a questo mio post.
ah ecco..questo mi era sfuggito...
cmq un bordello..
ieri ci ho messo DODICI ore x scendere a reggio con l'aereo :muro:
Arrivo e trovo (ovviamente :muro: ) il pc smontato...
ho finito giusto ora di rimontarlo e ancora mancano un paio di cose..
ancora non ho letto niente di quello ke è successo in questi 2 giorni, cmq io al max il task lo potrei fare domani (a meno di altri problemi del pc nascosti che vengano a galla :muro: ).
^TiGeRShArK^
27-05-2006, 19:08
lì bisognerebbe che "qualcuno" committi la modifica a gameconfig.xml... :D
sorry...
avevo capito ke il backup aveva già il commit di gameconfig,,, :(
con i casini di qeusti giorni m sono perso completamente :muro:
^TiGeRShArK^
27-05-2006, 19:09
questo codice (in Dynamite.update() ) non mi è del tutto chiaro :fagiano:
è possibile che il problema abbia che vedere con quel setCurrentFrame(0) ? :stordita:
if(exploding && (timer - startExplosionTimeStamp < animationTimeout))
{
if(getCurrentFrame() != 3)
{
setCurrentFrame(3);
}
else
{
setCurrentFrame(4);
}
}
else
{
setCurrentFrame(0);
exploding=false;
startExplosionTimeStamp = timer;
}
mentre provavo a svolgere io il task, avevo sostituito quello 0 con ordinal (= previousDynamiteCount+1) per quel motivo se non ricordo male, ovviamente ricontrollando e riadattando gli indici in tutti i test di tiger... :stordita:
x bol: i frame successivi della dinamite, io avevo pensato di aggiungerli nel costruttore della dynamite stessa, tu in che punto del codice lo fai ? ;)
eh si..
l'avevo fatto in quel modo xkè qdo ho iniziato a scrivere il task compariva sempre 3..
non avevo capito una mazza ke in realtà il numero era dinamico :p
^TiGeRShArK^
27-05-2006, 19:12
cmq ora vedo di iniziare a sistemare l'ambiente di sviluppo su 'sto dannato pc (appena finisce di formattare in background... non si sa mai....) e domani vedo di finire finalmente il task (sempre se non esplode prima il pc come temo... :fiufiu: ).
Tra l'altro ho appena scoperto ke avevo gli HDD SATA senza FIX col bus a 280 :muro:
non so x quale miracolo non si è fritto tutto :muro:
jappilas
27-05-2006, 20:16
sorry...
avevo capito ke il backup aveva già il commit di gameconfig,,, :(
con i casini di qeusti giorni m sono perso completamente :muro:
dont be sad, quel post l' ho pensato senza virgolette, ma poi scritto con.. .non voleva sembrare allusivo, intendevo che bastava che chiunque committasse la property modificata ;)
jappilas
27-05-2006, 22:35
eh si..
l'avevo fatto in quel modo xkè qdo ho iniziato a scrivere il task compariva sempre 3..
non avevo capito una mazza ke in realtà il numero era dinamico :p
dont worry, seguivi la comprensibilissima logica dell' ordine del frame nella texture "a colonna"
io già che avevo "carta bianca", ragionavo secondo i numeri d' ordine e volevo introdurre anche l' aggiunta ordinata dei frame nel costruttore, per semplificarmi la vita (se indice del frame = numero visualizzato il mio cervello ragionava meglio :D) e non per altro ;)
ma poi, è guardando come avevi fatto tu, anche se il tuo era il task successivo, che il delegare alla dynamite il settaggio del il proprio frame tenendo conto del proprio numero d' ordine mi è sembrato a maggior ragione la soluzione più elegante e anche semplice visto che sarebbe bastato cambiare "0" con "ordinal" (corrispondente allo startingFrame che avevo introdotto in uno dei test) ;)
tra l' altro come soluzione mi allettava, anche perchè permetteva di scrivere dei test che piacevano molto a vicius e sarebbero piaciuti a fek, cioè estremamente diretti e concisi ( due righe :D gemfactory.create(); assertEquals(); )
certo, non avevo messo in conto il "piccolo" problema che sarebbe venuto fuori e che non sarei riuscito a risolvere, però di quel design ero effettivamente convinto... :stordita:
vabbè, ormai non è più un problema mio ... :D :p
L'implementazione della dynamite mi sta dando grossi problemi...
La classe Dynamite ha bisogno di un po' di refactoring inoltre non trovo molto bella l'aggiunta di una nuova Action per la conta delle Dynamite e l'aggiunta di un'ulteriore responsabilità in GemQueue...
Qualcuno può cercare di snellire il tutto e chiarificare le responsabilità?
^TiGeRShArK^
28-05-2006, 19:26
Per quanto riguarda gli input da gestire continua a sfuggirmi qualcosa....
quale dinamite deve esplodere?
tutte quelle presenti nel campo da gioco?
Comprese quelle che in quel momento stanno cadendo o escluse?
Joc, potresti rispiegarmi x bene come funzionano 'ste dinamiti che mi sfugge? :p
Per quanto riguarda gli input da gestire continua a sfuggirmi qualcosa....
quale dinamite deve esplodere?
tutte quelle presenti nel campo da gioco?
Comprese quelle che in quel momento stanno cadendo o escluse?
Joc, potresti rispiegarmi x bene come funzionano 'ste dinamiti che mi sfugge? :p
Deve esplodere solo la più vecchia :)
task 16.2.5 completato :)
Deve esplodere solo la più vecchia :)
Ok...ma mentre cade??
Qualcuno si è posto il problema??
Secondo me dovrebbe essere attiva solo dopo che è caduta.
Ok...ma mentre cade??
Qualcuno si è posto il problema??
Secondo me dovrebbe essere attiva solo dopo che è caduta.
molto interessante :)
Sarebbe bello poter attivare l'esplosione anche mentre cade ma farla esplodere una volta caduta...
Ok ragazzi, stop qui, prendo il tag e Jocchan lavora sulle nuove Storie che incorporano i task avanzati da questo Ciclo.
jappilas
29-05-2006, 12:12
Ok...ma mentre cade??
Qualcuno si è posto il problema??
se qualcuno mi spiega come si controllano le 8 caselle che circondano la dinamite mentre questa cade, (e quindi per definizione e' costantemente , a meno di brevi istanti, "a cavallo" tra due righe adiacenti) il problema e' risolto :D
Secondo me dovrebbe essere attiva solo dopo che è caduta.
anche secondo me...
Sarebbe bello poter attivare l'esplosione anche mentre cade ma farla esplodere una volta caduta...
oppure cosi' ... "basterebbe" campionare le 8 caselle intorno al punto in cui la dinamite "cadrebbe" se il giocatore non la spostasse a sinistra o a destra ...
se qualcuno mi spiega come si controllano le 8 caselle che circondano la dinamite mentre questa cade, (e quindi per definizione e' costantemente , a meno di brevi istanti, "a cavallo" tra due righe adiacenti) il problema e' risolto :D
si fa, basta avere il riferimento a grid
dalla dinamite ricavi la sua posizione, poi usi grig.getGemAt(x,y) per avere le gemme nel suo intorno
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.