PDA

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

cisc
01-03-2008, 13:56
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);
}
}

cisc
01-03-2008, 14:43
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

Ufo13
01-03-2008, 15:12
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

Ufo13
01-03-2008, 15:36
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

fek
01-03-2008, 20:40
Bene cosi'! :)

^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:

Ufo13
02-03-2008, 15:54
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

fek
02-03-2008, 16:10
Ma quindi in questo caso è YAGNI o no? :fagiano:

http://i27.tinypic.com/2rffvhv.gif

Ufo13
02-03-2008, 19:33
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)

cisc
03-03-2008, 09:24
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:

cisc
03-03-2008, 09:50
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:

fek
03-03-2008, 10:17
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.

cisc
03-03-2008, 17:22
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

fek
03-03-2008, 18:10
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...

cisc
03-03-2008, 21:30
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

cisc
03-03-2008, 22:23
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);
}

cisc
03-03-2008, 22:53
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

fek
03-03-2008, 23:06
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.

cisc
03-03-2008, 23:18
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:

cisc
03-03-2008, 23:31
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:

fek
04-03-2008, 09:52
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 :)

cisc
04-03-2008, 12:14
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?

Jocchan
04-03-2008, 15:27
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

fek
04-03-2008, 17:11
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.

cisc
04-03-2008, 20:21
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