PDA

View Full Version : [CICLO 1] Storia 2: Divisione in Task


VICIUS
23-09-2005, 20:04
Ecco la nuova storiella e i task da implementare.

Storia:
Una volta aperta la finestra del gioco deve essere possibile spostare il
diamante al suo interno usando le frecce direzionali della tastiera. Durante
gli spostamenti il diamante deve "pulsare" cioè ingrandirsi e rimpicciolirsi
di qualche millimetro. Quando il diamante tocca un bordo il movimento deve
fermarsi e il gioco riprodurre un suono.

Task:
2.1 Permettere al diamante di essere posizionato in un punto qualsiasi dello schermo. (Vifani: completato)
2.2 Spostare il diamante nelle quattro direzioni di X pixel. (Vifani: completato)
2.3 Intercettare la pressione delle frecce direzionali e spostare il diamante. (cdimauro: 2 giorni)
2.4 Rilevare la "collisione" con i bordi dello finestra e impedire lo spostamento. (DanieleC88: 2 giorni)
2.5 Riprodurre il suono quando il diamante collide con un bordo. (BlueDragon: da definire)
2.6 Permettere al diamante di pulsare durante lo spostamento. (VICIUS: 2 giorni)

Il ciclo comincia lunedi mattina alle 8. Siate puntuali e ricordatevi di timbrare il cartellino :D

ciao ;)

Vifani
23-09-2005, 20:41
Task 2.1 e 2.2 prenotati. Prevedo un paio di giorni per tutti e due :)

fek
23-09-2005, 20:42
Vi ricordo che questi sono i test "obbligatori" per concludere il task, ma siete caldamente invitati ad aggiungere tutti i test necessari.

Come sempre trovate i test in it.diamonds.tests.ignore e dovete spostarli in it.diamonds.tests.

2.1 Permettere al diamante di essere posizionato in un punto qualsiasi dello schermo. (Vifani: 2 giorni)

2.2 Spostare il diamante nelle quattro direzioni di X pixel. (Vifani: 2 giorni)


public class TestSprite extends TestCase
{
protected void setUp() throws Exception
{
super.setUp();
}

protected void tearDown() throws Exception
{
super.tearDown();
}

public void testGetTexture()
{
Texture texture = new Texture("diamond");
Sprite sprite = new Sprite(100, 200, texture);

assertAreSame(texture, sprite.getTexture());
}

public void testGetPosition()
{
Texture texture = new Texture("diamond");
Sprite sprite = new Sprite(100, 200, texture);

assertAreEqual(100, sprite.getX());
assertAreEqual(200, sprite.getY());
}

public void testMove()
{
Texture texture = new Texture("diamond");
Sprite sprite = new Sprite(100, 200, texture);

sprite.Move(10, 20);

assertAreEqual(110, sprite.getX());
assertAreEqual(220, sprite.getY());

sprite.Move(-10, -20);

assertAreEqual(90, sprite.getX());
assertAreEqual(180, sprite.getY());
}
}



2.3 Intercettare la pressione delle frecce direzionali e spostare il diamante. (cdimauro: 2 giorni)

Input da tastiera. Va testato manualmente.

2.4 Rilevare la "collisione" con i bordi dello finestra e impedire lo spostamento. (DanieleC88: 2 giorni)


public class testSpriteCollision extends TestCase
{
protected void setUp() throws Exception
{
super.setUp();
}

protected void tearDown() throws Exception
{
super.tearDown();
}

public void testLeftCollision()
{
// no texture
Sprite sprite = new Sprite(5, 0);
sprite.Move(-10, 0);
assertAreEqual(0, sprite.getX());
}

public void testRightCollision()
{
int width = 800;
Sprite sprite = new Sprite(width - 5, 0);
sprite.Move(10, 0);
assertAreEqual(width, sprite.getX());
}

public void testTopCollision()
{
// no texture
Sprite sprite = new Sprite(0, 5);
sprite.Move(0, -10);
assertAreEqual(0, sprite.getY());
}

public void testBottomCollision()
{
int height = 600;
Sprite sprite = new Sprite(height - 5, 0);
sprite.Move(0, 10);
assertAreEqual(height, sprite.getY());
}

}




2.5 Riprodurre il suono quando il diamante collide con un bordo.


public class TestSpriteCollisionSound extends TestCase
{

protected void setUp() throws Exception
{
super.setUp();
}

protected void tearDown() throws Exception
{
super.tearDown();
}

public void testCollisionSound()
{
Sprite sprite = new Sprite(0, 0);

Sound sound = new Sound("diamond");

// TODO: use a MockObject
sound.setTesting(true);

assertFalse("Sound must not be played before a collision",
sound.wasPlayed());

sprite.setCollisionSound(sound);
sprite.Move(-10, 0);

assertFalse("Sound must be played after a collision",
sound.wasPlayed());
}

}


2.6 Permettere al diamante di pulsare durante lo spostamento.

Vicius?

cdimauro
24-09-2005, 07:53
Task 2.3 pronotato. Prevedo due giorni per realizzarlo.

fek
24-09-2005, 09:36
Vorrei che i restanti task fossero prenotati da qualcuno che non ha partecipato alla Storia precedente.

VICIUS
24-09-2005, 11:46
Vorrei che i restanti task fossero prenotati da qualcuno che non ha partecipato alla Storia precedente.
Esatto. Dove sono finiti tutti quei volenterosi collaboratori che si erano offerti nell'altro thread :confused:

ciao ;)

