Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-03-2008, 21:00   #1
thebol
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.
  • Viene settata la texture giusta
  • Viene inizializzata la posizione dello sprite, la pulsazione e lo sprite viene reso visibile
  • viene memorizzato il timestamp
  • viene spostata la texture verso l'esterno

poi per i prossimi update ci sarà questo ciclo
  • Viene settata la texture giusta
  • viene memorizzato il timestamp
  • viene spostata la texture verso l'esterno

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
  • Viene settata la texture giusta
  • viene memorizzato il timestamp
  • viene stoppata la pulsazione
  • viene spostata la texture verso l'esterno


Dopo di che riprende il ciclo
  • Viene settata la texture giusta
  • viene memorizzato il timestamp
  • viene spostata la texture verso l'esterno

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à:
  • viene spostata la texture verso l'esterno

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.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2008, 22:00   #2
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
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.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2008, 23:08   #3
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
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)
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 08:06   #4
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da Jocchan Guarda i messaggi
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
Ok.

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?
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 13:40   #5
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
Quote:
Originariamente inviato da thebol Guarda i messaggi
Se capita una doppia crush, vuoi che il comportamento sia identico, tranne che a un certo punto dell'ingrandimento cambia la texture?
Cosa intendi per doppia crush?
Una nuova crush prima che la crushbox sia sparita?
E' possibile?
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 13:54   #6
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da Jocchan Guarda i messaggi
Cosa intendi per doppia crush?
Una nuova crush prima che la crushbox sia sparita?
E' possibile?
una crush doppia, cioè quando una cancellazione(di chest) ne genera un altra per la caduta
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 13:56   #7
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
Quote:
Originariamente inviato da thebol Guarda i messaggi
una crush doppia, cioè quando una cancellazione(di chest) ne genera un altra per la caduta
Aspetta, prima di tutto la crush tecnicamente sarebbe l'insieme delle cancellazioni a catena (via chest) :P
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.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 14:14   #8
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da Jocchan Guarda i messaggi
Aspetta, prima di tutto la crush tecnicamente sarebbe l'insieme delle cancellazioni a catena (via chest) :P
La crushbox deve essere mostrata dopo che queste cancellazioni consecutive terminano, non prima, e quindi viene già scelta la texture giusta.
attualmente non è così.
  • Avviene la prima crush.
  • Il crushBox non viene fuori.
  • Scendono le gemme e avviene una seconda crush.
  • Viene mostrato il crushbox 2x.
  • Questo incomincia a espandersi.
  • Scendono le gemme e avviene una terza crush.
  • Mentre il crushBox continua ad espandersi, viene cambiata la texture nel 3x.
E cosi via.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 14:19   #9
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
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.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 14:31   #10
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da Jocchan Guarda i messaggi
Come non detto, ho controllato ed è giusto il comportamento attuale.
Ricordavo male io.
ok, allora quella parte la replico così come è ora
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2008, 14:58   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da thebol Guarda i messaggi
ok, allora quella parte la replico così come è ora
Ottimo lavoro.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 10:05   #12
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da fek Guarda i messaggi
Ottimo lavoro.
fatto e committato.

mancano i test da parte di playField che usa il crushBox, ma crushBox è interamente testata.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 10:52   #13
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da thebol Guarda i messaggi
fatto e committato.

mancano i test da parte di playField che usa il crushBox, ma crushBox è interamente testata.
Bene. Aggiungi i test di playfield e abbiamo finito qui?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 10:17   #14
thebol
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;
            }
        }
    }
ci sono troppi if...sta sotto il limite di checkStyle, ma non è cmq il max da vedere. Si potrebbe estrarre qualche metodo, ma poi il metodo risultante avrebbe poco significato da solo(aka si abbasserebbe la complessita ciclotomatica in maniera fittizia IMHO)..

se qualcuno ha qualche idea, killi pure sto codice.


ps. sono ammesse le tecniche okuto e nanto.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 12:05   #15
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da thebol Guarda i messaggi
ci sono troppi if...sta sotto il limite di checkStyle, ma non è cmq il max da vedere. Si potrebbe estrarre qualche metodo, ma poi il metodo risultante avrebbe poco significato da solo(aka si abbasserebbe la complessita ciclotomatica in maniera fittizia IMHO)..

se qualcuno ha qualche idea, killi pure sto codice.


ps. sono ammesse le tecniche okuto e nanto.
Quando i metodi da estrarre non sarebbero chiari, vuol dire che non e' chiaro a te per primo cio' che il metodo sta facendo, e come potrebbe farlo meglio. Pensaci un po' e togli tutti questi if. Questo metodo mi fa pensare che checkstyle e' troppo buono: lo stringo un po'.

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
Sono anch'io incazzato per l'Inter, ma non lo scrivo nella codebase

Ultima modifica di fek : 15-03-2008 alle 12:51.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 12:24   #16
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
Quote:
Codice:
   //TODO sono incazzato per l'inter, per cui questo metodo da CC di 8 se lo semplifica qualcun'altro


__________________
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
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 12:36   #17
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da fek Guarda i messaggi
Se i metodi da estrarre non sarebbero chiari, vuol dire che non e' chiaro a te per primo cio' che il metodo sta facendo, e come potrebbe farlo meglio. Pensaci un po' e togli tutti questi if. Questo metodo mi fa pensare che checkstyle e' troppo buono: lo stringo un po'.
ho provato a cambiare in questo
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()
        ;
    }
ho "srotolato" alcune condizioni, percui alla fine le condizioni esaminate sono di più. Però da leggere è probabilmente più chiaro, e si riesce a capire meglio quando capita qualcosa.

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.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 12:38   #18
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da fek Guarda i messaggi
Codice:
   //TODO sono incazzato per l'inter, per cui questo metodo da CC di 8 se lo semplifica qualcun'altro
Sono anch'io incazzato per l'Inter, ma non lo scrivo nella codebase
quella roba l'ho incominciata a scrivere martedi sera dopo 2 birre, e poi mi sono dimenticato di toglierla quando ho finito e committato...

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.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 12:46   #19
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da thebol Guarda i messaggi
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.
Non committare.

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);
    }
Ed ho portato su qualche metodo che appartiene logicamente a Sprite.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 12:48   #20
fek
Senior Member
 
L'Avatar di fek
 
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);
        }
    }
Si legge come fosse inglese vero?
I test erano ottimi, ho lavoro senza mai lanciare il gioco, semplicemente guardando fallire i test per capire la logica di questo codice.

Ultima modifica di fek : 15-03-2008 alle 12:53.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Roscosmos: static fire per i propulsori ...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
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:08.


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