PDA

View Full Version : [CICLO 14] Storia 2: Task 2


redcloud
15-04-2006, 17:22
Allora qualcuno mi da una mano? Soprattutto col testing! Il primo problema è che CrushBox, estendedno Sprite, pulsa più di una volta. La pulsazione però viene gestita nel metodo draw di Sprite. Conviene fare overriding del metodo nella classe CrushBox o conviente modificarlo nella classe Sprite?

VICIUS
15-04-2006, 18:31
Puoi usare getPulseSize() di sprite. Quando questa diventa più grande di 2 * Math.PI allora ha fatto una pulsazione completa, quindi si è ingrandita ed è poi ritornata alla dimensione originale.

ciao ;)

fek
15-04-2006, 19:12
Ok, redcloud sta facendo il task in pair con me.

redcloud
15-04-2006, 19:18
- Verifica che al momento della creazione la CrushBox non stia pulsando

public void testCrushBoxIsPulsingWhenCreated()
{
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);

assertTrue("CrushBox is pulsing", crushBox.getNumberOfPulses == 0);
}

redcloud
15-04-2006, 19:29
- La soluzione più semplice che mi viene in mente è questa, ma forse è troppo semplice!

public int getNumberOfPulses()
{
return 0;
}

nella classe Sprite

VICIUS
15-04-2006, 19:32
Puoi usare getPulseSize() di sprite. Quando questa diventa più grande di 2 * Math.PI allora ha fatto una pulsazione completa, quindi si è ingrandita ed è poi ritornata alla dimensione originale.

ciao ;)
Ho visto ora che nei sorgenti c'è un Math.abs quindi la pulsazione completa è Math.PI.

ciao ;)

VICIUS
15-04-2006, 19:33
- Verifica che al momento della creazione la CrushBox non stia pulsando

public void testCrushBoxIsPulsingWhenCreated()
{
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);

assertTrue("CrushBox is pulsing", crushBox.getNumberOfPulses == 0);
}

Basta usare isPulsing che è gia testato.

ciao ;)

fek
15-04-2006, 19:34
- La soluzione più semplice che mi viene in mente è questa, ma forse è troppo semplice!

public int getNumberOfPulses()
{
return 0;
}

nella classe Sprite

Se fa passare tutti i test non e' mai troppo semplice, anzi :)

E' la soluzione perfetta, ora l'altro test.

fek
15-04-2006, 19:41
Basta usare isPulsing che è gia testato.

ciao ;)

Vogliamo introdurre il concetto di numero di pulsazioni, quindi ci serviva quel test che richiede il nuovo metodo.

redcloud
15-04-2006, 20:40
public void testCrushBoxPulseAtLeastOneTime()
{
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);
EngineInterface engine = Engine.createEngineForTesting(800, 600);

crushBox.setSpeedDivider(1.0f);
crushBox.setSizeMultiplier(4.0f);
crushBox.show();
crushBox.startPulsing();

crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);

float pulseSize = 0.0f;


for(int i = 0; i < 4; i++)
{
pulseSize += 1/crushBox.getSpeedDivider();
}

assertEquals(crushBox.getPulseSize(), pulseSize);
assertEquals(1, crushBox.getNumberOfPulses());

}

redcloud
16-04-2006, 02:08
Soluzione

public int getNumberOfPulses()
{
return (pulseSize >= Math.PI) ? 1 : 0;
}

Sempre in Sprite

redcloud
16-04-2006, 09:40
public void testCrushBoxIsPulsingOneTime()
{
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);
EngineInterface engine = Engine.createEngineForTesting(800, 600);

crushBox.setSpeedDivider(0.34906587f);
crushBox.setSizeMultiplier(4.0f);
crushBox.show();
crushBox.startPulsing();

for(int i = 0; i < 9; i++)
{
crushBox.draw(engine);
}


float pulseSize = 0.0f;

for(int i = 0; i < 9; i++)
{
pulseSize += 1/crushBox.getSpeedDivider();
}

assertEquals(crushBox.getPulseSize(), pulseSize);
assertEquals(1, crushBox.getNumberOfPulses());
}

redcloud
16-04-2006, 09:42
public void testCrushBoxIsPulsingNTimes()
{
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);
EngineInterface engine = Engine.createEngineForTesting(800, 600);

crushBox.setSpeedDivider(0.62831853f);
crushBox.setSizeMultiplier(4.0f);
crushBox.show();
crushBox.startPulsing();

for(int i = 0; i < 10; i++)
{
crushBox.draw(engine);
}

float pulseSize = 0.0f;

for(int i = 0; i < 10; i++)
{
pulseSize += 1/crushBox.getSpeedDivider();
}

assertEquals(crushBox.getPulseSize(), pulseSize);
assertEquals(2, crushBox.getNumberOfPulses());


for(int i = 0; i < 10; i++)
{
crushBox.draw(engine);
}

for(int i = 0; i < 10; i++)
{
pulseSize += 1/crushBox.getSpeedDivider();
}