71104
24-09-2005, 12:16
pazientate altri 3 giorni e ne avrete un altro ^^
comunque vorrei chiedere un chiarimento sul task 2.6: il diamante deve pulsare sempre o solo quando si muove? nel gioco finale il diamante una volta che è arrivato a terra (o sopra un altro diamante sottostante) deve smettere di pulsare?

VICIUS
24-09-2005, 12:21
pazientate altri 3 giorni e ne avrete un altro ^^
comunque vorrei chiedere un chiarimento sul task 2.6: il diamante deve pulsare sempre o solo quando si muove? nel gioco finale il diamante una volta che è arrivato a terra (o sopra un altro diamante sottostante) deve smettere di pulsare?
Deve pulsare solo quando si muove. Non centra niente con il gioco. L'ho messo solo per vedere come risolvete e se fate una cosa :D

ciao ;)

DanieleC88
24-09-2005, 12:32
Vorrei che i restanti task fossero prenotati da qualcuno che non ha partecipato alla Storia precedente.
È libero il 2.4 (collisioni coi bordi della finestra)?

VICIUS
24-09-2005, 12:34
È libero il 2.4 (collisioni coi bordi della finestra)?
Per ora si.

ciao ;)

cdimauro
26-09-2005, 10:06
2.3 Intercettare la pressione delle frecce direzionali e spostare il diamante. (cdimauro: 2 giorni)

Input da tastiera. Va testato manualmente.
Ma tu guarda che "fortuna": l'unico senza test da scrivere... :p

fek
26-09-2005, 10:08
Ma tu guarda che "fortuna": l'unico senza test da scrivere... :p

Ehm, no, l'unico senza acceptance test :)
I test li scrivi comunque...

fek
26-09-2005, 10:39
2.5 Riprodurre il suono quando il diamante collide con un bordo.

Manca questo task da assegnare. Volontario?

Oppure scelgo io il volontario e facciamo il task assieme in TDD in diretta in un topic :)

cdimauro
26-09-2005, 10:59
Ehm, no, l'unico senza acceptance test :)
I test li scrivi comunque...
Oops. :angel:

Mi vengono in mente soltanto 4 test per controllare se lo spostamento del diamante (a seguito della pressione di una delle frecce) è avvenuto regolarmente.

fek
26-09-2005, 11:20
Oops. :angel:

Mi vengono in mente soltanto 4 test per controllare se lo spostamento del diamante (a seguito della pressione di una delle frecce) è avvenuto regolarmente.

Per lo spostamento del diamante ci sono gia' i test. Pero' puoi fare una cosa, puoi "virtualizzare" l'input vero e proprio della tastiera e poi scrivere un MockKeyboard che fa finta di essere una tastiera e scrivere codice di test tipo:

keyboard.notifyLeftArrow();

dall'altra parte keyboard.isLeftArrowPressed() tornera' 'true'.

In questo modo possiamo scrivere dei test che controllano che il diamante si sia effettivamente spostato quando la tastiera notifica la pressione della freccia a sinistra.

Il finale di tutto questo lavoro sono i cosiddetti "Customer Test", test scritti in un linguaggio ad alto livello che simulano il gioco vero e proprio. Ma non so se arriveremo mai a questo.

VICIUS
26-09-2005, 11:39
Manca questo task da assegnare. Volontario?

Oppure scelgo io il volontario e facciamo il task assieme in TDD in diretta in un topic :)
Propongo volontario Daniele per questo task. Una volta che ha capito come rilevare la collisioni far partire un suono è banale :D

ciao ;)

fek
26-09-2005, 12:47
Propongo volontario Daniele per questo task. Una volta che ha capito come rilevare la collisioni far partire un suono è banale :D

ciao ;)

Preferirei che qualcuno che non ha ancora fatto un task si prendesse quest'ultimo, ma in mancanza di volontari, se Daniele vuole e' ok.

DanieleC88
26-09-2005, 12:49
Propongo volontario Daniele per questo task. Una volta che ha capito come rilevare la collisioni far partire un suono è banale :D

ciao ;)
Che fai, decidi per me, ora? :p
Ma scherzo, hai ragione tu. Ci vorranno 5 minuti. (spero :D)

fek
26-09-2005, 12:52
Che fai, decidi per me, ora? :p
Ma scherzo, hai ragione tu. Ci vorranno 5 minuti. (spero :D)

Non ci vogliono 5 minuti, non e' cosi' banale. Guarda i test che ho scritto per i tuoi due task, ci sono delle duplicazioni grosse come delle case e non sono banali da eliminare.

Oltre tutto il test del suono dopo una collisione apre le porte ad un paio di interrogativi non banali (gestione degli eventi associati ad uno sprite?) e dev'essere affrontato con molta cura.

DanieleC88
26-09-2005, 14:55
Non ci vogliono 5 minuti, non e' cosi' banale. Guarda i test che ho scritto per i tuoi due task, ci sono delle duplicazioni grosse come delle case e non sono banali da eliminare.

Oltre tutto il test del suono dopo una collisione apre le porte ad un paio di interrogativi non banali (gestione degli eventi associati ad uno sprite?) e dev'essere affrontato con molta cura.
Argh, non ci avevo pensato... be', che dire? Se c'è chi si offre volontario, ben venga, altrimenti ci provo io. In caso di difficoltà posso sempre consultarmi con voi. E soprattuto con VICIUS, ché lo vedo molto volontario oggi. :D

