Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Google Pixel 10 Pro XL è il top di gamma della serie Pixel, presentando un ampio display Super Actua da 6.8 pollici insieme alle novità della serie, fra cui la ricarica wireless magnetica Pixelsnap e le nuove funzionalità AI avanzate. Il comparto fotografico include un sistema a tripla fotocamera con zoom Pro Res fino a 100x, mentre il processore Tensor G5 con 16GB di RAM garantisce prestazioni percepite molto elevate su Android.
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: 11794
[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: 11794
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: 11794
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: 11794
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: 11794
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: 11794
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: 11794
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: 11794
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: 11794
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


Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli Recensione OnePlus Watch 3 43mm: lo smartwatch c...
Laowa 8-15mm f/2.8 FF Zoom Fisheye &egra...
PS5: il presidente di Capcom critica il ...
La mirrorless Nikon Z6III si aggiorna gr...
Philips punta ai creativi con un nuovo m...
Sharkoon estende la durata delle garanzi...
Acer presenta il suo Google TV Box 4K: t...
Amazon, il TAR del Lazio riduce la maxi-...
Guerra dei semiconduttori: ecco perch&ea...
Intel forse ci riprova: Arrow Lake Refre...
Il passaggio a Windows 11 è compl...
Microsoft Editor chiude: estensioni per ...
Nuova Volkswagen T-Roc, aperti gli ordin...
Tutte le novità di Codex: l'agent...
Word salverà i file in cloud in a...
WhatsApp Android Beta: nuova gestione de...
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: 18:56.


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