assertEquals(crushBox.getPulseSize(), pulseSize);
assertEquals(4, crushBox.getNumberOfPulses());
}

redcloud
16-04-2006, 11:41
Soluzione:

public int getNumberOfPulses()
{
if(speedDivider > 0.0f)
{
float numberOfPulses = ((pulseSize * speedDivider) * speedDivider)
/ (float)Math.PI;

float nextPulse = pulseSize + 1/speedDivider;

float numberOfPulsesPlusOne = ((nextPulse * speedDivider) *
speedDivider) / (float)Math.PI;

if((int) numberOfPulsesPlusOne > (int) numberOfPulses)
{
return (int) numberOfPulsesPlusOne;
}
else
{
return (int) numberOfPulses;
}
}

return 0;

}

redcloud
16-04-2006, 12:05
public void testCrushBoxWithConfigValues()
{
Config config = Config.createForTesting();
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);
EngineInterface engine = Engine.createEngineForTesting(800, 600);

crushBox.setSpeedDivider(10.0f);
crushBox.setSizeMultiplier(4.0f);

float speedDividerFromConfig = config.getInteger("CrushBoxSpeedDivider");
float sizeMultiplierFromConfig = config.getInteger("CrushBoxSizeMultiplier");

assertEquals(speedDividerFromConfig, crushBox.getSpeedDivider());
assertEquals(sizeMultiplierFromConfig, crushBox.getSizeMultiplier());
}

redcloud
16-04-2006, 12:10
Soluzione:

Ho aggiunto due chiavi nel file GameConfig

CrushBoxSpeedDivider = 10
CrushBoxSizeMultiplier = 4

P.s. nello stesso file c'è una chiava crashBoxSpeed che forse dovrebbe essere cambiata in crushBoxSpeed

Jocchan
16-04-2006, 13:16
P.s. nello stesso file c'è una chiava crashBoxSpeed che forse dovrebbe essere cambiata in crushBoxSpeed

Vero, va cambiato.
Red, ho notato che nell'ultima build le coordinate delle CrushBox sono sballate. E' una cosa temporanea, che tornerà a posto alla fine del task?

redcloud
16-04-2006, 14:48
Si l'ho notato anche io ma gia da prima che facessi il primo commit, ho dimenticato di segnalarlo! Cmq non dipende da me, io con le coordinate non ci lavoro. Se ne dovrebbe occupare chi ha fatto il task 3.

Ufo13
16-04-2006, 15:00
Joc le coordinate erano corrette... Non so perchè vengono così... Provo con altri test.. Mi riposti le coordinate? :)

Jocchan
16-04-2006, 15:03
x=-67 y=192 per il P1 e x=611 y=192 per il P2

redcloud
16-04-2006, 18:00
Altro test:

public void testCrushBoxIsNotPulsingAfterOnePulse()
{
CrushBox crushBox = new CrushBox(new Point(2, 2), 10, 600);
EngineInterface engine = Engine.createEngineForTesting(800, 600);

crushBox.setSpeedDivider(1.5f);
crushBox.setSizeMultiplier(4.0f);
crushBox.show();
crushBox.startPulsing();

crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);
crushBox.draw(engine);
assertEquals(1, crushBox.getNumberOfPulses());

assertFalse(crushBox.isPulsing());
}

ma per far verificare in

private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());
crushBox.show();

crushBox.startPulsing();

if(crushBox.getNumberOfPulses() == 1)
{
crushBox.stopPulsing();
}

lastCrushBoxUpdate = timer.getTime();
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
crushBox.hide();
}
else
if (!crushBox.isOffScreen())
{
crushBox.update();
}
}

la condizione evidenziata, cosa devo fare? In pratica (nel test) dovrei portare il ChainCounter ad almeno 2. Suggerimenti?

Bonfo
16-04-2006, 18:03
Quella condizione fa si che si vede la CrushBox solo se si fanno catena di almeno 2.
Ovvero l'eliminazione in un colpo solo di gemme con 1 o 2 chest non conta, conta solo se si eliminano delle gemme e di conseguenza, dopo la caduta, se ne eliminano delle altre e così via...fino ad arrivare a cifre spropositate :D :D

redcloud
16-04-2006, 20:00
Soluzione:

private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());

crushBox.setSizeMultiplier(crushBoxSizeMultiplier);
crushBox.setSpeedDivider(crushBoxSpeedDivider);

crushBox.show();

if(!stopPulsingState)
{
crushBox.startPulsing();
}

lastCrushBoxUpdate = timer.getTime();
}
if(crushBox.getNumberOfPulses() == 1)
{
crushBox.stopPulsing();
stopPulsingState = true;
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
crushBox.hide();
stopPulsingState = false;
}
else
if (!crushBox.isOffScreen())
{
crushBox.update();
}
}

e direi anche Task completato. Che fatica! Voglio ringraziare tutti e in particolar modo fek e Vicius! Spero vada bene.