Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-03-2008, 22: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 22:03.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2008, 23: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 11-03-2008, 00: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, 09: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, 14: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, 14: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, 14: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, 15: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, 15: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, 15: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, 15: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, 11: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, 11: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, 11: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, 13: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 13:51.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 13:24   #16
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4739
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, 13: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, 13: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 13:43.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 13: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, 13: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 13:53.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
Obbligati ad acquistare una scheda madre...
GTA VI su PC? La data non c'è, ma...
Monopattini elettrici, a un anno dal dec...
Tesla Robotaxi, autista di sicurezza si ...
Samsung Galaxy S26: svelate le combinazi...
Microsoft Ignite: arriva Edge for Busine...
OPPO e Lamine Yamal uniscono sport e tec...
Microsoft, NVIDIA e Anthropic siglano un...
SpaceX potrebbe comunicare alla NASA rit...
Scoperte cavità sotterranee scava...
OnePlus anticipa l'arrivo di due nuovi p...
DJI lancia Osmo Action 6: la prima actio...
NASA: conferenza stampa sulla cometa int...
Ex CEO di TSMC passa a Intel: aperta un'...
Gigabyte X870E Aorus Elite X3D, una moth...
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: 02:46.


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