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?
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 ;)
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
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 ;)
- 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 ;)
- 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.
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
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.
Joc le coordinate erano corrette... Non so perchè vengono così... Provo con altri test.. Mi riposti le coordinate? :)
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?
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.