View Full Version : [CICLO 14] Storia 2
Storia 2: Durante la partita, il tema di Rock deve essere suonato in loop in sottofondo. Inoltre, occorre aggiungere degli effetti per la comparsa e la scomparsa delle png che mostrano la lunghezza della Crush appena terminata sui bordi dello schermo. Comparendo, devono pulsare una singola volta, ingrandendosi - ma non rimpicciolendosi - di un fattore modificabile in GameConfig, e scomparendo devono semplicemente scorrere fino a sparire dalla schermata.
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
Task 1: BlueDragon entro Venerdì notte
Durante la partita il tema di Rock deve essere suonato in loop.
Task 2: redcloud entro Venerdì notte
Quando compare a bordo schermo, la CrushBox, pulsa una volta sola ingrandendosi di un fattore settabile da GameConfig.
Task 3:
Quando scompare, Crushbox, scorre fino ad uscire dallo schermo. La velocità di scorrimento deve essere settabile da GameConfig.
BlueDragon
10-04-2006, 22:18
Task 1:
Durante la partita il tema di Rock deve essere suonato in loop.
Mi offro per il task 1, finisco entro Venerdì notte :)
(in realtà spero molto prima ;))
Una domanda...deve essere suonato a partire dall'mp3 presente nell'altro thread o abbiamo anche un wav?
EDIT: Ho cercato nel forum di LWJGL - OpenAL se c'era il supporto per gli mp3 ed ho trovato un post di Ottobre scorso in cui veniva detto che al momento sono supportati solo i wav in formato PCM :)
Quindi a meno di trovare una libreria aggiuntiva, direi che il task lo farò convertendo il file mp3 in PCM-wav :)
Mi offro per il task 1, finisco entro Venerdì notte :)
(in realtà spero molto prima ;))
D'ora in poi preferisco che i task non vengano prenotati per piu' di due giorni, di modo da poterli riassegnare velocemente ed evitare blocchi al lavoro.
Una domanda...deve essere suonato a partire dall'mp3 presente nell'altro thread o abbiamo anche un wav?
Se OpenAL non supporta gli mp3, abbiamo un grosso problema. In formato PCM occuperebbero troppo. Possiamo cercare una libreria alternativa per supportare mp3 attendendo che LWJGL aggiunga il supporto. Te ne occupi tu?
Chi si occupa del 2) e del 3)?
Mi offro per il task 1, finisco entro Venerdì notte :)
(in realtà spero molto prima ;))
Una domanda...deve essere suonato a partire dall'mp3 presente nell'altro thread o abbiamo anche un wav?
EDIT: Ho cercato nel forum di LWJGL - OpenAL se c'era il supporto per gli mp3 ed ho trovato un post di Ottobre scorso in cui veniva detto che al momento sono supportati solo i wav in formato PCM :)
Quindi a meno di trovare una libreria aggiuntiva, direi che il task lo farò convertendo il file mp3 in PCM-wav :)
Assegnato :)
Secondo me meglio tenerci al formato MP3... Tra poco ci sarà la release e far scaricare 100MB per un gioco 2D non penso sia la cosa migliore! Non esiste proprio il supporto MP3 con tali librerie? Neanche un add-on?
Ricordo di averne parlato con qualcuno del team (Cesare?) tempo fa, e il supporto dovrebbe esserci, ne sono praticamente certo.
http://java.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=java&zu=http%3A%2F%2Fwww.javazoom.net%2Fmp3spi%2Fmp3spi.html
Questo può esserci utile?
BlueDragon
12-04-2006, 00:52
Se OpenAL non supporta gli mp3, abbiamo un grosso problema. In formato PCM occuperebbero troppo. Possiamo cercare una libreria alternativa per supportare mp3 attendendo che LWJGL aggiunga il supporto. Te ne occupi tu?
Ok, domani inizio a cercare qualcosa. Se nel frattempo qualcuno già conosce una soluzione facile e rapida non si faccia scrupoli a postarla :D
A pensarci bene io stesso dovrei avere sul pc un vecchio progetto in cui riproducevo un mp3 in java..
cdimauro
12-04-2006, 07:55
Ricordo di averne parlato con qualcuno del team (Cesare?) tempo fa, e il supporto dovrebbe esserci, ne sono praticamente certo.
Abbiamo parlato del supporto che ha SDL. :p
http://java.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=java&zu=http%3A%2F%2Fwww.javazoom.net%2Fmp3spi%2Fmp3spi.html
Questo può esserci utile?
Mi sembra interessante: potrebbe essere una buona soluzione.
Per la FP ci serve una soluzione velocissima anche se non elegante. Dopo la FP pensiamo ad una soluzione piu' elegante.
Si', vi sto autorizzando a scrivere porcate per raggiungere la FP, tanto poi le pagate tutte dopo ;)
(Ma non abusate eh)
cdimauro
12-04-2006, 10:10
L'unica "porcata" :oink: al momento è di aggiungere la possibilità di scegliere se usare LWJGL o SDL, perché con quest'ultimo ho accesso (in parte) all'accelerazione hardware.
Questo vuol dire che in questi 9 giorni mi dovrò fare il mazzo per far coesistere i 2 codici. :cry:
L'unica "porcata" :oink: al momento è di aggiungere la possibilità di scegliere se usare LWJGL o SDL, perché con quest'ultimo ho accesso (in parte) all'accelerazione hardware.
Questo vuol dire che in questi 9 giorni mi dovrò fare il mazzo per far coesistere i 2 codici. :cry:
No. Datti da fare sulla CheckList per favore. E' la nostra unica priorita'. Detto fra noi, a di SDL al momento non ci interessa nulla, dobbiamo consegnare una FP. Raffaele ha risolto il tuo problema, ora ti voglio sulla CheckList :)
La cosa migliore secondo me e' prendere una qualunque librerira terze parti che gestisca mp3 da java e usare quella.
cdimauro
12-04-2006, 11:32
Vedo quello che posso fare (comunque ti assicuro che l'esecuzione di Diamonds è estremamente lenta con quella "pezza").
redcloud
12-04-2006, 11:39
Mi piacerebbe occuparmi del task 2 ma ho un paio di domande da fare:
1) Deve essere un'animazione o soltanto un semplice ingrandimento alla dimensione xy?
1.1) Se è un'animazione, quanto deve essere veloce? Di quanti frame deve essere composta?
2) Quanto tempo deve rimanere alla massima diensione?
Consegna entro Venerdi notte.
Mi piacerebbe occuparmi del task 2 ma ho un paio di domande da fare:
1) Deve essere un'animazione o soltanto un semplice ingrandimento alla dimensione xy?
1.1) Se è un'animazione, quanto deve essere veloce? Di quanti frame deve essere composta?
2) Quanto tempo deve rimanere alla massima diensione?
Consegna entro Venerdi notte.
Non è un'animazione, basta sfruttare il codice già presente per il pulsing della gemma pivot. Come tempo rendiamolo modificabile da config (famo 0.5 secondi di default).
Vedo quello che posso fare (comunque ti assicuro che l'esecuzione di Diamonds è estremamente lenta con quella "pezza").
Lo capisco, ma adesso abbiamo questo obiettivo e su questo dobbiamo concentrarci. Anche se lenta, almeno puoi guardare se le cose funzionano una volta che i test sono passati.
Redcloud, assegnato, ricorda la testlist prima di iniziare! Buon lavoro :)
redcloud
12-04-2006, 14:16
Task 2: Test List
- Verifica che al momento della visualizzazione, la CrushBox non stia gia pulsando.
- Verifica di 1 sola pulsazione.
- Verifica di 1 sola pulsazione per X tempo.
Task 2: Test List
- Verifica del funzionamento del metodo "di pulsazione" pre esistente utilizzato su CrushBox.
Non capisco... Non devi testare una feature già testata :)
Chi si prenota per il terzo task? E' l'ultimo rimasto libero finora.
Mi fate un aggiornamento sullo stato dei primi due task? Abbiamo tempo fino a domani sera.
E' importantissimo che tutti i task siano chiusi entro domani sera, cosi' abbiamo 7 giorni pieni di testing e bug fixing prima della First Playable. Ogni giorno che perdiamo qui significa meno testing e piu' probabilita' di rilasciare un prodotto al pubblico in cattivo stato. Diamoci dentro che e' la fase calda (e piu' divertente) :)
cdimauro
13-04-2006, 10:56
Chi si prenota per il terzo task? E' l'ultimo rimasto libero finora.
Lo prendo io. Entro domani sarà pronto.
redcloud
13-04-2006, 11:45
- Verifica che al momento della visualizzazione, la CrushBox non stia gia pulsando.
modificato in
- Verifica che al momento della visualizzazione, la CrushBox stia pulsando.
public void testCrushBoxIsPulsingWhenShown()
{
insertAndUpdate(createGem(RUBY), 13, 2);
insertAndUpdate(createGem(EMERALD), 12, 2);
insertAndUpdate(createGem(RUBY), 11, 2);
insertAndUpdate(createChest(RUBY), 10, 2);
insertAndUpdate(createChest(EMERALD), 9, 2);
insertAndUpdate(createChest(RUBY), 8, 2);
stopGemsPair();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
playField.getCrushBox().show();
assertTrue("CrushBox is not pulsing", playField.getCrushBox().isPulsing());
}
Ho preso un pezzo di test gia esistente e verificato nella classe TestCrushBox per far verificare questa condizione
private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());
crushBox.show();
lastCrushBoxUpdate = timer.getTime();
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
crushBox.hide();
}
}
nella classe PlayField.
Dopodichè ho risolto con
private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());
crushBox.setSizeMultiplier(4f);
crushBox.setSpeedDivisor(10f);
crushBox.show();
crushBox.startPulsing();
lastCrushBoxUpdate = timer.getTime();
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
crushBox.hide();
}
}
Il prossimo passo è di prendere i valori Size e Speed dal file config. Come vi accedo da Playfield?
Il prossimo passo è di prendere i valori Size e Speed dal file config. Come vi accedo da Playfield?
Dal costruttore ;)
Il prossimo passo è di prendere i valori Size e Speed dal file config. Come vi accedo da Playfield?
Bravissimo, gran bel lavoro.
Config e' ben propagato, puoi tenere un riferimento all'interno della classe in cui lavori e poi usarlo nel di update. Ancora meglio, visto che sono solo due valori, se li passi al costruttore al posto di Config, per il principio di minimazzare la quantita' di informazioni che viene propagata, al minimo indispensabile per svolgere il task.
redcloud
13-04-2006, 13:10
- Verifica dei valori SizeMultiplier e SpeedDivisor dal file Config
public void testCrushBoxIsPulsingWithConfigValues()
{
crushesForPulsing();
playField.getCrushBox().show();
assertTrue("CrushBox is not pulsing", playField.getCrushBox().isPulsing());
assertEquals("crushBoxSizeMultiplier doesn't match config file",
playField.getCrushBox().getSizeMultiplier(), sizeMultiplier);
assertEquals("crushBoxSpeedDivisor doesn't match config file",
playField.getCrushBox().getSpeedDivisor(), speedDivisor);
}
private void crushesForPulsing()
{
insertAndUpdate(createGem(RUBY), 13, 2);
insertAndUpdate(createGem(EMERALD), 12, 2);
insertAndUpdate(createGem(RUBY), 11, 2);
insertAndUpdate(createChest(RUBY), 10, 2);
insertAndUpdate(createChest(EMERALD), 9, 2);
insertAndUpdate(createChest(RUBY), 8, 2);
stopGemsPair();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
}
Ho dovuto creare crushesForPulsing (come suggeritmo da Mr. SBonfo :stordita: ) per soddisfare sempre la solita condizione
if(gridController.getGrid().getChainCounter() >= 2) di PlayField.updateCrushBox
visto che il metodo mi è servito per 2 test (e forse anche per i futuri).
Ho risolto con
private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());
crushBox.setSizeMultiplier(crushBoxSizeMultiplier);
crushBox.setSpeedDivisor(crushBoxSpeedDivisor);
crushBox.show();
crushBox.startPulsing();
lastCrushBoxUpdate = timer.getTime();
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
crushBox.hide();
}
}
dove crushBoxSizeMultiplier e crushBoxSpeedDivisor sono variabili della classe PlayField, inizializzate nel cotruttore tramite
crushBoxSizeMultiplier = config.getInteger("CrushBoxSizeMultiplier");
crushBoxSpeedDivisor = config.getInteger("CrushBoxSpeedDivisor");
dove "CrushBoxSizeMultiplier" e "CrushBoxSpeedDivisor" sono le chiavi inserite opportunamente nel file Config.
Perfetto. Hai provato in game?
cdimauro
13-04-2006, 14:57
Task 3:
Quando scompare, Crushbox, scorre fino ad uscire dallo schermo. La velocità di scorrimento deve essere settabile da GameConfig.
Test list:
- verificare che la CrushBox del playfield di sinistra si sia spostata a sinistra dopo l'intervallo di tempo prefissato nel file di configurazione;
- verificare che la CrushBox del playfield di destra si sia spostata a destra dopo l'intervallo di tempo prefissato nel file di configurazione;
- verificare che, dopo essersi spostata completamente fuori dallo schermo, una CrushBox non si muova più.
EDIT: i primi 2 test chiaramente si devono considerare nel momento in cui la CrushBox deve scomparire. ;)
BlueDragon
14-04-2006, 00:18
Mi fate un aggiornamento sullo stato dei primi due task? Abbiamo tempo fino a domani sera.
Buone notizie: sto usando BasicPlayer API V2.3 di JavaZoom (http://www.javazoom.net/jlgui/api.html), che è praticamente una semplificazione per utilizzare rapidamente le JavaSound API (cui MP3SPI aggiunge il supporto mp3).
L'integrazione con il progetto è semplice, basta aggiungere i Jar di BasicPlayer e MP3SPI come abbiamo fatto per LWJGL.
Il risultato è decisamente buono...anche con l'mp3 di sottofondo Diamonds mi occupa attorno al 10% della CPU su un Athlon 2600 :)
Per mandare l'mp3 in loop è bastato aggiungere al BasicPlayer un listener che quando l'mp3 va in stato "STOPPED" esegue nuovamente play ;)
Per adesso ho scritto il codice in modalità "spike" :)
Domani scrivo una bella classettina per wrappare il tutto con un po' di test e committo :)
cdimauro
14-04-2006, 09:06
Ho finito il task3 (spero :p).
Il codice aggiunto per i test è il seguente:
private void crushBoxMoveInit()
{
crushBox = playField.getCrushBox();
insertAndUpdate(createGem(EMERALD), 13, 2);
insertAndUpdate(createGem(RUBY), 12, 2);
insertAndUpdate(createChest(RUBY), 11, 2);
insertAndUpdate(createChest(EMERALD), 10, 2);
stopGemsPair();
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
assertTrue(crushBox.isHidden());
makeAllGemsFallByField();
playFieldUpdateOfDelayBetweenCrushes();
assertFalse(crushBox.isHidden());
int countMoves = screenWidth;
while (!crushBox.isHidden() && (countMoves >= 0))
{
playFieldUpdateOfDelayBetweenCrushes();
countMoves--;
}
}
public void testFirstPlayFieldCrushBoxMovingLeft()
{
crushBoxMoveInit();
float lastX = crushBox.getX();
playFieldUpdateOfDelayBetweenCrushes();
assertTrue("crushBox hasn't moved left", crushBox.getX() < lastX);
}
public void testSecondPlayFieldCrushBoxMovingRight()
{
playField = new PlayField(config, inputReactor,
new MockRandomGenerator(MOCK_SEQUENCE), timer,
PlayFieldDescriptor.PLAYER_TWO);
controller = playField.getGridController();
grid = playField.getGridController().getGrid();
crushBoxMoveInit();
float lastX = crushBox.getX();
playFieldUpdateOfDelayBetweenCrushes();
assertTrue("crushBox hasn't moved right", crushBox.getX() > lastX);
}
public void testOffScreenCrushBoxIsNotMoving()
{
testFirstPlayFieldCrushBoxMovingLeft();
int countMoves = screenWidth;
while (!crushBox.isOffScreen() && (countMoves >= 0))
{
playFieldUpdateOfDelayBetweenCrushes();
countMoves--;
}
float lastX = crushBox.getX();
playFieldUpdateOfDelayBetweenCrushes();
assertEquals("Off screen crushBox has moved!", lastX, crushBox.getX());
}
crushBoxMoveInit() l'ho dovuto aggiungere per non far arrabbiare checkstyle :D, ma così i test hanno guadagnato in leggibilità (bravo checkstyle: è la prima volta che non mi fa girare le scatole a causa di una sua segnalazione :p).
A causa del task3, ho dovuto modificare un test di TestCrushBox:
//assertEquals("Wrong crushBox horizontal position", -67F,
// playField.getCrushBox().getX());
assertEquals("Wrong crushBox horizontal position", -67F -crashBoxSpeed,
playField.getCrushBox().getX());
Le due righe commentate sono quelle precedenti.
Questo perché, eseguendo un update di PlayField col nuovo codice, CrushBox comincia (giustamente) a muoversi per uscire fuori dallo schermo.
Il codice modificato per CrushBox è il seguente:
private Point origin;
private int speed;
private int screenWidth;
public CrushBox(Point origin, int speed, int screenWidth)
{
super(origin.getX(), origin.getY(), new Rectangle(0, 0, 256, 64),
getTexture(2));
this.origin = origin;
this.speed = speed;
this.screenWidth = screenWidth;
if (origin.getX() < 320)
{
this.speed = -this.speed;
}
hide();
}
public boolean isOffScreen()
{
return (getX() + getFrameWidth() < 0) || (getX() >= screenWidth);
}
public void update()
{
moveTo(getX() + speed, getY());
}
public void show()
{
moveTo(origin.getX(), origin.getY());
super.show();
}
L'if presente nel costruttore chiaramente va cambiato, ma per adesso ho voluto evitare di modificare il costruttore di PlayField e PlayFieldDescriptor: al prossimo refactoring salta.
Il codice di PlayField modificato è il seguente:
private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());
crushBox.show();
lastCrushBoxUpdate = timer.getTime();
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
crushBox.hide();
}
else
if (!crushBox.isOffScreen())
{
crushBox.update();
}
}
La build è verde, ma a causa dei problemi che ho sulla mia macchina, non posso controllare se visivamente il comportamento di CrushBox è quello che ci aspetta: c'è qualcuno che potrebbe dargli un'occhiata, per favore?
Grazie anticipatamente! :)
La crushBox appare troppo all'estarno. Ho fatto uno screenshoot.
Per quanto la sparizione c'è ed è bella!!!! :D
Però è molto veloce...forse io l'avrei fatta più lenta. :sofico:
Forse sarebbe bene che speed fosse nel config??
La crushBox appare troppo all'estarno. Ho fatto uno screenshoot.
Per quanto la sparizione c'è ed è bella!!!! :D
Però è molto veloce...forse io l'avrei fatta più lenta. :sofico:
Forse sarebbe bene che speed fosse nel config??
La posizione va sistemata. Puoi farlo tu, per favore?
La velocità dovrebbe essere settabile da config, era nelle specifiche del task.
Ora scarico la build e testo.
cdimauro
14-04-2006, 12:06
La crushBox appare troppo all'estarno. Ho fatto uno screenshoot.
Le coordinate di partenza non le ho toccate, ma le trovi in PlayFieldDescriptor, come suo ultimo parametro: puoi provare a modificarle e vedere dove starebbe meglio.
Per quanto la sparizione c'è ed è bella!!!! :D
Maledetto!!! Io non posso vedere niente! :cry:
Però è molto veloce...forse io l'avrei fatta più lenta. :sofico:
Forse sarebbe bene che speed fosse nel config??
Ho aggiunto un parametro a data/GameConfig, si chiama crashBoxSpeed ed è il numero di pixel di cui si deve spostare (orizzontalmente) la CrushBox ad ogni update (che si verifica ogni UpdateRate).
Maledetto!!! Io non posso vedere niente! :cry:
:Prrr: :Prrr:
redcloud
14-04-2006, 13:44
Ragazzi non riesco a completare il mio task. Non riesco a pensare ai test da fare. Avevo risolto senza test ma mi sembrava una soluzione sporca. Devo ancora andare a regime, scusate se vi ho fatto perdere tempo :cry:
Ragazzi non riesco a completare il mio task. Non riesco a pensare ai test da fare. Avevo risolto senza test ma mi sembrava una soluzione sporca. Devo ancora andare a regime, scusate se vi ho fatto perdere tempo :cry:
Non devi scusarti :)
Ufo, 71104, cionci gli date una mano voi per favore?
redcloud
14-04-2006, 16:48
Per la cronaca, posto il codice che funziona ma non è testato:
private void updateCrushBox()
{
if(gridController.getGrid().getChainCounter() >= 2)
{
crushBox.setCrushCounter(gridController.getGrid().getChainCounter());
crushBox.setSizeMultiplier(crushBoxSizeMultiplier);
crushBox.setSpeedDivisor(crushBoxSpeedDivisor);
crushBox.show();
if(!crushBox.isHidden() && !stopPulsingState)
{
crushBox.startPulsing();
}
if(crushBox.isPulsing())
{
if(crushBox.getDelta() >= 1.0f && !stopPulsingState)
{
stopPulsingState = true;
}
else if(crushBox.getDelta() < 1.0f && stopPulsingState)
{
crushBox.stopPulsing();
}
}
lastCrushBoxUpdate = timer.getTime();
}
if(!crushBox.isHidden()
&& timer.getTime() >= lastCrushBoxUpdate + crushBoxUpdateRate)
{
stopPulsingState = false;
crushBox.hide();
}
else
if (!crushBox.isOffScreen())
{
crushBox.update();
}
Ho dovuto aggiungere:
Classe PlayField
private float crushBoxSizeMultiplier;
private float crushBoxSpeedDivisor;
private boolean stopPulsingState;
nel costruttore
crushBoxSizeMultiplier = (float) config.getInteger("CrushBoxSizeMultiplier");
crushBoxSpeedDivisor = (float) config.getInteger("CrushBoxSpeedDivisor");
stopPulsingState = false;
Classe Sprite
private float delta;
public float getDelta()
{
return delta;
}
nel costruttore
delta = 0.0f;
nel metodo "public void draw(EngineInterface engine)" ho sostituito
float delta = 0.0f;
con
delta = 0.0f;
nel file config ho aggiunto
CrushBoxSizeMultiplier = 4
CrushBoxSpeedDivisor = 10
redcloud
14-04-2006, 18:17
Ho trovato il modo di avere il numero delle pulsazioni per ogni sprite. Ho modificato il metodo draw di Sprite:
public void draw(EngineInterface engine)
{
if(hidden)
{
numberOfPulsations = 0;
return;
}
float delta = 0.0f;
if(pulsing)
{
pulseSize += 1 / speedDivisor;
delta = (float)Math.abs(Math.sin(pulseSize) * sizeMultiplier);
float nextPulseSize = pulseSize + 1 / speedDivisor;
if(Math.sin(nextPulseSize) * sizeMultiplier <= 0 &&
Math.sin(pulseSize) * sizeMultiplier >= 0)
{
numberOfPulsations++;
}
else if(Math.sin(nextPulseSize) * sizeMultiplier >= 0 &&
Math.sin(pulseSize) * sizeMultiplier <= 0)
{
numberOfPulsations++;
}
}
else
{
numberOfPulsations = 0;
}
Point pos = new Point(position.getX() - (delta / 2), position.getY()
- (delta / 2));
engine.drawTexture(pos, getFrameWidth() + delta, getFrameHeight() + delta,
texture, textureArea);
}
public int getNumberOfPulsations()
{
return numberOfPulsations;
}
Sempre senza test :cry: ma sbaglio o il test per draw di Sprite non c'è?
Scrivimi pure su MSN se ti serve aiuto :)
La crushBox appare troppo all'estarno. Ho fatto uno screenshoot.
Per quanto la sparizione c'è ed è bella!!!! :D
A me piace tantissimo cosi' veloce. E' divina :D
Quindi, riassumendo, il task 3 è completo, e domani BD finisce l'1.
Bisogna terminare anche il 2, quindi per favore cerchiamo tutti di aiutare Red il più possibile.
BlueDragon
14-04-2006, 21:31
Quando ho fatto le prove ieri, avevo l'audio OpenAL disabilitato...oggi invece con OpenAL attivo mi sono accorto che ci sono dei conflitti con la gestione della musica mp3....dovrò convertire Audio e Sound a JavaSound.
BlueDragon
14-04-2006, 23:54
Per stanotte non ce la faccio, anche perché vorrei fare una cosa fatta per benino se possibile. Committo domani :)
Per favore, date una mano a RedCloud con i test. Dobbiamo chiudere la storia e dedicarci ai bug.
BlueDragon
15-04-2006, 22:45
Non ho più committato perché ho notato che quando si inviano molte stones contemporaneamente all'avversario, oppure quando molte stones si trasformano in gemme la nuova gestione dei suoni causa una certa lag...sopportabile ma comunque lag.
Purtroppo non ho trovato per adesso un modo per istanziare un solo suono "diamonds" per tutte le gemme (penso sia la creazione dei nuovi suoni che lagga) ma poi farlo suonarlo più volte in contemporanea.
BlueDragon
15-04-2006, 23:20
Domani probabilmente non potrò dedicarmi al task se non a sera inoltrata.
Se qualcun'altro vuole cimentarsi...ben venga! :)
Cionci, non si era parlato di una SoundBank, per risolvere il problema dello stesso suono istanziato troppe volte?
BlueDragon
16-04-2006, 09:11
Cionci, non si era parlato di una SoundBank, per risolvere il problema dello stesso suono istanziato troppe volte?
Mi spiego rapidamente prima di uscire di casa....
..la soundbank ci sarebbe già: Fek ha modificato la classe Audio affinché non vengano fatte copie multiple dello stesso suono.
Il problema è che con OpenAL potevamo dire allo stesso suono anche 50 volte play() a raffica senza problemi. Invece usando il BasicPlayer di JavaZoom no. Il primo play parte, quelli successivi vengono ignorati finché non finisce il primo play, quindi non è possibile fare due "ding" successivi rapidi con lo stesso player. Ho provato a fare stop prima di ogni play ed all'inizio funzionava...sembrava essere lento solo perché BasicPlayer di base logga molte informazioni. Ho disabilitato il commons-logging e sono saltati fuori errori di thread...
Bisogna vedere se usando Java Sound ad un livello più basso del BasicPlayer di JavaZoom si riesce ad effettuare la preparazione del suono una volta sola "a monte" per poi usare solo il minimo necessario per farlo suonare quando viene richiesto, anche considerando la necessità di farne suonare due in parallelo.
Il ciclo chiude oggi, e tutto quello che non riusciamo a inserire non ci sarà nella first playable. Per l'mp3 in sottofondo, il contributo in termini di impatto sarebbe notevole.
EDIT: Ho parlato con BD, e gli ho chiesto di provare una nuova libreria. Se non fosse possibile utilizzarla efficacemente, gli ho dato il permesso - sotto mia responsabilità - di committare il task ugualmente: il bug che fa rallentare tutto lo fixiamo domani o, laddove non fosse possibile, si reverta il task, e lasciamo la first playable senza musica.
Ora fek mi spezzerà le ditine (avrei preferito consultarlo, è stata una decisione presa all'ultimo minuto), ma l'audio in sottofondo è una feature che, sebbene non sia essenziale, contribuisce molto all'impatto che questa demo avrà sul pubblico. Quindi, dobbiamo assolutamente provarci.
Il ciclo chiude oggi, e tutto quello che non riusciamo a inserire non ci sarà nella first playable. Per l'mp3 in sottofondo, il contributo in termini di impatto sarebbe notevole.
EDIT: Ho parlato con BD, e gli ho chiesto di provare una nuova libreria. Se non fosse possibile utilizzarla efficacemente, gli ho dato il permesso - sotto mia responsabilità - di committare il task ugualmente: il bug che fa rallentare tutto lo fixiamo domani o, laddove non fosse possibile, si reverta il task, e lasciamo la first playable senza musica.
Ora fek mi spezzerà le ditine (avrei preferito consultarlo, è stata una decisione presa all'ultimo minuto), ma l'audio in sottofondo è una feature che, sebbene non sia essenziale, contribuisce molto all'impatto che questa demo avrà sul pubblico. Quindi, dobbiamo assolutamente provarci.
Ok, diamo una deroga a BD per provare la nuova libreria. Tutti gli altri solo ed esclusivamente sui bug.
BlueDragon
16-04-2006, 22:52
Ok, diamo una deroga a BD per provare la nuova libreria. Tutti gli altri solo ed esclusivamente sui bug.
Purtroppo anche il plugin mp3 di JMF è incompatibile con OpenAL...(se aggiungi il jar al progetto non funziona più OpenAL).
Tra l'altro ho appena scoperto che Ant non mi trova le classi di JavaZoom che sto provando...quindi non posso nemmeno committare al momento.
Gli ho messo il .jar nel classpath così come ho fatto per lanciare il gioco ma sembra non bastare!
[junit] Testcase: testMiddleNotCollisionSound(it.diamonds.tests.TestCellsideCollision): Caused an ERROR
[junit] javazoom/jlgui/basicplayer/BasicPlayerException
[junit] java.lang.NoClassDefFoundError: javazoom/jlgui/basicplayer/BasicPlayerException
Ho decisamente bisogno di una mano per questo task... !
Purtroppo anche il plugin mp3 di JMF è incompatibile con OpenAL...(se aggiungi il jar al progetto non funziona più OpenAL).
Tra l'altro ho appena scoperto che Ant non mi trova le classi di JavaZoom che sto provando...quindi non posso nemmeno committare al momento.
Gli ho messo il .jar nel classpath così come ho fatto per lanciare il gioco ma sembra non bastare!
[junit] Testcase: testMiddleNotCollisionSound(it.diamonds.tests.TestCellsideCollision): Caused an ERROR
[junit] javazoom/jlgui/basicplayer/BasicPlayerException
[junit] java.lang.NoClassDefFoundError: javazoom/jlgui/basicplayer/BasicPlayerException
Ho decisamente bisogno di una mano per questo task... !
Questa non ci voleva.
Ma noi usiamo OpenAL solo per il suono delle gemme che toccano il suolo? Non potremmo passare a JMF anche per queste?
Ma lwjgl + openal permettono la riproduzione solo da file su hd? Non potremmo caricare un mp3/ogg, decodificarlo in memoria e poi darlo in pasto a quello che abbiamo gia per riprodurlo.
Online ho trovato librerie per decodificare mp3 e ogg completamente scritte in java.
ciao ;)
Ma lwjgl + openal permettono la riproduzione solo da file su hd? Non potremmo caricare un mp3/ogg, decodificarlo in memoria e poi darlo in pasto a quello che abbiamo gia per riprodurlo.
Online ho trovato librerie per decodificare mp3 e ogg completamente scritte in java.
ciao ;)
Vic, per favore potresti dare una mano a BD?
Vic, per favore potresti dare una mano a BD?
Sinceramente non saprei dove mettere le mani :cry:
ciao ;)
BlueDragon
17-04-2006, 00:52
Che librerie hai trovato Vicius?
Purtroppo quelle che ho trovato io se le includiamo nel progetto fanno crashare OpenAL....quindi non è possibile utilizzarle in tal senso :(
BlueDragon
17-04-2006, 02:17
Yesssssssssssssssss!!! Grazie al supporto di Jocchan, ho risolto tutto :)
[o almeno sembra :P]
Non sembrano esserci problemi di lag.
Ora Ant builda.
Il suono viene riprodotto correttamente (si Jocchan, ho tolto pure i "click"!:))
Ora devo solo riscrivere la parte della musica di background che avevo cancellato nel fare le varie prove per i suoni delle gemme... :)
La cosa più divertente è che il codice che committerò non ha nulla di difficile...anzi, a guardarlo è proprio banale :P
Yesssssssssssssssss!!! Grazie al supporto di Jocchan, ho risolto tutto :)
[o almeno sembra :P]
Non sembrano esserci problemi di lag.
Ora Ant builda.
Il suono viene riprodotto correttamente (si Jocchan, ho tolto pure i "click"!:))
Ora devo solo riscrivere la parte della musica di background che avevo cancellato nel fare le varie prove per i suoni delle gemme... :)
La cosa più divertente è che il codice che committerò non ha nulla di difficile...anzi, a guardarlo è proprio banale :P
Bravissimo! A me non interessa usare OpenAL, se puoi fare tutto con un altra libreria va bene.
E' sempre cosi', si passano ore o anche giorni su una feature, si fanno tantissime prove, si semplifica e alla fine... il codice e' banale :)
Mi succede talmente spesso che non mi stupisco piu', anzi.
Che librerie hai trovato Vicius?
Purtroppo quelle che ho trovato io se le includiamo nel progetto fanno crashare OpenAL....quindi non è possibile utilizzarle in tal senso :(
Qui c'è quella per ogg: http://www.jcraft.com/jorbis/
Mentre qui: http://www.mpg123.de/mpg123/jmpg123-0.1.tar.gz c'è un jar per gli mp3
ciao ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.