fek
26-09-2005, 15:01
Argh, non ci avevo pensato... be', che dire? Se c'è chi si offre volontario, ben venga, altrimenti ci provo io. In caso di difficoltà posso sempre consultarmi con voi. E soprattuto con VICIUS, ché lo vedo molto volontario oggi. :D

Adesso vediamo nei prossimi giorni di farlo assieme sul forum. Ho questa idea di un topic in cui fare pair programming assieme a qualcuno, facendo vedere un po' di TDD su un esempio pratico. Magari lo facciamo io e te dopo che hai completato il primo task.

DanieleC88
26-09-2005, 15:12
Per me è ok, l'idea mi piace. :)

BlueDragon
26-09-2005, 23:31
Preferirei che qualcuno che non ha ancora fatto un task si prendesse quest'ultimo, ma in mancanza di volontari, se Daniele vuole e' ok.
Io mi ero già proposto mezzo volontario per il task 2.5 nell'altro thread e non ho partecipato ai task 1.*... però per il thread di pair programming sarei disponibile solo da venerdì sera a domenica sera se vogliamo farlo stando online allo stesso momento... durante questa settimana la sera non penso di avere abbastanza tempo :)

VICIUS
27-09-2005, 00:14
Io mi ero già proposto mezzo volontario per il task 2.5 nell'altro thread e non ho partecipato ai task 1.*... però per il thread di pair programming sarei disponibile solo da venerdì sera a domenica sera se vogliamo farlo stando online allo stesso momento... durante questa settimana la sera non penso di avere abbastanza tempo :)
Ti ho assegnato il task cosi tu e fek potete divertirvi. Daniele sta imparando Java in questi giorni e un task per lui basta e avanza. :D

ciao ;)

fek
27-09-2005, 09:56
Io mi ero già proposto mezzo volontario per il task 2.5 nell'altro thread e non ho partecipato ai task 1.*... però per il thread di pair programming sarei disponibile solo da venerdì sera a domenica sera se vogliamo farlo stando online allo stesso momento... durante questa settimana la sera non penso di avere abbastanza tempo :)

Possiamo fare tranquillamente di pomeriggio. Quando ti viene piu' comodo.

valse
27-09-2005, 14:13
Daniele sta imparando Java in questi giorni e un task per lui basta e avanza. :D

...io mi sto cimentando nel "mondo" dei test di junit :mc:

Spero di capire qualcosa in modo da diventare operativo al più presto :boxe:

http://www.purupuru.net/gallery/sprites/yoda.gif che la forza sia con noi...

hola
valse

BlueDragon
27-09-2005, 22:40
Possiamo fare tranquillamente di pomeriggio. Quando ti viene piu' comodo.
Nel post precedente non avevo esplicitato: durante la settimana non solo ho poco tempo la sera, ma non ne ho per nulla durante il giorno :)
Quindi per me il periodo più comodo sarebbe dalla sera di venerdì (diciamo dalle 21:00 GMT in poi) fino alla sera di domenica (max 24:00 GMT).

fek
28-09-2005, 09:33
Task:
2.1 COMPLETATO +1
2.2 COMPLETATO +1
2.3 COMPLETATO +2
2.4
2.5 -2
2.6 COMPLETATO +1

DanieleC88
28-09-2005, 12:47
Hmm.... è forse un velato riferimento al mio ritardo? :p

fek
28-09-2005, 12:56
Hmm.... è forse un velato riferimento al mio ritardo? :p

Lavorate schiavi! :huh:

fek
28-09-2005, 15:35
Ricordo a tutti che il primo ciclo si conclude domani e tutti i task devono andare in commit con relativi test.

Mancano 2.4 e 2.5, che verranno riassegnati domattina.

cisc
28-09-2005, 20:01
ciao, adesso il pignolo lo faccio io :Prrr: ,
ma il diamante non doveva lampeggiare solo quando è in movimento?

vorrei chiedere inoltre chiarimenti su questo pezzo di codice che non avevo mai visto..


private static final Map<KeyCode, Integer> KEYCODEMAP =
new HashMap<KeyCode, Integer>();

static {
KEYCODEMAP.put(vk_Escape, org.lwjgl.input.Keyboard.KEY_ESCAPE);
KEYCODEMAP.put(vk_Up, org.lwjgl.input.Keyboard.KEY_UP);
KEYCODEMAP.put(vk_Down, org.lwjgl.input.Keyboard.KEY_DOWN);
KEYCODEMAP.put(vk_Left, org.lwjgl.input.Keyboard.KEY_LEFT);
KEYCODEMAP.put(vk_Right, org.lwjgl.input.Keyboard.KEY_RIGHT);
}

VICIUS
28-09-2005, 20:33
ciao, adesso il pignolo lo faccio io :Prrr: ,
ma il diamante non doveva lampeggiare solo quando è in movimento?
Manca il codice per le collisioni. Senza di quello non posso completare il task.

ciao ;)

fek
28-09-2005, 20:42
ciao, adesso il pignolo lo faccio io :Prrr: ,
ma il diamante non doveva lampeggiare solo quando è in movimento?


Sembra che abbiamo un volontario per il task 2.4 :D

cisc
28-09-2005, 22:19
ok, però prima di domani sera non riuscirò a committare niente perchè sono all'uni dalle 8:30 alle 17:30.., adesso già ho qualche idea per la testa, vorrei modificare la classe Sprite, solo che dovrei passargli la larghezza dello schermo per poter controllare a destra e l'altezza per il basso, la classe Config dovrebbe garantire la possibilità di controllare delle "variabili globali" per tutte le classi, vero?

