Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Tutti gli articoli Tutte le news

Vai al Forum
Discussione Chiusa
 
Strumenti
Old 13-12-2005, 11:10   #1
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
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:
  • Mai fare a gara a chi finisce il task per primo, meglio procedere con calma, altrimenti perderemo molto più tempo in seguito
  • Evitiamo di complicarci la vita, esiste di certo una soluzione più semplice di quella che abbiamo pensato di implementare
  • MAI aggiungere elementi non richiesti esplicitamente dai task: se mai serviranno, se ne parlerà nelle prossime storie
  • Comunichiamo il più possibile, se qualcosa non è chiaro discutiamone tutti i dettagli fino ad eliminare ogni dubbio, anche il più insignificante
  • Postare sempre la test list PRIMA di mettere mano al codice
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam.

Ultima modifica di Jocchan : 13-12-2005 alle 20:20.
Jocchan è offline  
Old 13-12-2005, 20:33   #2
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
Piccolo schema riassuntivo per le rotazioni:
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam.
Jocchan è offline  
Old 16-12-2005, 11:33   #3
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
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 11:28.
VICIUS è offline  
Old 16-12-2005, 12:29   #4
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
prendo Xmas.2.4, 2 giorni dopo la fine del task 1
Ufo13 è offline  
Old 16-12-2005, 16:06   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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!
DanieleC88 è offline  
Old 16-12-2005, 17:43   #6
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Prendo l'Xmas 2.1
tempo 2 giorni
thebol è offline  
Old 16-12-2005, 20:18   #7
71104
Bannato
 
L'Avatar di 71104
 
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)
71104 è offline  
Old 16-12-2005, 21:46   #8
fek
Senior Member
 
L'Avatar di fek
 
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.
fek è offline  
Old 16-12-2005, 22:49   #9
thebol
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
thebol è offline  
Old 16-12-2005, 23:21   #10
thebol
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());   
       
    }
poi inserisco il test

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));
    }
implemento:

Codice:
    public void insertTwoNewGem()
    {
        insertGem(1,4, gemGenerator.extract());
        insertGem(0,4, gemGenerator.extract());
    }
ora devo settare la prima come master, e la seconda come slave

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");
    }
e

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 : 16-12-2005 alle 23:24.
thebol è offline  
Old 16-12-2005, 23:30   #11
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da thebol
poi inserisco il test

Codice:
    public void testInsertTwoNewGem()
    {
        int oldNumberOfGems = grid.getNumberOfGems();
        grid.insertTwoNewGem();
        assertTrue("two gem are added", grid.getNumberOfGems() - 2 == oldNumberOfGems);
    }
Qui secondo me convine usare: assetEquals("...", oldNumberOfGems + 2, grid.getNumberOfGems())
in questo modo è molto piu chiaro quello che vuoi testare.

ciao
VICIUS è offline  
Old 17-12-2005, 00:01   #12
thebol
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);
    }
si sarebbe potuto creare un metodo insertGemUnderControl, ma per adesso penso vada bene cosi.

la insertNewGem() diventa percio

Codice:
        Gem gem1 = gemGenerator.extract();
        insertGemIntoColumn(4, gem1);
        setGemUnderControl(gem1);
la build cosi è molto rotta, perche in molti test(nel codice forse no, il gioco sembra andare bene) la insertGem e stata usata presupponendo che mettesse anche la gemma sotto controllo.

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());
    }
con relativa implementazione
Codice:
    public void insertGemAsSlave(int row, int column, Gem gem)
    {
        insertGem(row, column, gem);
        setGemSlave(gem);
    }

Ultima modifica di thebol : 17-12-2005 alle 00:06.
thebol è offline  
Old 17-12-2005, 00:05   #13
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da VICIUS
Qui secondo me convine usare: assetEquals("...", oldNumberOfGems + 2, grid.getNumberOfGems())
in questo modo è molto piu chiaro quello che vuoi testare.

ciao
fatto
thebol è offline  
Old 17-12-2005, 00:20   #14
thebol
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());
    }
e posso testare il fatto che

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());
    }
(Avrei dovuto fare il contrario, sorry :\ )


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
thebol è offline  
Old 17-12-2005, 20:52   #15
thebol
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);
    }
modificando il metodo update di grid

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);
    }
per farlo passare, basta andare nella classe LeftKeyHandler e modificare executeWhenPressed

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
thebol è offline  
Old 17-12-2005, 22:53   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
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....
__________________
^TiGeRShArK^ è offline  
Old 17-12-2005, 22:57   #17
thebol
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?
thebol è offline  
Old 18-12-2005, 11:00   #18
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
Quote:
Originariamente inviato da thebol
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?
Non hai tutti i torti, in effetti ci starebbe bene un sesto task, per definire il comportamento anche nei casi di posizionamenti relativi differenti.
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.
Jocchan è offline  
Old 18-12-2005, 11:06   #19
cionci
Senior Member
 
L'Avatar di cionci
 
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 11:09.
cionci è offline  
Old 18-12-2005, 11:20   #20
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Quote:
Originariamente inviato da cionci
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...
Sono d'accordissimo sul GemsPair che renderebbe il tutto mooolto più facile da gestire, però non capisco perchè deve derivare da Gem...
Ufo13 è offline  
 Discussione Chiusa


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
Apple potrebbe aver sospeso il progetto ...
Nintendo non seguirà l'esempio di...
Motorola ha lanciato un'app dedicata all...
Cyberpunk 2077 non si ferma e raggiunge ...
Samsung alza ancora i prezzi delle memor...
4 sconti tutti nuovi riscrivono la TOP 1...
Portatile HP con Intel Core Ultra 7 155H...
Smart TV Haier 50'' 4K crolla a 225,99€ ...
Google Pixel 10a a 399€ o 497€ (256GB) c...
Compare dal nulla e blocca lo schermo: c...
Tornano i super prezzi Nikon su Amazon, ...
Compatto, leggerissimo (1,2Kg), ma con 3...
Privacy Display per tutti i Galaxy S: Sa...
Le migliori cuffie in offerta su Amazon ...
SpaceX Starship: Ship 40 ha eseguito un ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:35.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v