Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-12-2005, 10:20   #1
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
[Ciclo 6] Pair Programming task 6.2.3 (fek vs cionci clash of the titans)

Implementare le animazioni in sprite cambiando frame ogni decimo di secondo. Al termine del'animazione si deve mostrare il frame di base per 3500 millisecondi prima di ripartire.



Il task parla di scrivere in Sprite, ma guardando il codice ci pare piu' semplice scrivere in Gem, quindi proseguiamo per questa strada.

Test list:

- testare che una gemma appena creata abbia solo un frame di animazione
- testare che all'aggiunta di un frame di animazione, la gemma ne abbia due
- testare che all'update della gemma, cicli dal primo al secondo frame di animazione
- testare che ogni frame abbia un tempo di durata
- se la gemma si trova al frame 0 deve passare al frame 1 dopo 3500 ms
- se la gemma si trova al frame X con X > 0 deve passare al frame X + 1 dopo 100 ms
- se la gemma si trova al frame N-1 deve ritornare al frame 0 dopo 100 ms

Per ora iniziamo con questi, ce ne verranno certamente in mente altri.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 10:24   #2
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Primo test: una gemma appena creata ha un frame di animazione.

Codice:
package it.diamonds.tests;

import it.diamonds.Gem;
import junit.framework.TestCase;

public class TestGemAnimation extends TestCase
{
    public void TestNewGemHasOneFrame()
    {
        Gem gem = Gem.createForTesting();

        assertEquals("A new gem must have only one frames", 1, gem.getNumberOfFrames());
    }    
}
A te

(Codice minimo indispensabile per far passare il test)

Ultima modifica di fek : 11-12-2005 alle 10:32.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 10:29   #3
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
Aggiunto questo codice a Gem:
Codice:
    public int getNumberOfFrames()
    {
        return 1;
    }

Ultima modifica di cionci : 11-12-2005 alle 10:32.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 10:35   #4
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
Nuovo test: aggiunta di un frame a Gem
Codice:
    public void testAddingOneFrame()
    {
        Gem gem = Gem.createForTesting();
        
        gem.addFrame(new Rectangle(10, 10, 20, 20));

        assertEquals("gem must have two frames", 2, gem.getNumberOfFrames());
    }
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 10:46   #5
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Dato che la dimensione dello sprite e' fissa, fornire quest'informazione anche in addFrame mi sembra una duplicazione (non supportiamo scalamenti per ora).

Modificherei il test cosi':

Codice:
    public void testAddingOneFrame()
    {
        Gem gem = Gem.createForTesting();
        
        gem.addFrame(10, 10);

        assertEquals("gem must have two frames", 2, gem.getNumberOfFrames());
    }
Faccio compilare il test cosi':

Codice:
    public void addFrame(int x, int y)
    {
        // TODO Auto-generated method stub
    }
Notare come mi e' bastasto cliccare sull'errore e Eclipse ha aggiunto il metodo corretto per me.

Lancio i test, compilano e il test fallisce:

junit.framework.AssertionFailedError: gem must have two frames expected:<2> but was:<1>

Il test si aspetta 2 ma riceve 1. Modifico il codice per far passare il test.

Codice:
    private int numberOfFrames;

    public int getNumberOfFrames()
    {
        return numberOfFrames;
    }


    public void addFrame(int x, int y)
    {
        numberOfFrames = 2;
    }
Lancio i test e.... fallisce il primo test:

junit.framework.AssertionFailedError: A new gem must have no frames expected:<1> but was:<0>

Non sto barando, e' andata proprio cosi', ho dimenticato di inizializzare il campo numberOfFrames

Per fortuna il primo test era li', pronto a ricordarmelo in caso di errore. Sto scrivendo mentre programmo.

Correggo:

Codice:
    private int numberOfFrames = 1;
Lancio i test e va tutto bene.

Ora proseguo per triangolazione con un nuovo test:

Codice:
    public void testAddingTwoFrames()
    {
        Gem gem = Gem.createForTesting();
        
        gem.addFrame(10, 10);
        gem.addFrame(10, 20);        

        assertEquals("gem must have three frames", 3, gem.getNumberOfFrames());
    }
Il test ovviamente fallisce.
junit.framework.AssertionFailedError: gem must have three frames expected:<3> but was:<2>

Cionci a te.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 10:53   #6
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
Test passato modificando questo metodo:
Codice:
    public void addFrame(int x, int y)
    {
        ++numberOfFrames;
    }
Vado a scrivere il prossimo test...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 10:56   #7
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
Il frame corrente deve essere 0 appena viene creata la gemma...
Codice:
    public void testCurrentFrame()
    {
        Gem gem = Gem.createForTesting();

        assertEquals("current frame must be 0", 0, gem.getCurrentFrame());        
    }