BlueDragon
28-09-2005, 23:17
Mancano 2.4 e 2.5, che verranno riassegnati domattina.
Il fatto che il 2.5 venga riassegnato è una implicita risposta al post sopra in cui ho detto che io ci potrei iniziare a lavorare solo venerdì sera? Troppo tardi? Sono stato eliminato? :)

fek
28-09-2005, 23:23
Il fatto che il 2.5 venga riassegnato è una implicita risposta al post sopra in cui ho detto che io ci potrei iniziare a lavorare solo venerdì sera? Troppo tardi? Sono stato eliminato? :)

Non e' un problema di eliminazione, ma di tempi tecnici. Per concludere la storia abbiamo bisogno di fare tutti i commit entro venerdi' sera e capisco che, purtroppo, questa necessita' non viene in contro ai problemi di qualcuno tipo te e mi dispiace.

Ci siamo dati delle regole e secondo me e' giusto che vadano rispettate senza eccezioni.

BlueDragon
28-09-2005, 23:28
No problem, è solo che leggere che il task veniva riassegnato senza aver ricevuto nessuna risposta diretta al mio post mi aveva spiazzato :)

fek
28-09-2005, 23:35
No problem, è solo che leggere che il task veniva riassegnato senza aver ricevuto nessuna risposta diretta al mio post mi aveva spiazzato :)

Hai ragione. colpa mia e te ne chiedo scusa.

E' importante sottolineare che avere il task riassegnato non e' una cosa negativa, ma perfettamente normale, perche' tutti abbiamo impegni e puo' accadere di non poter concludere in tempo un proprio task.

Tutto il processo e' fatto in modo da assorbire questa eventualita'.

BlueDragon
29-09-2005, 00:13
Ho deciso comunque di provare ad implementare in fretta il minimo codice possibile per far funzionare i test ed è venuto fuori questo:

Sprite.java
2 nuovi metodi:
setCollisionSound
playCollisionSound
1 variabile privata
collisionSound

package it.diamonds.engine;

import it.diamonds.audio.Sound;

public class Sprite implements Drawable
{
private Texture texture;

private float x;
private float y;
private float width;
private float height;

private Sound collisionSound;

public Sprite(Texture texture)
{
this.texture = texture;
}

public Sprite(float posX, float posY, Texture texture)
{
this.texture = texture;

this.x = posX;
this.y = posY;
}

public void draw(Engine engine)
{
texture.enable();

engine.drawQuad(
x,
y,
width * 0.5f,
height * 0.5f);
}

public Texture getTexture()
{
return texture;
}

public float getX()
{
return x;
}

public float getY()
{
return y;
}

public void setSizeX(float sizeX)
{
this.width = sizeX;
}

public void setSizeY(float sizeY)
{
this.height = sizeY;
}

public void move(float dx, float dy)
{
x += dx;
y += dy;
}

public void setCollisionSound(Sound s)
{
collisionSound = s;
}

public void playCollisionSound(Sound s)
{
if (collisionSound != null)
{
collisionSound.play();
}
}

public void cleanup()
{
texture.cleanup();
}


}


TestSpriteCollisionSound.java
Ho aggiornato l'inizializzazione di Sprite, ho tolto il riferimento Sound.setTesting che non esiste più (ho usato createSoundTesting al suo posto) ed ho aggiunto un test per via delle eccezioni generabili da Sound.


package it.diamonds.tests;

import junit.framework.TestCase;

import it.diamonds.engine.Sprite;
import it.diamonds.audio.Sound;
import it.diamonds.audio.SoundException;
import it.diamonds.engine.Texture;

public class TestSpriteCollisionSound extends TestCase
{



protected void setUp() throws Exception
{
super.setUp();
}

protected void tearDown() throws Exception
{
super.tearDown();
}

public void testCollisionSound()
{
Sprite sprite = new Sprite(0, 0, new Texture());

try
{
Sound sound = Sound.createForTesting("diamond");

// TODO: use a MockObject


assertFalse("Sound must not be played before a collision",
sound.wasPlayed());

sprite.setCollisionSound(sound);
sprite.move(-10, 0);

assertFalse("Sound must be played after a collision",
sound.wasPlayed());
} catch (SoundException e)
{
assertTrue("Sound must be found to test",false);
}
}


Non sono sicuro che passi i test visto che al momento sul mio Eclipse *nessuno* di tutti i nostri test funziona....il che significa che ho qualche problema nell'impostazione dei test di Eclipse?

Immagino che questo primo approccio verrà poi cambiato, ma ero curioso di poter fare qualcosa e vederne il feedback, tanto per prendere un po' più di confidenza con il progetto :)

PS: Anzi, ripensandoci sono *sicuro* che il mio codice ora *non* passi i test, visto che non c'è il codice delle collisioni e la riuscita del test fa affidamento sul fatto che la collisione chiami playCollisionSound :)

cisc
29-09-2005, 08:31
ok, probabilmente non mi serve la classe config, cmq se qualcuno riesce ad eseguire il task prima di me oggi o se Daniele è in grado di completarlo io sto inattivo fino a questa sera, per BlueDragon, penso che se aggiungi un oggetto Sound in Sprite, dovresti liberare la memoria quando distruggi lo Sprite, giusto per una questione di pulizia, certo, ho dato un'occhiata veloce al tuo codice, sono dall'uni e non posso starci troppo tempo, io ho segnalato, poi vediamo che dicono fek e gli altri

fek
29-09-2005, 13:51
Ho deciso comunque di provare ad implementare in fretta il minimo codice possibile per far funzionare i test ed è venuto fuori questo:

Ottimo approccio.

PS: Anzi, ripensandoci sono *sicuro* che il mio codice ora *non* passi i test, visto che non c'è il codice delle collisioni e la riuscita del test fa affidamento sul fatto che la collisione chiami playCollisionSound :)

Ti manca la parte di collisioni, una volta che c'e' quel codice e i relativi test, non vedo perche' il test non debba passare.

Se vai nella sezione dei problemi, vediamo di capire perche' non riesci a lanciare i test da eclipse.
Comunque se usi Ant i test dovrebbero essere eseguiti.

DanieleC88
29-09-2005, 14:11
Lavorate schiavi! :huh:
Zi, badrone! :D

cdimauro
29-09-2005, 14:52
ciao, adesso il pignolo lo faccio io :Prrr: ,
ma il diamante non doveva lampeggiare solo quando è in movimento?
Con le ultime modifiche apportate, può completare il task... ;)
vorrei chiedere inoltre chiarimenti su questo pezzo di codice che non avevo mai visto..
Non l'avevo nemmeno io, finché non mi sono ritrovato con la necessità di scriverlo, studiandomi qualcosa sugli enum di Java. :cry:

