|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
CrushBox
Ho tirato fuori il comportamento del crushBox da PlayField a CrushBox.
I test passano tutti. Però la crushBox nn si comportà come prima. Mi sono messo a testare come funziona esattamente. Sta in piedi per volontà divina o qualcosa di più grosso. Proverò a illustrarvi il comportamento attuale, poi jocchan, mi deve dire quanto devo replicare di questo comportamento. Ora vi faccio un esempio dello svolgimento Parte una crush.
poi per i prossimi update ci sarà questo ciclo
qua si notano gia varie cose. Il timestamp viene aggiornato a ogni ciclo per cui serve a poco. Inoltre la texture viene spostata verso l'esterno. Ma guardando il gioco(la grafica) questo non avviene. La textura si espande e si riduce senza spostarsi. !!!!!!!!! Questo succede perchè la pulsazione resetta la posizione dello sprite. Per cui lo sprite viene spostato. Ma poi durante la draw, lo sprite torna nella posizione precedente. L'evento che ci fa uscire da questo ciclo è lo sprite che finisce un ciclo di pulsazione. In questo caso entriamo nel seguente ciclo
Dopo di che riprende il ciclo
Qua si nota che ancora, il timestamp nn serve a nulla, visto che viene memorizzato a ogni ciclo. Ma stavolta, lo spostamento della texture verso l'esterno funziona, visto che la pulsazione non c'è più. Si va avanti con questo ciclo, fino a quando si verificano 2 eventi La gemsPair venuta fuori dopo la crush arriva a terra.Perchè????? Perchè quando questo capita questo evento, viene resettata la chainCrush(GemsPairOnControlState riga 41) . Per cui sarà passato come crush 0 e il ciclo diverrà:
Finalmente non salviamo più il timeStamp. Precedentemente o successivamente, lo sprite sarà uscito dallo schermo. In questo caso smettiamo anche di spostare la texture verso l'esterno Ma il ciclo rimane. A questo punto, se dall'ultimo timeStamp passato sono passati sufficienti millisecondi(crushBoxUpdateRate da config) allora lo sprite viene reso invisibile(in teoria lo era gia, visto che era fuori schermo). A questo punto si aspetta la prossima crush. mi pare il tutto abbastanza fragile. Se lo si vuole rivedere, va capito bene come si deve comportare il crushBox. Jocchan? Fran? ![]() Ultima modifica di thebol : 10-03-2008 alle 21:03. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Il comportamento della crushbox deve essere questo:
- comparire nella posizione prefissata - ingrandirsi fino al valore indicato in config (senza spostarsi) - tornare alle dimensioni normali (sempre senza spostarsi) - scorrere fuori dallo schermo - venire cancellata. quindi va bene che non si muova mentre sta pulsando ![]()
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Altra cosa. Nel PlayfieldDescriptor vengono passate la warningBox e la counterBox, ma per il gameOverBox e la crushBox viene passata solo la posizione.
Forse e' YAGNI, ma sarebbe molto piu' sensato uniformare le cose ( il che implica anche una semplificazione del codice della create dei playfield) |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
Per cui crushBoxUpdateRate lo casso. Se capita una doppia crush, vuoi che il comportamento sia identico, tranne che a un certo punto dell'ingrandimento cambia la texture? |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
Una nuova crush prima che la crushbox sia sparita? E' possibile?
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Quote:
La crushbox deve essere mostrata dopo che queste cancellazioni consecutive terminano, non prima, e quindi viene già scelta la texture giusta.
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
Come non detto, ho controllato ed è giusto il comportamento attuale.
Ricordavo male io.
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ottimo lavoro.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Bene. Aggiungi i test di playfield e abbiamo finito qui?
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
non ho ancora aggiunto i test da playField...
ma volevo porre alla vs attenzione questo codice(fatto da me) per crushBox Codice:
public void update(int crushCounter) { if (crushCounter >= 2 && crushCounter > this.crushCounter) { if (!isPulsing()) { show(); startPulsation(new SinglePulsation(crushBoxPulsationLength, crushBoxSizeMultiplier)); } this.crushCounter = crushCounter; setTexture(getTexture(crushCounter)); } if (!isHidden()) { if (getPulsation() != null) { if (getPulsation().ended()) { stopPulsation(); } } else if (!isOffScreen()) { setPosition(getPosition().getX() + speed, getPosition().getY()); } else { hide(); this.crushCounter = 1; } } } se qualcuno ha qualche idea, killi pure sto codice. ps. sono ammesse le tecniche okuto e nanto. |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
PS. Il prossimo commento in italiano che leggo scatta il revert automatico Codice:
//TODO sono incazzato per l'inter, per cui questo metodo da CC di 8 se lo semplifica qualcun'altro ![]()
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 15-03-2008 alle 12:51. |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
|
Quote:
![]() ![]() ![]()
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
|
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
Codice:
public void update(int crushCounter) { if (onCreation(crushCounter)) { show(); startPulsation(new SinglePulsation(crushBoxPulsationLength, crushBoxSizeMultiplier)); } if (onChangeTexture(crushCounter)) { this.crushCounter = crushCounter; setTexture(getTexture(crushCounter)); } if (onStopPulsing()) { stopPulsation(); } if (onMovingOut()) { setPosition(getPosition().getX() + speed, getPosition().getY()); } if (onHide()) { hide(); this.crushCounter = 1; } } private boolean onHide() { return !isHidden() && isOffScreen() ; } private boolean onMovingOut() { return !isHidden() && getPulsation() == null && !isOffScreen() ; } private boolean onStopPulsing() { return !isHidden() && getPulsation() != null && getPulsation().ended() ; } private boolean onChangeTexture(int crushCounter) { return crushCounter >= 2 && crushCounter > this.crushCounter ; } private boolean onCreation(int crushCounter) { return onChangeTexture(crushCounter) && !isPulsing() ; } E' cambiato però un comportamento. Prima il crushBox incominciava a spostarsi verso l'esterno 2 turni dopo rispetto a quando smetteva di pulsare. Penso che sia più corretto che incominci a spostarsi il turno direttamente successivo. |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
fra l'altro è stato abbastanza lungo capire come funzionava prima il codice, far passare i test, vedere che cmq nn funzionava come prima, mettersi in debug in gioco(con doppio schermo per vedere che succedeva e quando succedeva), spiegarlo a joc, l'inter che esce, etc etc che ormai odiavo il crushBox, volevo solo vederlo funzionare senza che checkStyle mi stracciasse la wuallera... Ultima modifica di thebol : 15-03-2008 alle 12:43. |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Ho rifattorizzato cosi': Codice:
public void update(int newCrushCounter) { if (canUpdateCounter(newCrushCounter)) { updateCounter(newCrushCounter); } if (isHidden()) { return; } if (!isPulsing()) { if (isOffScreen()) { hide(); resetCounter(); } moveRight(speed); } updatePulsation(); } Codice:
private void updateCounter(int newCrushCounter) { setCrushCounter(newCrushCounter); if (!isPulsing()) { startSinglePulsation(pulsationLength, sizeMultiplier); } } Codice:
private boolean canUpdateCounter(int newCrushCounter) { return newCrushCounter >= 2 && newCrushCounter >= this.crushCounter; } private void setCrushCounter(int newCrushCounter) { this.crushCounter = newCrushCounter; updateTexture(crushCounter); }
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ultimo colpetto:
Codice:
public void update(int newCrushCounter) { if (canUpdateCounter(newCrushCounter)) { updateCounter(newCrushCounter); } if (isHidden()) { return; } updatePosition(); updatePulsation(); } Codice:
private void updatePosition() { if (isPulsing()) { return; } if (isOffScreen()) { hide(); resetCounter(); } else { moveRight(speed); } } I test erano ottimi, ho lavoro senza mai lanciare il gioco, semplicemente guardando fallire i test per capire la logica di questo codice.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 15-03-2008 alle 12:53. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:08.