Ultima modifica di cionci : 11-12-2005 alle 10:59.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:03   #8
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Ecco il metodo che fa passare il test.

Codice:
    public int getCurrentFrame()
    {
        return 0;
    }
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:07   #9
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Ttestare che all'update della gemma, cicli dal primo al secondo frame di animazione.

Codice:
    public void testUpdate()
    {
        Gem gem = Gem.createForTesting();
        
        gem.addFrame(10, 10);
        gem.update();
        
        assertEquals("current frame must be 1 after an update", 1, gem.getCurrentFrame());                
    }
Notare come questi due test impongano la convenzione che il primo frame dell'animazione e' il frame 0 e presumibilmente si ciclera' dal frame 0 al frame N-1.

Cionci a te.

Ultima modifica di fek : 11-12-2005 alle 11:14.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:15   #10
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
Ho aggiunto:

private int currentFrame = 0;
Codice:
    public int getCurrentFrame()
    {
        return currentFrame;
    }


    public void update()
    {
        currentFrame = 1;        
    }

Ultima modifica di cionci : 11-12-2005 alle 11:17.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:23   #11
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
Il prossimo test ci impone di spostarci di un frame per ogni update che viene fatto...
Codice:
    public void testUpdateWithThreeFrames()
    {
        Gem gem = Gem.createForTesting();
        
        gem.addFrame(10, 10);
        gem.addFrame(20, 20);
        gem.update();
        gem.update();
        
        assertEquals("current frame must be 2 after two update", 2, gem.getCurrentFrame());                
    }
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:28   #12
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Una sola riga da cambiare:

Codice:
    public void update()
    {
        ++currentFrame;        
    }
Beck sarebbe fiero di noi, forma pura di TDD
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:30   #13
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:33   #14
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Test: testare che ogni frame abbia un tempo di durata (in millisecondi)

Codice:
    public void testFrameLengt()
    {
        gem.addFrame(10, 10, 1000);
        
        assertEquals("frame length is wrong", 1000, gem.getFrameLength(0));                
    }
Ho spostato la creazione della gemma nel metodo setUp() eliminando la duplicazione e poi ho aggiunto le specifiche per un parametro in piu' al metodo addFrame(). Ora, cionci puo' modificare tutti gli altri test per aggiungere un parametro oppure aggiungere un metodo addFrame() con due parametri che delega al metodo addFrame() con tre parametri passando un valore di default. A lui la scelta.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:34   #15
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
beh almeno io vi seguo passo passo se può consolarvi
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:36   #16
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
Quote:
Originariamente inviato da Ufo13
beh almeno io vi seguo passo passo se può consolarvi
Non sei il solo
Azz... la nostra copertura è saltata...
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:39   #17
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
Aggiunto il codice che fa passare il test:
Codice:
    public void addFrame(int x, int y, int delay)
    {
        ++numberOfFrames;
    }

    public int getFrameLength(int index)
    {
        return 1000;
    }
Passo a scrivere il prossimo test...
Un saluto a tutti

Ovviamente ho corretto tutti gli altri test per compilare senza problemi...

Ultima modifica di cionci : 11-12-2005 alle 11:42.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 11:43   #18
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
Nuovo test e la situazione si fa interessante:
Codice:
    public void testTwoFrameLengths()
    {
        gem.addFrame(10, 10, 1000);
        gem.addFrame(10, 10, 100);
        
        assertEquals("frame one length is wrong", 1000, gem.getFrameLength(0));                
        assertEquals("frame two length is wrong", 100, gem.getFrameLength(1));                
    }
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 12:21   #19
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da cionci
Nuovo test e la situazione si fa interessante:
Si', si fa interessante perche' non saprei come farlo passare con un solo cambiamento semplice. Allora lo tengo un attimo da parte e preparo un altro test che mi porti un po' piu' vicino alla soluzione.

Ecco il test:

Codice:
package it.diamonds.tests;

import it.diamonds.Frame;
import junit.framework.TestCase;

public class TestFrame extends TestCase
{
    public void testLength()
    {
        Frame frame = new Frame(10, 10, 1000);
        
        assertEquals("Frame length must be 1000", 1000, frame.getLength());        
    }

}
Ecco il codice che lo fa passare:

[code]
package it.diamonds;

public class Frame
{
public Frame(int x, int y, int length)
{
}

public int getLength()
{
return 1000;
}
}
[code]

Vado avanti per triangolazione:

Codice:
    public void testLength()
    {
        Frame frame1 = new Frame(10, 10, 1000);
        assertEquals("Frame length must be 1000", 1000, frame1.getLength());
        
        Frame frame2 = new Frame(10, 10, 2000);
        assertEquals("Frame length must be 2000", 2000, frame2.getLength());        
        
    }
Il test fallisce.

Ed ecco il codice che lo fa passare:
Codice:
public class Frame
{
    int length;
    