E' meglio vedere il codice completo:

public enum KeyCode
{
vk_Escape, vk_Up, vk_Down, vk_Left, vk_Right;
private static final Map<KeyCode, Integer> KEYCODEMAP =
new HashMap<KeyCode, Integer>();

static {
KEYCODEMAP.put(vk_Escape, org.lwjgl.input.Keyboard.KEY_ESCAPE);
KEYCODEMAP.put(vk_Up, org.lwjgl.input.Keyboard.KEY_UP);
KEYCODEMAP.put(vk_Down, org.lwjgl.input.Keyboard.KEY_DOWN);
KEYCODEMAP.put(vk_Left, org.lwjgl.input.Keyboard.KEY_LEFT);
KEYCODEMAP.put(vk_Right, org.lwjgl.input.Keyboard.KEY_RIGHT);
}

public int value()
{
return KEYCODEMAP.get(this);
}
}

Ho definito un Enum perché mi serviva per avere dei simboli "nostri", quindi non legati all'attuale implementazione che fa uso di LWJGL, per indicare alcuni tasti.

Avevo (insomma: un "uccellino" mi ha suggerito di farlo... :asd: ), però, anche l'esigenza di mappare questi simboli nei corrispondenti usati da Keyboard di LWJGL.

Per fare questo ho fatto uso di HashMap (come si chiama? In C++ è un template, se non erro, mentre in Java? Può essere Generic? Boh), specificando che la chiave fosse di tipo KeyCode, ossia l'enum, mentre il risultato un valore intero (Integer).

Una volta alloca (nella dichiarazione), mi si presentava il problema di definire l'associazione KeyCode -> Integer. Ho fatto tutto nel blocco "static", che a quanto pare è la sezione di inizializzazione (eseguita, quindi, alla partenza) dell'enum KeyCode appena creato. Le varie put servono proprio a "popolare" l'HashMap con le coppie chiave (KeyCode) / valore (Integer).

Sarebbe già bastato questo, e usare poi direttamente KEYCODEMAP rendendolo pubblico, per fare la conversione. Ma non piaceva: lo trovavo antiestetico e poi se in futuro avessi voluto cambiare la struttura dati, il codice che la usava molto probabilmente sarebbe dovuto essere riscritto.

Continuando a studiarmi gli enum ho trovato che è possibile definire dei metodi che possono essere invocati sugli enum definiti. E' il caso di value(), che ho scritto proprio sfruttando questa caratteristica: una volta richiamato, facendo uso di KEYCODEMAP (ma questo lo sa solo lui, visto che è privato :D) esegue la conversione e la ritorna. Così basta un semplice e leggibile vk_Escape.value() per ottenere il codice utilizzato da Keyboard di LWJGL.

cionci
29-09-2005, 17:42
Anche io ho usato i generic da buon C++ista...

cisc
29-09-2005, 21:43
Con le ultime modifiche apportate, può completare il task... ;)

Non l'avevo nemmeno io, finché non mi sono ritrovato con la necessità di scriverlo, studiandomi qualcosa sugli enum di Java. :cry:

E' meglio vedere il codice completo:

public enum KeyCode
{
vk_Escape, vk_Up, vk_Down, vk_Left, vk_Right;
private static final Map<KeyCode, Integer> KEYCODEMAP =
new HashMap<KeyCode, Integer>();

static {
KEYCODEMAP.put(vk_Escape, org.lwjgl.input.Keyboard.KEY_ESCAPE);
KEYCODEMAP.put(vk_Up, org.lwjgl.input.Keyboard.KEY_UP);
KEYCODEMAP.put(vk_Down, org.lwjgl.input.Keyboard.KEY_DOWN);
KEYCODEMAP.put(vk_Left, org.lwjgl.input.Keyboard.KEY_LEFT);
KEYCODEMAP.put(vk_Right, org.lwjgl.input.Keyboard.KEY_RIGHT);
}

public int value()
{
return KEYCODEMAP.get(this);
}
}

Ho definito un Enum perché mi serviva per avere dei simboli "nostri", quindi non legati all'attuale implementazione che fa uso di LWJGL, per indicare alcuni tasti.

Avevo (insomma: un "uccellino" mi ha suggerito di farlo... :asd: ), però, anche l'esigenza di mappare questi simboli nei corrispondenti usati da Keyboard di LWJGL.

