|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
[CICLO 6/bis] Xmas Carol Story 2
Visto che siete insaziabili, e avete già prenotato tutti i task disponibili, allora possiamo permetterci di introdurre anche una nuova storia, che ci porterà ancora più vicini ad una versione effettivamente giocabile. Questa storia è indipendente dalla precedente, quindi potrete prenotarvi per i task fin da subito.
Storia 2: Le gemme devono scendere a coppie di due, sebbene la loro caduta sia scollegata. Quella inizialmente in basso è la gemma primaria della coppia, quella inizialmente in alto è la secondaria. Premendo il tasto Z, la secondaria deve cambiare posizione ruotando (ma non su sè stessa, le png devono avere lo stesso aspetto) in senso antiorario intorno alla primaria. Premendo il tasto X, invece, la secondaria deve ruotare in senso orario. Se la casella di destinazione della gemma secondaria è già occupata, e la rotazione è impossibile, la gemma verrà automaticamente fatta ruotare ulteriormente nello stesso senso di rotazione, fino a trovare una casella libera in cui posizionarla. Gli effetti delle rotazioni sono descritti nello schema: - secondaria sopra la primaria -> la secondaria andrà rispettivamente a sinistra o a destra della primaria - secondaria a sx della primaria -> andrà rispettivamente sotto o sopra - secondaria sotto la primaria -> andrà rispettivamente a destra o a sinistra - secondaria a dx della primaria -> andrà rispettivamente sopra o sotto Mediante il tasto C, la gemma secondaria dovrà ruotare di due posizioni. Quando ognuna delle due gemme collide con qualche oggetto sottostante, l'altra - se non troverà nulla al di sotto - proseguirà indipendentemente la propria caduta. Il box Next continuerà a mostrare, senza incertezze, la coppia di gemme immediatamente successiva a quella attualmente in caduta (la nuova primaria in basso, la nuova secondaria in alto). Punti cardine da tenere a mente durante i lavori:
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. Ultima modifica di Jocchan : 13-12-2005 alle 21:20. |
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Piccolo schema riassuntivo per le rotazioni:
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Ecco i task per questa nuova storia.
Task Xmas.2.1: thebol + Ufo13: completato GridControl deve ora creare due gemme. La prima si chiamera pivot e sara quella sotto controllo tramite input. La secondaria deve seguire i movimenti della prima. Xmas.2.2: DanieleC88: completato Intercettare la pressione del tasto Z e ruotare la gemma secondaria di 90° in senso orario attorno al pivot Xmas.2.3: VICIUS: completato Intercettare la pressione del tasto X e ruotare la gemma secondaria di 90° in senso anti-orario attorno al pivot Xmas.2.4: VICIUS: completato Intercettare la pressione del tasto C e ruotare la gemma secondaria di 180°. Xmas.2.5: 71104: completato Quando una delle due gemme collide entrambe perdono il controllo e quella ancora libera precipita verso la prima cella libera. ciao Ultima modifica di VICIUS : 04-01-2006 alle 12:28. |
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
prendo Xmas.2.4, 2 giorni dopo la fine del task 1
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Il Xmas.2.2 è mio.
1 giorno, direi.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Prendo l'Xmas 2.1
tempo 2 giorni |
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
vorrei il 5°, 2 giorni a partire da quando finisco il task del game over ^^'
(provo a finirlo adesso) |
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ho fatto un corposo refactoring di GridController e InputReactor (cionci, e' quello di cui abbiamo parlato). Fate un bell'update prima di iniziare i vostri task.
Mi raccomando la test list.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
testlist provvisoria:
test inserire 2 gemme in grid e posizione test che la prima gemma inserita sia quella sottocontrollo(pivot) e nella posizione 1,4 test che la seconda gemma sia in 0,4 test che a un movimento della prima gemma, corrisponda un movimento analogo della seconda naturalmente, varie ed eventuali |
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Lo scopo del task è generare 2 gemme e metterle sotto il controllo di grid.
Per fare questo, voglio pero aggiungere un test, per controllare che la queue dopo essere stata creata sia full Codice:
public void testFullAfterNew()
{
assertTrue("queue must be full",new GemQueue(Config.createForTesting()).isFull());
}
Codice:
public void testInsertTwoNewGem()
{
int oldNumberOfGems = grid.getNumberOfGems();
grid.insertTwoNewGem();
assertTrue("two gem are added", grid.getNumberOfGems() - 2 == oldNumberOfGems);
}
public void testPositionOfInsertTwoNewGem()
{
grid.insertTwoNewGem();
assertTrue("one jem at 0,4", grid.isGemAt(0, 4));
assertTrue("one jem at 1,4", grid.isGemAt(1, 4));
}
Codice:
public void insertTwoNewGem()
{
insertGem(1,4, gemGenerator.extract());
insertGem(0,4, gemGenerator.extract());
}
devo introdurre un nuovo metodo che inserisca la gemma come slave(ho aggiunto la variabile gemSlave). ma ancor prima devo creare e testare che la setGemSlave e getSlave Codice:
public void testGetGemSlave()
{
grid.setGemSlave(gem1);
assertSame("Wrong gem under control", gem1, grid.getGemSlave());
}
public void testGetgemSlaveIsNotInTheGrid()
{
try
{
grid.insertGem(0, 0, gem1);
grid.setGemSlave(Gem.createForTesting());
}
catch(IllegalArgumentException e2)
{
return;
}
fail("must throw if gem is not in the grid");
}
Codice:
public Gem getGemSlave()
{
return gemSlave;
}
public void setGemSlave(Gem gem)
{
if(!gem.isAttachedToGrid())
{
throw new IllegalArgumentException();
}
gemSlave= gem;
}
introduco poi il metodo insertGemAsSlave(...) Ultima modifica di thebol : 17-12-2005 alle 00:24. |
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
in questo modo è molto piu chiaro quello che vuoi testare. ciao |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
A questo punto per la insertGemAsSlave devo testare:
che inserisca la gemma in grid, che dove la inserisca non ci siano altre gemme, etc Pero primi mi rendo conto che insertGemAsSlave fa praticamente tutto il lavoro di insertGem, ma invece di chiamare alla fine setGemUnderControl(gem); chiamerà setGemSlave(gem); per questo, prima di implementare insertGemSlave, faccio un po di refactoring. tolgo la setGemUnderCOntrol(gem) da insertGem (rendendola piu generica) e la sposto nella insertNewGem che diventa Codice:
public void insertNewGem()
{
Gem gem1 = gemGenerator.extract();
insertGemIntoColumn(4, gem1);
setGemUnderControl(gem1);
}
la insertNewGem() diventa percio Codice:
Gem gem1 = gemGenerator.extract();
insertGemIntoColumn(4, gem1);
setGemUnderControl(gem1);
percui, rifaccio lo stesso refactoring ma in un altra maniera prima rinomino insertGem in insertGemUnderControl, e poi ci estraggo tutto il codice tranne l'ultim riga e rinomino il metodo insertGem. Alla fine la insertGemUnderControl è venuta fuori =D. Si potrebbe fare un po di refactoring sui test per vedere dove andrebbe usate insertGem invece che insertGemUnderControl(la ex insertGem), ma si puo fare in futuro. [la nuova funzione insertGem e testata implicitamente da tutti i test che testano insertGemUnderControl, percui escluso il discorso di prima, non cè bisogno di toccare i test] a questo punto posso aggiungere Codice:
public void testInsertGemAsSlave(){
grid.insertGemAsSlave(0, 0, gem1);
assertSame("Wrong gem slave", gem1, grid.getGemSlave());
}
Codice:
public void insertGemAsSlave(int row, int column, Gem gem)
{
insertGem(row, column, gem);
setGemSlave(gem);
}
Ultima modifica di thebol : 17-12-2005 alle 01:06. |
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
dopo questa modifica insertTwoNewGem() diventa
Codice:
public void insertTwoNewGem()
{
insertGemUnderControl(1,4, gemGenerator.extract());
insertGemAsSlave(0,4, gemGenerator.extract());
}
Codice:
public void testInsertTwoNewGem()
{
int oldNumberOfGems = grid.getNumberOfGems();
grid.insertTwoNewGem();
assertEquals("two gem are added", oldNumberOfGems +2, grid.getNumberOfGems());
assertNotNull("Gem under control is null", grid.getGemUnderControl());
assertNotNull("Gem slave is null", grid.getGemSlave());
}
ora manca il test per il movimento simultaneo della gemmaPivot e per la slave mi verrebbe da testare che a ogni movimento le posizioni relative rimangano costanti, ma se a qualcuno viene un idea migliore, forse e meglio |
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
inizio testando che la seconda gemma cada per la gravita
Codice:
public void testTwoGemIsMovingWhenLowerCellIsEmpty()
{
grid.insertGemUnderControl(1, 4, gem1);
grid.insertGemAsSlave(0,4,gem2);
//grid.setGemUnderControl(gem1);
grid.setGravity(1.0f);
float oldPositionPivot = gem1.getY();
float oldPositionSlave = gem2.getY();
grid.update(new MockTimer());
assertEquals("Gem Pivot is not moving when cell under current position is empty",
oldPositionPivot + 1.0f, gem1.getY(), 0.0001f);
assertEquals("Gem Slave is not moving when cell under current position is empty",
oldPositionSlave + 1.0f, gem2.getY(), 0.0001f);
}
Codice:
public void update(AbstractTimer timer)
{
updateGemAnimations(timer);
if(getGemUnderControl() == null)
{
return;
}
if(gemCantMoveDown(getGemUnderControl()))
{
alignGemToCellUpperBound(getGemUnderControl());
getGemUnderControl().dropGem();
if(gemIsSurroundedBySameType(getGemUnderControl()))
{
getGemUnderControl().useBrighterImage();
}
}
else
{
moveGem(getGemUnderControl());
if (getGemSlave() == null){
return;
}
moveGem(getGemSlave());
}
}
Cosi facendo, tutti i test passano e posso andare avanti. [NB, con questa implementazione ci puo essere un bug se girando le gemme, quella piu in basso risulta la slave. Ma mi sembra che questa cosa vada risolta col 4 task, percui se non ricevo altre informazioni, questo caso non sarà coperto in questo task] questo test compre anche il caso della pressione del tasto down, che presuppone un aumento del fattore gravity Ora ce da testare che se spingo lefkey, entrambe le gemme si spostino(andra poi fatto uguale per rightkey) Codice:
public void testTwoGemMoveLeft()
{
grid.insertGemUnderControl(1, 4, gem1);
grid.insertGemAsSlave(0, 4, gem2);
input.generateKey(KeyCode.vk_Left, timer.getTime());
inputReactor.reactToInput();
assertEquals("Gem pivot didnt move to the left", grid.getGemAt(1, 3), gem1);
assertEquals("Gem slave didnt move to the left", grid.getGemAt(0, 3), gem2);
}
Codice:
public void executeWhenPressed(InputReactor inputReactor)
{
KeyEventHandler rightHandler = inputReactor.getKeyHandler(KeyCode.vk_Right);
if(!rightHandler.wasRepeated()
&& !rightHandler.hasBeenRepeated(
inputReactor.getLastInputTimeStamp()))
{
if(this.grid.getGemUnderControl() != null)
{
this.grid.moveGemLeft(this.grid.getGemUnderControl());
}
if(this.grid.getGemSlave() != null)
{
this.grid.moveGemLeft(this.grid.getGemSlave());
}
}
}
analogo per il moveRight |
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
non ci posso credereeee!!!
mi avete lasciato il 2.3!!! sono commosso!!! non ci speravo proprio che dei lupi famelici come voi mi lasciassero qualcosa.... VICIUUUUSSSS:.. prenotami prima che se lo mangi qualcunoooo!!!!!! tempo stimato ....... se il pc a torino non si è autodistrutto direi 2 giorni....
__________________
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
ho una domanda da fare.
i test per il movimento, non è propriamente corretto, nel senso che se le 2 gemme sono messe in orizzontale (2,1)(2,0) puo non funzionare. Questa e pero una casistica compresa nel mio task? in teoria no, visto che non è ancora possibile farle girare... percui introddurre questo test e andare fuori task o no? |
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
Quando vedo Vicius su MSN vedremo di elaborarlo e di postarlo. Poi, se nessuno si prenota, allora sarà tuo di diritto
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sinceramente io avrei visto benissimo una classe GemsPair derivata da Gem con una istanza della gemma slave all'interno...
Continuando così si rende Grid troppo complicato...magari avrebbe dovuto essere il task Xmas.2.0... Ultima modifica di cionci : 18-12-2005 alle 12:09. |
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Quote:
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:10.


