    public Frame(int x, int y, int length)
    {
        this.length = length;
    }

    public int getLength()
    {
        return length;
    }
}
Ora sono un passettino piu' vicino alla soluzione. Ho una classe Frame e posso modificare Gem per usare un'array di questi Frame ed eliminare un po' di campi inutili, semplificando il codice.

E' il momento di fare un po' di refactoring: se sbaglio qualcosa ho i test che mi fermeranno.

Torno a Gem. Aggiungo l'array di Frame.

Codice:
    private ArrayList<Frame> frames;
Modifico il metodo per aggiungere un frame di animazione:

Codice:
    public void addFrame(int x, int y, int delay)
    {
        frames.add(new Frame(x, y, delay));
        ++numberOfFrames;
    }
Lancio i test.... NullPointerException... touche', ha ragione lui. Ecco il codice per risolvere il problema:

Codice:
    private ArrayList<Frame> frames = new ArrayList<Frame>();
Barra verde ora.

Prossimo passo, proviamo a togliere numberOfFrames:

Codice:
    public int getNumberOfFrames()
    {
        return frames.size();
    }
Lancio i test. Falliti. Non e' giornata

Vediamo che dice JUnit:

junit.framework.AssertionFailedError: A new gem must have one frame
expected:<1> but was:<0>


Ovvio, una nuova gemma deve avere un frame di animazione. Io me ne ero dimenticato, ma il test no.

Vado nel costruttore e aggiungo questo:

Codice:
        addFrame(0, 0, 0);
Barra verde, posso eliminare numberOfFrames.

Codice:
    public void addFrame(int x, int y, int delay)
    {
        frames.add(new Frame(x, y, delay));
    }
Ed ora aggiungo il test che avevo momentaneamente cancellato. E poi cambiando una sola riga di codice lo faccio passare:

Codice:
    public int getFrameLength(int index)
    {
        return frames.get(index).getLength();
    }
Lancio i test e... falliti. Ma allora e' un vizio oggi.

junit.framework.AssertionFailedError: frame length is wrong expected:<1000> but was:<0>

Hmmm... il test si aspettava 1000 ma gli e' arrivato 0, pero' sono sicuro che se passo una durata alla classe Frame questa mi torna la durata giusta (quel test e' passato)... Fammi guardare il test:

Codice:
    public void testFrameLength()
    {
        gem.addFrame(10, 10, 1000);
        
        assertEquals("frame length is wrong", 1000, gem.getFrameLength(0));                
    }
Chiede che il frame 0 abbia lunghezza 1000, ma, ovvio, il frame che abbiamo aggiunto non e' quello a indice 0, ma e' quello a indice 1, perche' una gemma appena creata ha gia' un frame di animazione. Il test era sbagliato!

Ora lo cambio:

Codice:
    public void testFrameLength()
    {
        gem.addFrame(10, 10, 1000);
        
        assertEquals("frame length is wrong", 1000, gem.getFrameLength(1));                
    }
Verde! E passa anche il test di cionci.

Notate come ho fatto un sacco di errori mentre programmavo (sara' la fame ), ma non ho mai usato il debugger. C'era sempre un test pronto a dirmi esattamente che errore ho fatto e come correggerlo. E anche durante il refactoring non ho mai modificato piu' di una riga di codice senza lanciare i test.

Ci aggiorniamo a dopo pranzo.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2005, 13:18   #20
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Test: se la gemma si trova al frame 0 deve passare al frame 1 dopo 3500 ms

Codice:
    public void testUpdateWithTimer()
    {
        gem.addFrame(10, 10, 1000);
        
        MockTimer timer = new MockTimer(0);
        
        gem.update(timer);
        assertEquals("current frame must be 0 after 0 milliseconds", 0, gem.getCurrentFrame());        
        
        timer.advance(3500);
        gem.update(timer);
        assertEquals("current frame must be 1 after 3500 milliseconds", 1, gem.getCurrentFrame());        
    }

Ultima modifica di fek : 11-12-2005 alle 13:29.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Microsoft lancia le Crocs dedicate a Win...
25,99€ per il caricatore multiplo da 220...
Sembrava impossibile ma scende ancora: t...
Genie 3 di DeepMind, la nuova frontiera ...
179€ e vi arriva a casa un super Mini PC...
Intel, le rese del processo 18A gettano ...
Nuove scorte per il portatile Lenovo con...
AirPods Pro 2 tornano a 199€, ma anche S...
Grok Imagine: evoluzione dell'IA o nuova...
L'Italia saluta anche IVECO: finalizzata...
Summer Black Friday: spendi meno e godit...
Half-Life 3? No, Gabe Newell produrr&agr...
Apple al lavoro su un sensore che "...
TSMC vittima di spionaggio industriale s...
Cooler Master MasterFrame 500: un flusso...
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: 09:25.


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