Per fare questo ho fatto uso di HashMap (come si chiama? In C++ è un template, se non erro, mentre in Java? Può essere Generic? Boh), specificando che la chiave fosse di tipo KeyCode, ossia l'enum, mentre il risultato un valore intero (Integer).

Una volta alloca (nella dichiarazione), mi si presentava il problema di definire l'associazione KeyCode -> Integer. Ho fatto tutto nel blocco "static", che a quanto pare è la sezione di inizializzazione (eseguita, quindi, alla partenza) dell'enum KeyCode appena creato. Le varie put servono proprio a "popolare" l'HashMap con le coppie chiave (KeyCode) / valore (Integer).

Sarebbe già bastato questo, e usare poi direttamente KEYCODEMAP rendendolo pubblico, per fare la conversione. Ma non piaceva: lo trovavo antiestetico e poi se in futuro avessi voluto cambiare la struttura dati, il codice che la usava molto probabilmente sarebbe dovuto essere riscritto.

Continuando a studiarmi gli enum ho trovato che è possibile definire dei metodi che possono essere invocati sugli enum definiti. E' il caso di value(), che ho scritto proprio sfruttando questa caratteristica: una volta richiamato, facendo uso di KEYCODEMAP (ma questo lo sa solo lui, visto che è privato :D) esegue la conversione e la ritorna. Così basta un semplice e leggibile vk_Escape.value() per ottenere il codice utilizzato da Keyboard di LWJGL.


grazie per il chiarimento, m'ero scordato dell'esistenza del blocco static, interessante questa enumerazione

BlueDragon
29-09-2005, 23:42
Se vai nella sezione dei problemi, vediamo di capire perche' non riesci a lanciare i test da eclipse.
Comunque se usi Ant i test dovrebbero essere eseguiti.
Appena arriva il weekend e torna su Subversion ricancello tutto il progetto, riseguo le istruzioni postate in giro e se non mi rifunziona descrivo tutto sul thread dei problemi :)

BlueDragon
29-09-2005, 23:51
[..]..per BlueDragon, penso che se aggiungi un oggetto Sound in Sprite, dovresti liberare la memoria quando distruggi lo Sprite, giusto per una questione di pulizia, certo, ho dato un'occhiata veloce al tuo codice, sono dall'uni e non posso starci troppo tempo, io ho segnalato, poi vediamo che dicono fek e gli altri
Sono d'accordo, come minimo una sound.freeMemory nel finalize() dell'oggetto, ma possibilmente qualcosa di meglio...
Non si tratta infatti semplicemente di "trattare bene le risorse", si tratta di curare un problema che probabilmente ci troveremo a fronteggiare. Infatti nel thread dei problemi avevo segnalato che oltre le 64 fonti (potrebbe variare a seconda dei pc) AL10 crasha...e noi attualmente assegnamo ad ogni suono la propria source personale.
Con due aree di gioco da 14x8 (224 pezzi max), 64 fonti non bastano se le usiamo così :)

Vifani
30-09-2005, 00:32
Sono d'accordo, come minimo una sound.freeMemory nel finalize() dell'oggetto, ma possibilmente qualcosa di meglio...
Non si tratta infatti semplicemente di "trattare bene le risorse", si tratta di curare un problema che probabilmente ci troveremo a fronteggiare. Infatti nel thread dei problemi avevo segnalato che oltre le 64 fonti (potrebbe variare a seconda dei pc) AL10 crasha...e noi attualmente assegnamo ad ogni suono la propria source personale.
Con due aree di gioco da 14x8 (224 pezzi max), 64 fonti non bastano se le usiamo così :)

Sicuramente c'è un altro modo per gestire le fonti disponibili. Che io sappia sono veramente pochissimi i videogames di ultima generazione che utilizzano 64 fonti!!!

Vi invito a guardare gli esempi che trovate sul sito di LWJGL: http://www.lwjgl.org/documentation_openal_01.php

Qui ci sono esempi di utilizzo di sorgenti audio multiple e condivisione dei buffer.

cionci
30-09-2005, 00:38
Forse non è meglio fare una specie di produttore/consumatore...da una parte la sound.play che mette in coda i suoni da riprodurre, dall'altra un consumatore che può far suonare 16 fonti contemporaneamente... Inoltre mettendo una deadline si evita che la fonte venga suonata con troppo ritardo... Se arriva ad essere suonata dopo la deadline non si suona...

BlueDragon
30-09-2005, 00:52
Sicuramente c'è un altro modo per gestire le fonti disponibili. Che io sappia sono veramente pochissimi i videogames di ultima generazione che utilizzano 64 fonti!!!

Vi invito a guardare gli esempi che trovate sul sito di LWJGL: http://www.lwjgl.org/documentation_openal_01.php

Qui ci sono esempi di utilizzo di sorgenti audio multiple e condivisione dei buffer.
Io li ho stampati e letti giorni fa quando mi sono studiato la classe Sound :)

Forse non è meglio fare una specie di produttore/consumatore...da una parte la sound.play che mette in coda i suoni da riprodurre, dall'altra un consumatore che può far suonare 16 fonti contemporaneamente... Inoltre mettendo una deadline si evita che la fonte venga suonata con troppo ritardo... Se arriva ad essere suonata dopo la deadline non si suona...
Sì, anche io avevo pensato praticamente alla stessa cosa.
L'unico dubbio che ho è...non staremo pensando troppo avanti? Non dovrebbero essere dei test scritti a condurci alle soluzioni?

