View Full Version : [Morphing Gem] - Double Fist of the North Star in Pair
^TiGeRShArK^
01-03-2008, 13:49
Come da titolo io e Cisc applicheremo le tecniche della Sacra suola di Nanto e della Divina scuola di Hokuto per estrarre questa Morphing Gem :p
allora, una lista di comportamenti da testare:
- una Stone al frame 5 deve diventare una MorphingGem
- una MorphingGem deve avanzare i frame in modo da completare l'animazione
- una MorphingGem deve trasformarsi in una Gem arrivata al frame 7
Tiger dimmi se ti viene in mente altro, se no possiamo cominciare
banryu79
01-03-2008, 13:58
Chi dei due sarà il successore della Divina Scuola di Refactor... ehm, di Hokuto? :eek:
http://www.hokutonoken.it/scuole/ryuken1.jpg
Ciao e buon divertimento! :)
^TiGeRShArK^
01-03-2008, 14:08
ecco il primo test:
package it.diamonds.tests.droppable.gems;
import static it.diamonds.droppable.DroppableColor.DIAMOND;
import it.diamonds.droppable.Droppable;
import it.diamonds.droppable.DroppableFactory;
import it.diamonds.tests.EnvironmentTestCase;
public class TestMorphingGem extends EnvironmentTestCase
{
public void testStoneBecomesMorphingGem()
{
DroppableFactory gemFactory = new DroppableFactory(environment);
Droppable stone = gemFactory.createStone(DIAMOND);
stone.getAnimatedSprite().setCurrentFrame(4);
stone.update(Stone.ANIMATION_FRAME_DELAY);
stone = stone.transform();
assertTrue(stone instanceof MorphingGem);
}
}
il test postato da tiger comporta ancora modifiche troppo sostanziali, prima diamo coscienza a GemFactory che esistono le MorphingGem, ecco come si modifica testGemFactory:
package it.diamonds.tests.droppable.gems;
import static it.diamonds.droppable.DroppableColor.DIAMOND;
import static it.diamonds.droppable.DroppableColor.EMERALD;
import static it.diamonds.droppable.DroppableColor.NO_COLOR;
import static it.diamonds.droppable.DroppableColor.RUBY;
import static it.diamonds.droppable.DroppableColor.SAPPHIRE;
import static it.diamonds.droppable.DroppableColor.TOPAZ;
import static it.diamonds.droppable.types.AbstractDroppableType.CHEST;
import static it.diamonds.droppable.types.AbstractDroppableType.FLASHING_GEM;
import static it.diamonds.droppable.types.AbstractDroppableType.GEM;
import static it.diamonds.droppable.types.AbstractDroppableType.MORPHING_GEM;
import it.diamonds.droppable.Droppable;
import it.diamonds.droppable.DroppableFactory;
import it.diamonds.tests.EnvironmentTestCase;
public class TestGemFactory extends EnvironmentTestCase
{
private DroppableFactory factory;
public void setUp()
{
super.setUp();
factory = new DroppableFactory(environment);
}
public void testGemCreation()
{
Droppable gem = factory.create(GEM, DIAMOND);
assertEquals("does not return a Gem", GEM, gem.getType());
assertEquals("does not return Gem of type diamond", DIAMOND, gem.getColor());
gem = factory.create(GEM, RUBY);
assertEquals("does not return a Gem", GEM, gem.getType());
assertEquals("does not return Gem of type ruby", RUBY, gem.getColor());
gem = factory.create(GEM, SAPPHIRE);
assertEquals("does not return a Gem", GEM, gem.getType());
assertEquals("does not return Gem of type sapphire", SAPPHIRE, gem.getColor());
gem = factory.create(GEM, EMERALD);
assertEquals("does not return a Gem", GEM, gem.getType());
assertEquals("does not return Gem of type emerald", EMERALD, gem.getColor());
gem = factory.create(GEM, TOPAZ);
assertEquals("does not return a Gem", GEM, gem.getType());
assertEquals("does not return Gem of type topaz", TOPAZ, gem.getColor());
}
public void testChestCreation()
{
Droppable gem = factory.create(CHEST, DIAMOND);
assertEquals("does not return a Chest", CHEST, gem.getType());
assertEquals("does not return Chest of type diamond", DIAMOND, gem.getColor());
gem = factory.create(CHEST, RUBY);
assertEquals("does not return a Chest", CHEST, gem.getType());
assertEquals("does not return Chest of type ruby", RUBY, gem.getColor());
gem = factory.create(CHEST, SAPPHIRE);
assertEquals("does not return a Chest", CHEST, gem.getType());
assertEquals("does not return Chest of type sapphire", SAPPHIRE, gem.getColor());
gem = factory.create(CHEST, EMERALD);
assertEquals("does not return a Chest", CHEST, gem.getType());
assertEquals("does not return Chest of type emerald", EMERALD, gem.getColor());
gem = factory.create(CHEST, TOPAZ);
assertEquals("does not return a Chest", CHEST, gem.getType());
assertEquals("does not return Chest of type topaz", TOPAZ, gem.getColor());
}
public void testFlashGemCreation()
{
Droppable gem = factory.create(FLASHING_GEM, NO_COLOR);
assertEquals("does not return Flashing gem of type diamond", FLASHING_GEM, gem.getType());
}
public void testCreateFlashingGem()
{
Droppable gem = factory.createFlashingGem();
assertEquals("does not return Gem of type topaz", FLASHING_GEM, gem.getType());
}
public void testFlashingGemFirstFrameDuration()
{
Droppable gem = factory.createFlashingGem();
assertEquals("Flashing gem first frame duration must be 0", 0, gem.getAnimatedSprite().getFrameDuration(0));
}
public void testFlashingGemAnimationLenght()
{
Droppable gem = factory.createFlashingGem();
assertEquals("Flashing gem animation lenght must be 8", 8, gem.getAnimatedSprite().getNumberOfFrames());
}
public void testCreateMorphingGem()
{
Droppable gem = factory.createMorphingGem();
assertEquals("does not return Gem of type topaz", MORPHING_GEM, gem.getType());
}
}
a te tiger:p:D
Scusate se mi intrometto a lavoro iniziato ma potete per favore separare il concetto di animation frame dal concetto di trasformazione?
^TiGeRShArK^
01-03-2008, 15:16
I test passano tutti ora..
Ma ho dovuto aggiungere ala mappa DROPPABLE_TYPENAMES la chiave MORPHING_GEM a cui ho associato il valore stones altrimenti non passava dato che la directory morphinggem non esiste.
Procediamo tranquillamente così o creiamo dei nuovi files in cui mettere l'animazione delle morphing gems?
^TiGeRShArK^
01-03-2008, 15:18
Scusate se mi intrometto a lavoro iniziato ma potete per favore separare il concetto di animation frame dal concetto di trasformazione?
...ovvero? :p
^TiGeRShArK^
01-03-2008, 15:30
committato, anche il test commentato.
Wating for cisc return .. :p
al momento le stone per sapere a che stato si trova una trasformazione usano una cosa tipo:
if (getAnimation().getCurrentFrame() < 7)
{
//codice
}
Visto che vogliamo separare il rendering delle gemme dal loro stato interno bisogna levare questi pezzi di codice
^TiGeRShArK^
01-03-2008, 15:41
al momento le stone per sapere a che stato si trova una trasformazione usano una cosa tipo:
if (getAnimation().getCurrentFrame() < 7)
{
//codice
}
Visto che vogliamo separare il rendering delle gemme dal loro stato interno bisogna levare questi pezzi di codice
okz capito
^TiGeRShArK^
01-03-2008, 21:03
Bene cosi'! :)
..però mi sa che continuiamo domani :fagiano:
prima è scappato cisc e poi io :D
..e ora sto uscendo.. :fiufiu:
Appuntamento a domani per quando mi sveglio :O
:D
^TiGeRShArK^
02-03-2008, 15:22
dunque..
brevi considerazioni sull'indipendenza della trasformazione dal frame...
discutendo con cisc ci siamo resi conto che per implementarlo allo stato attuale si dovrebbe comunque utilizzare un contatore che sia sostanzialmente equivalente al contatore utilizzato per i frames.
E' vero che comunque sono due concetti diversi e che in futuro potrebbe cambiare la gestione del contatore delle animazioni dei frames...
Ma quindi in questo caso è YAGNI o no? :fagiano:
dunque..
brevi considerazioni sull'indipendenza della trasformazione dal frame...
discutendo con cisc ci siamo resi conto che per implementarlo allo stato attuale si dovrebbe comunque utilizzare un contatore che sia sostanzialmente equivalente al contatore utilizzato per i frames.
E' vero che comunque sono due concetti diversi e che in futuro potrebbe cambiare la gestione del contatore delle animazioni dei frames...
Ma quindi in questo caso è YAGNI o no? :fagiano:
Hum... Per me YAGNI non e` ma possiamo pensarci a refactoring finito
Ma quindi in questo caso è YAGNI o no? :fagiano:
http://i27.tinypic.com/2rffvhv.gif
Non e` questione di "in futuro vorremo cambiare la gestione" ma questione di correttezza. Non possiamo estrarre completamente il codice di rendering da droppable se non separiamo tutti questi concetti.
jappilas
02-03-2008, 20:51
Non e` questione di "in futuro vorremo cambiare la gestione" ma questione di correttezza. Non possiamo estrarre completamente il codice di rendering da droppable se non separiamo tutti questi concetti.il fatto è che se finora la logica interna alle stone si appoggiava al controllo del frame e funzionava, con l' introduzione della MorphingGem si può per ora riciclare tale logica per rimuoverla in seguito (è un task diverso)
ehm...ragazzi...con tiger abbiamo qualche problema a sincronizzarci:D...spero che in serata riusciamo a concludere il refactoring:D
^TiGeRShArK^
03-03-2008, 09:46
ehm...ragazzi...con tiger abbiamo qualche problema a sincronizzarci:D...spero che in serata riusciamo a concludere il refactoring:D
Io ho formattato e dovrei essere operativo..
Però oggi ci sono solo dopo le 23 mi sa.. :stordita:
Io ho formattato e dovrei essere operativo..
Però oggi ci sono solo dopo le 23 mi sa.. :stordita:
azz, un po tardi :stordita: io il tuo test l'ho fatto passare...solo che ovviamente allo stato attuale non ne passano altri che andrebbero corretti alla fine dell'introduzione della MorphingGem, che faccio...li commento, committo, posto il test per te e ci becchiamo stasera? :stordita:
azz, un po tardi :stordita: io il tuo test l'ho fatto passare...solo che ovviamente allo stato attuale non ne passano altri che andrebbero corretti alla fine dell'introduzione della MorphingGem, che faccio...li commento, committo, posto il test per te e ci becchiamo stasera? :stordita:
Non togliere test. Fissali e poi committa.
Non togliere test. Fissali e poi committa.
mi spiego meglio, allo stato attuale i test sulla trasformazione della Stone non passano, perchè si aspettano che la Stone si trasformi in una Gem, e non in una MorphingGem, fino a quando la MorphingGem non fa quello che deve fare non saprei proprio come andare ad agire su quei tests
mi spiego meglio, allo stato attuale i test sulla trasformazione della Stone non passano, perchè si aspettano che la Stone si trasformi in una Gem, e non in una MorphingGem, fino a quando la MorphingGem non fa quello che deve fare non saprei proprio come andare ad agire su quei tests
Non fare il commit fino a che MorphingGem non fa quello che deve fare allora.
^TiGeRShArK^
03-03-2008, 20:27
io ci sono non appena finisco il checkout che mi si era incasinato il workspace...
rieccoci operativi, allora, ripropongo il test che dovevo far passare, con una piccola modifica:
public class TestMorphingGem extends EnvironmentTestCase
{
private DroppableFactory gemFactory;
private Droppable stone;
public void setUp()
{
super.setUp();
gemFactory = new DroppableFactory(environment);
stone = gemFactory.createStone(DIAMOND);
}
public void testStoneBecomesMorhpingGem()
{
stone.getAnimatedSprite().setCurrentFrame(4);
stone.updateStoneTransformation();
stone = stone.transform();
assertTrue(stone instanceof MorphingGem);
}
}
che ho fatto passare modificando il metodo transform di Stone così:
public Droppable transform()
{
return gemFactory.create(MORPHING_GEM, this.getColor());
}
ovviamente tale modifica comporta il fallimento di alcuni test che aggiusteremo alla fine del pair:)
prossimo test per tiger:
public void testStoneNotBecomesMorhpingGem()
{
stone.getAnimatedSprite().setCurrentFrame(2);
stone.updateStoneTransformation();
stone = stone.transform();
assertTrue(stone instanceof Stone);
}
^TiGeRShArK^
03-03-2008, 21:55
ecco il codice in stone:
public Droppable transform()
{
int frame = getAnimatedSprite().getCurrentFrame();
if (frame < 5)
{
return this;
}
else
{
return gemFactory.create(MORPHING_GEM, this.getColor());
}
}
build Green.
ed ecco il nuovo test da fare passare:
public void testMorphingGemBecomesGem()
{
Droppable morphingGem = gemFactory.create(MORPHING_GEM, stone.getColor());
morphingGem.getAnimatedSprite().setCurrentFrame(6);
morphingGem.updateTransformation();
Droppable gem = morphingGem.transform();
assertTrue(gem instanceof Gem);
}
a te cisc :p
ecco MorphingGem come è diventata:
public class MorphingGem extends AbstractSingleDroppable
{
private transient DroppableFactory gemFactory;
public MorphingGem(Environment environment, DroppableColor color, int animationDelay, int animationUpdateRate)
{
super(environment.getEngine(), new DroppableDescription(AbstractDroppableType.MORPHING_GEM, color), new AnimationDescription(8, animationDelay, animationUpdateRate));
gemFactory = new DroppableFactory(environment);
}
public Droppable transform()
{
return gemFactory.create(GEM, this.getColor());
}
}
prossimo test per tiger:
public void testMorphingGemUpdatesCurrentFrame()
{
Droppable morphingGem = gemFactory.create(MORPHING_GEM, stone.getColor());
morphingGem.getAnimatedSprite().setCurrentFrame(6);
morphingGem.updateTransformation();
assertEquals(7, morphingGem.getAnimatedSprite().getCurrentFrame());
}
^TiGeRShArK^
03-03-2008, 22:35
Aggiunto a MorphingGem:
public void updateTransformation()
{
int currentFrame = getAnimatedSprite().getCurrentFrame();
getAnimatedSprite().setCurrentFrame(currentFrame + 1);
}
next test:
public void testMorphingGemNotBecomesGemPrematurely()
{
Droppable morphingGem = gemFactory.create(MORPHING_GEM, stone.getColor());
morphingGem.getAnimatedSprite().setCurrentFrame(5);
morphingGem.updateTransformation();
Droppable gem = morphingGem.transform();
assertTrue(gem instanceof MorphingGem);
}
fatto passare con la seguente modifica:
public Droppable transform()
{
int currentFrame = getAnimatedSprite().getCurrentFrame();
if (currentFrame>=7)
{
return gemFactory.create(GEM, this.getColor());
}
return this;
}
ora andiamo a ritroso tra i test lasciati in sospeso..ne ho rifattorizzati un paio alla luce della nuova Droppable, ma ce ne sta un paio che non passano in TestStoneTurnState. Il primo è il seguente:
public void testStoneTurn()
{
stone.getAnimatedSprite().setCurrentFrame(5);
grid.insertDroppable(stone, 13, 0);
long time = environment.getTimer().getTime();
state.update(time, controller);
controller.update(time);
environment.getTimer().advance(Stone.ANIMATION_FRAME_DELAY);
time = environment.getTimer().getTime();
state.update(time, controller);
controller.update(time);
Droppable droppable = grid.getDroppableAt(Cell.create(13, 0));
assertEquals(6, droppable.getAnimatedSprite().getCurrentFrame());
}
te ne occupi tu tiger? :p
Fermo li', chiarisci quel test.
Cisc, gli spazi sono gratuiti, usali, fra gli operatori e per raggruppare le righe di codice. Non scrivere tutto compresso.
Fermo li', chiarisci quel test.
Cisc, gli spazi sono gratuiti, usali, fra gli operatori e per raggruppare le righe di codice. Non scrivere tutto compresso.
beh..è uno dei test commentati presenti da prima...effettivamente non è che si capisce granchè che vuole testare:stordita:
ah ecco, qua c'è un comportamento di Stone che non ho capito, o meglio, era di Stone prima che introducessimo MorphingGem, adesso dovrebbe averlo quest'ultima (ed è per questo che fallisce quel test, perchè ancora non l'abbiamo introdotto).
In pratica arrivati al momento di trasformare una Stone in una Gem, ovvero quando stone ha il frame 5 nella sua animazione, il successivo updateAnimation i test impongono che il frame non venga avanzato, ma che l'animazione cominci al secondo updateAnimation...non ho capito se è un comportamento voluto dal custumer o cosa :confused:
beh..è uno dei test commentati presenti da prima...effettivamente non è che si capisce granchè che vuole testare:stordita:
Se un test non e' chiaro la soluzione non e' lasciarlo stare, ma riscriverlo :)
Se un test non e' chiaro la soluzione non e' lasciarlo stare, ma riscriverlo :)
ok;)
ah ecco, qua c'è un comportamento di Stone che non ho capito, o meglio, era di Stone prima che introducessimo MorphingGem, adesso dovrebbe averlo quest'ultima (ed è per questo che fallisce quel test, perchè ancora non l'abbiamo introdotto).
In pratica arrivati al momento di trasformare una Stone in una Gem, ovvero quando stone ha il frame 5 nella sua animazione, il successivo updateAnimation i test impongono che il frame non venga avanzato, ma che l'animazione cominci al secondo updateAnimation...non ho capito se è un comportamento voluto dal custumer o cosa :confused:
mi autoquoto, qualche feedback a riguardo?
ah ecco, qua c'è un comportamento di Stone che non ho capito, o meglio, era di Stone prima che introducessimo MorphingGem, adesso dovrebbe averlo quest'ultima (ed è per questo che fallisce quel test, perchè ancora non l'abbiamo introdotto).
In pratica arrivati al momento di trasformare una Stone in una Gem, ovvero quando stone ha il frame 5 nella sua animazione, il successivo updateAnimation i test impongono che il frame non venga avanzato, ma che l'animazione cominci al secondo updateAnimation...non ho capito se è un comportamento voluto dal custumer o cosa :confused:
Non è un comportamento voluto (o meglio, non ho trovato nulla da nessuna parte che ne giustificasse l'introduzione). Quindi, a meno che non ci sia una qualche ragione particolare per la sua esistenza (per sincronizzare le griglie o risolvere un bug, anche se in questo secondo caso non credo sia la scelta migliore) per quel che mi riguarda lo si può prendere a calci rotanti.
^TiGeRShArK^
04-03-2008, 15:45
Non è un comportamento voluto (o meglio, non ho trovato nulla da nessuna parte che ne giustificasse l'introduzione). Quindi, a meno che non ci sia una qualche ragione particolare per la sua esistenza (per sincronizzare le griglie o risolvere un bug, anche se in questo secondo caso non credo sia la scelta migliore) per quel che mi riguarda lo si può prendere a calci rotanti.
ok..
chi sa qualcosa riguardo a qusto comportamento parli ora oppure taccia per sempre :O
:D
io ci dovrei essere in serata penso verso le 9/10 per continuare il pair :p
Non è un comportamento voluto (o meglio, non ho trovato nulla da nessuna parte che ne giustificasse l'introduzione). Quindi, a meno che non ci sia una qualche ragione particolare per la sua esistenza (per sincronizzare le griglie o risolvere un bug, anche se in questo secondo caso non credo sia la scelta migliore) per quel che mi riguarda lo si può prendere a calci rotanti.
E calci rotanti siano.
Allora, dopo piccolo summit tenuto con tiger su msn siamo giunti a due conclusioni:
1) abbiamo preso una strada sbagliata nell'aggiornamento del frame di MorphingGem, infatti l'abbiamo fatto fare a updateTransformation invece dovrebbe seguire ad un update "normale"
2) per implementare i calci rotanti invocati da Jocchan e fek, MorphingGem al primo update deve sapere a quanto ammontava il timestamp dell'ultimo update della Stone, se no non ha riferimenti per verificare che sia passato il giusto delay
Detto questo, il prossimo test va nelle direzioni di cui sopra:
public void testMorphingGemKnowsLastTimestamp()
{
stone.getAnimatedSprite().setCurrentFrame(4);
stone.update(34);
stone.updateTransformation();
Droppable morphingGem = stone.transform();
morphingGem.update(34 + animationUpdateRate);
assertEquals(6, morphingGem.getAnimatedSprite().getCurrentFrame());
}
a te tiger
^TiGeRShArK^
04-03-2008, 21:00
ecco la nuova versione di morphing gem:
public class MorphingGem extends AbstractSingleDroppable
{
private transient DroppableFactory gemFactory;
private long lastUpdateTimeStamp;
private int animationUpdateRate;
public MorphingGem(Environment environment, DroppableColor color, int animationDelay, int animationUpdateRate, long lastUpdateTimeStamp)
{
super(environment.getEngine(), new DroppableDescription(DroppableType.MORPHING_GEM, color), new AnimationDescription(8, animationDelay, animationUpdateRate));
gemFactory = new DroppableFactory(environment);
this.animationUpdateRate = animationUpdateRate;
this.lastUpdateTimeStamp = lastUpdateTimeStamp;
}
public Droppable transform()
{
int currentFrame = getAnimatedSprite().getCurrentFrame();
if (currentFrame>=7)
{
return gemFactory.create(GEM, this.getColor(), 0);
}
return this;
}
public void updateAnimation(long timer)
{
if (timer < lastUpdateTimeStamp + animationUpdateRate)
{
return;
}
int currentFrame = getAnimatedSprite().getCurrentFrame();
getAnimatedSprite().setCurrentFrame(currentFrame + 1);
}
}
ho corretto anche i test precedenti sostituendo update ad updateTrasformation :p
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.