cionci
30-09-2005, 01:25
Sì, anche io avevo pensato praticamente alla stessa cosa.
L'unico dubbio che ho è...non staremo pensando troppo avanti? Non dovrebbero essere dei test scritti a condurci alle soluzioni?
Sicuramente, ma allora mettiamo una cosa del genere:

Sound soundVect[65];

....
...

for(int i = 0; i < 65; ++i)
soundVect[i].play();


Diciamo che questo test non deve piantare il programma ?

fek
30-09-2005, 09:22
Sicuramente, ma allora mettiamo una cosa del genere:

Sound soundVect[65];

....
...

for(int i = 0; i < 65; ++i)
soundVect[i].play();


Diciamo che questo test non deve piantare il programma ?

Quante fonti abbiamo nel gioco in questo momento? Una.
La soluzione che abbiamo implementa la Storia? Si.
I test passano? Si'
Non ci serve altro.

Il Customer e' contento? Lo sapremo domenica e lui ci dira' come proseguire.
Implementiamo solo e strettamente cio' di cui abbiamo bisogno e non una riga di codice in piu'.

cionci
30-09-2005, 09:25
Sìsì sono d'accordo...diciamo che era un discorsoc he andava un po' più in là... :sofico:

fek
30-09-2005, 09:29
Sìsì sono d'accordo...diciamo che era un discorsoc he andava un po' più in là... :sofico:

E' importante attenersi a questo principio: se riusciremo a concludere il progetto o meno dipendera' quasi esclusivamente da quanto riusciamo a mantenere semplice e minimale la codebase.

Durante questa Storia ho sbagliato io ad accettare del codice che non era strettamente necessario, e infatti abbiamo ancora due task che non sono stati completati e stiamo mettend a rischio il completamento della Storia.

Vi assicuro che non commettero' questo errore di nuovo :)

cisc
30-09-2005, 12:03
io non sono riuscito ieri sera a mettermi in contatto con DanieleC88, cmq, il task 2.4 l'ho pronto con i test passati, magari necessita di un po' di refactoring, ma se mi date l'ok questa sera (server subversion permettendo) faccio il commint

DanieleC88
30-09-2005, 13:42
io non sono riuscito ieri sera a mettermi in contatto con DanieleC88, cmq, il task 2.4 l'ho pronto con i test passati, magari necessita di un po' di refactoring, ma se mi date l'ok questa sera (server subversion permettendo) faccio il commint
Dopo le 18:00 non sono mai online... :(
Comunque io ieri ho scritto il codice, come ho già detto anche a fek, però mi sono fatto prendere dalla cosa e l'ho fatto senza prima scrivere il test. Ora mi manca solo il test e poi ho finito.
In questi casi, con due codici pronti, che si fa? Forse è il caso di mandare il codice a qualcuno (che ne so, fek o VICIUS) e far scegliere a loro quello definitivo? Non so, aspetto risposte e nel frattempo apro Gaim così ci possiamo sentire "in diretta" per regolarci.

VICIUS
30-09-2005, 13:46
fate un bel diff e postatelo da qualche parte che cosi decisiamo il migliore :)

ciao ;)

fek
30-09-2005, 13:49
Meglio ancora se vi passate il codice fra di voi e scrivete una versione comune.

DanieleC88
30-09-2005, 13:55
Meglio ancora se vi passate il codice fra di voi e scrivete una versione comune.
Appena sarà online vedremo di fare qualcosa in comune.

DanieleC88
30-09-2005, 16:59
Io sono già fuori orario e devo disconnettermi. cisc non s'è visto per oggi, nel frattempo ho scritto il test e pare funzionare. Domani provo anche con ant se tutto fila liscio e poi aspetto che il server sia up, poi decideremo sul da farsi col commit. Byez.

cisc
30-09-2005, 17:36
è un ottima idea confrontare il codice in chat e farne uscire uno solo che sia il meglio di entrambi, il problema è che io il giorno fino alle 18 sono sempre (tranne sabato e domenica) all'università, possiamo trovarci domani, diciamo dalle 14:30 in poi?

fek
03-10-2005, 09:18
Alla fine di stasera tutti i commit devono essere effettuati e la Storia si chiude. Chi c'e' c'e', chi non c'e'... scatena l'ira funesta di Vicius :)

Piu' seriamente, se i due task che mancano oggi non sono conclusi, verranno spostati nel prossimo ciclo, facendo ritardare la prossima Storia e bloccando il lavoro di tutti, quindi e' importante consegnarli oggi.

Stasera produrremo il primo file di installazione di Diamonds da consegnare ai Customer per la verifica.

Jocchan
03-10-2005, 12:47
Alla fine di stasera tutti i commit devono essere effettuati e la Storia si chiude. Chi c'e' c'e', chi non c'e'... scatena l'ira funesta di Vicius :)

Piu' seriamente, se i due task che mancano oggi non sono conclusi, verranno spostati nel prossimo ciclo, facendo ritardare la prossima Storia e bloccando il lavoro di tutti, quindi e' importante consegnarli oggi.

Stasera produrremo il primo file di installazione di Diamonds da consegnare ai Customer per la verifica.

Ai customer?
Quanti ce ne sono? :mbe:

fek
03-10-2005, 12:52
Ai customer?
Quanti ce ne sono? :mbe:

Tu e Raoul.

DanieleC88
03-10-2005, 14:44
Per dovere di cronaca: sabato io e cisc siamo riusciti a trovarci online e mettere su una versione unificata del codice. Oggi ho fatto un commit (almeno credo :D, da quanto dice VICIUS il server è andato su e giù per un bel po'), quindi dovrebbe essere tutto ok.

fek
03-10-2005, 14:46
Per dovere di cronaca: sabato io e cisc siamo riusciti a trovarci online e mettere su una versione unificata del codice. Oggi ho fatto un commit (almeno credo :D, da quanto dice VICIUS il server è andato su e giù per un bel po'), quindi dovrebbe essere tutto ok.

Il commit e' andato a buon fine, build verde. Unico appunto: mettete il nome di chi ha fatto il commit e la descrizione dei cambiamenti.

Stasera preparo l'installazione e distribuisco lo zip con la prima Storia.

DanieleC88
03-10-2005, 15:22
Il commit e' andato a buon fine, build verde. Unico appunto: mettete il nome di chi ha fatto il commit e la descrizione dei cambiamenti.

Stasera preparo l'installazione e distribuisco lo zip con la prima Storia.
Ok, tanto devo correggere un paio di cose che mi ha fatto notare VICIUS, faccio il commit e metto anche la descrizione.

fek
03-10-2005, 16:07
Ok, tanto devo correggere un paio di cose che mi ha fatto notare VICIUS, faccio il commit e metto anche la descrizione.

Ci sono bug?

DanieleC88
03-10-2005, 16:19
Ci sono bug?
Non sono proprio bug, solo un paio di modifiche, ma a quanto pare VICIUS è stato più rapido di me. ;)

cionci
03-10-2005, 17:42
E' voluto il fatto che il diamante smetta di pulsare quando raggiunge un bordo ?

RaouL_BennetH
03-10-2005, 17:51
Cioè, non ho capito, è già pronto il file?

cisc
03-10-2005, 18:37
E' voluto il fatto che il diamante smetta di pulsare quando raggiunge un bordo ?

io avevo capito che deve smettere di pulsare anche quando è fermo per esempio al centro dello schermo...

fek
03-10-2005, 18:41
io avevo capito che deve smettere di pulsare anche quando è fermo per esempio al centro dello schermo...

Questo e' il task:

2.6 Permettere al diamante di pulsare durante lo spostamento.

Il che non dice nulla riguardo a che cosa deve fare il diamante quando e' fermo.
Inoltre, non avendo i test relativi, le specifiche rimangono vaghe ed ogni interpretazione e' valida.

Ecco un esempio di che cosa significa avere requisiti poco precisi e, soprattutto, non averli sotto forma di test. E' qualcosa che dovremo evitare in futuro.

fek
03-10-2005, 18:44
Cioè, non ho capito, è già pronto il file?

Stasera sara' pronto, o meglio, sara' pronto e distribuito domattina :)

fek
04-10-2005, 09:11
Completato il task 2.5 ance la Storia 2 e conclusa. E quindi anche il Ciclo 1.

Hurrah! Complimenti a tutti :)

Ho prodotto lo zip di installazione di Diamonds ieri notte e lo distribuisco questa mattina.
Se volete produrrlo per conto vostro, lanciate "ant dist" da linea di comando e guardate nella cartella dist/

Possiamo chiudere questo topic, consegnare il prodotto al Customer e aspettare le prossime storie. A breve vi faccio un riassunto dei tempi di completamento dei task per il Ciclo 1 cosi' da capire quanto lavoro possiamo preumibilmente svolgere nelle prossime due settimane.

fek
04-10-2005, 19:20
Riassunto dei tempi di completamento dei task.

2.1 COMPLETATO +1
2.2 COMPLETATO +1
2.3 COMPLETATO +2
2.4 COMPLETATO +5
2.5 COMPLETATO +5 -4
2.6 COMPLETATO +6 -5

A breve le statistiche.

RaouL_BennetH
05-10-2005, 11:27
Completato il task 2.5 ance la Storia 2 e conclusa. E quindi anche il Ciclo 1.

Hurrah! Complimenti a tutti :)

Ho prodotto lo zip di installazione di Diamonds ieri notte e lo distribuisco questa mattina.
Se volete produrrlo per conto vostro, lanciate "ant dist" da linea di comando e guardate nella cartella dist/

Possiamo chiudere questo topic, consegnare il prodotto al Customer e aspettare le prossime storie. A breve vi faccio un riassunto dei tempi di completamento dei task per il Ciclo 1 cosi' da capire quanto lavoro possiamo preumibilmente svolgere nelle prossime due settimane.

E' già su spartacus lo zip?

BlueDragon
05-10-2005, 22:10
Riassunto dei tempi di completamento dei task.

2.1 COMPLETATO +1
2.2 COMPLETATO +1
2.3 COMPLETATO +2
2.4 COMPLETATO +5
2.5 COMPLETATO +5 -4
2.6 COMPLETATO +6 -5

A breve le statistiche.

Fek, cosa vogliono dire i + ed i - ?
(Era spiegato da qualche parte e me lo sono perso?)

fek
05-10-2005, 22:18
Fek, cosa vogliono dire i + ed i - ?
(Era spiegato da qualche parte e me lo sono perso?)

Servono a me per tenere le statistiche.

+5 significa ad esempio che e' stato concluso 5 giorni dopo l'inizio della storia, -2 che e' stato iniziato due giorni dopo l'inizio della storia, quindi ha impiegato 3 giorni. Mi sono inventato la notazione sul momento :D

Jocchan
07-10-2005, 12:23
Il ciclo è chiuso, possiamo chiudere la discussione e liberare spazio fra i topic in evidenza?