Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    comparsa in posizione casuale

    buongiorno a tutti, premetto ke sono novizia nel campo dell'actionscript, e tra l'altro uso actionscript 2.
    vi posto il mio problema!! ho una serie di oggetti ke vorrei comparissero sullo stage in posizioni del tutto casuali, e fin qui ci sono xkè ho dato dei limiti alla xmax e xmin e alla ymax e ymin e poi ho usato math.random x la posizione!!

    vabbè, il problema più grosso è un altro...come faccio ad evitare ke si sovrappongano?? ho pensato di usare la formula della distanza e quindi se la dist tra due oggetti è minore di un tot si muovono ancora, altrimenti si fermano, ma considerando ke gli oggetti sono più di 30 e sto utilizzando un ciclo for, nn riesco a gestire la distanza di tutti da tutti!!

    riuscite ad aiutarmi??

    spero di essere stata abbastanza chiara!!

    grazie a tutti

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Ciao, benvenuta sul campo.

    A mio parere bisognerebbe suddividere il problema in due fasi principali.

    La prima fase è quella di studiare un "algoritmo", cioè un metodo caratterizzato da un procedimento logico mirato alla risoluzione del problema stesso. Questa fase è slegata da qualsiasi linguaggio di programmazione, seppur bisogna tener conto che l'algoritmo, in questo caso, deve poter essere riportato sotto forma di programma.

    La seconda fase è quindi quella di "convertire" tutto il procedimento in righe di ActionScript.

    Partendo dalla prima fase va analizzato il problema e trovato un metodo per risolverlo nella maniera più semplice possibile.

    A mio parere, un sistema per facilitare il calcolo in modo mirato e preventivo, quindi senza ricorrere a cicli di carattere empirico (condizioni, hitTest, ecc) che potrebbero rallentare l'elaborazione, è quello di suddividere lo stage in una ipotetica griglia (più o meno complessa) in modo che l'ingombro di ogni clip si possa inscrivere in una singola cella (o in più celle adiacenti ma sempre identificabili attraverso un calcolo ben definito) così che ogni clip non risulti mai sovrapposto ad altri clip che occuperanno le altre celle.
    A livello di script si utilizzerà un array per definire le celle ed escluderle man mano che vengono occupate. In questo modo l'elaborazione risulterà lineare.

    Ovviamente questo sistema impone dei vincoli definiti dalla griglia stessa, per cui la posizione di ogni clip non è del tutto casuale. Si può comunque trovare un giusto compromesso, a seconda delle esigenze, definendo una griglia più o meno complessa e un sistema di occupazione delle celle più o meno elaborato.

    Prima di elaborare uno script servirebbero, ad ogni modo, maggiori dettagli per capire meglio la situazione che vorresti ottenere.
    L'ingombro dei clip può essere definito preventivamente?
    Si può, ad esempio, supporre una dimensione massima per tutti i clip in modo da definire la dimensione delle celle?

    Allego una bozza d'esempio su come potrebbe risultare utilizzando una semplice griglia 8x8.
    Gli stessi oggetti sono riportati nella stessa posizione, sopra (con la griglia nascosta) e sotto (con la griglia visibile).

    Eventualmente sarebbe utile se allegassi tu una bozza dello stage con gli oggetti posizionati secondo una ipotetica composizione che vorresti ottenere.
    Immagini allegate Immagini allegate
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    ora mi sento un pò meno stupida... )
    nel senso ke questa cosa della griglia l'avevo pensata anke io, infatti mi sono costruita la mia griglia 6x6 con i limiti entro cui randomicamente si può posizionare la x e la y così:
    for (r=1; r<=_root.righe; r++) {
    for (c=1; c<=_root.colonne; c++) {
    //coordinate x
    _root['xmax'+r+c] = 185+(_root.modulox*(c)-110);
    _root['xmin'+r+c] = 185+(_root.modulox*(c-1));
    //coordinate y
    _root['ymax'+r+c] = _root.moduloy*(c)-60;
    _root['ymin'+r+c] = _root.moduloy*(c-1);
    //quadranti
    _root["limx"+r+c] = Math.floor(Math.random()*(_root['xmax'+r+c]-_root['xmin'+r+c]))+_root['xmin'+r+c];
    _root["limy"+r+c] = Math.floor(Math.random()*(_root['ymax'+r+c]-_root['ymin'+r+c]))+_root['ymin'+r+c];
    }
    }
    in questo modo ho dei limiti per la x e per la y in ogni quadrante.
    ok, ora il problema è l'array...nn ho idea di come funzioni!! ho seguito un master durante il quale mi hanno dato delle nozioni veramente base di flash, e molte cose le sto vedendo x conto mio, ma l'array è un argomento ke trovo un pò difficile!!
    diciamo ke da ieri mi sto cimentando, e dato ke ci sono ti chiedo qualcosa!!
    io teoricamente dovrei fare due array, uno per le coordinate x dei vari quadranti e una per le coordinate y. ma è possibile inserire nell'array delle variabili dello script?? cioè posso fare delle variabili, una x ogni quadrante, a cui associo il limitex e inserirle nell'array?? oppure l'array può contenere solo delle scritte o numeri??

    poi il passo successivo una volta creati gli array sarà quello di scrivere ke ogni oggetto dovrà scegliere un elemento randomico di un array ma dovrebbe scegliere quello della stessa posizione dell'altro array e dopo quegli elementi devono essere eliminati in modo ke nn vengano scelti da nessun altro!!

    ke casino, mi sto incasinando io sola, e nn so se è comprensibile quello ke ho scritto!!
    ti allego l'img della griglia (3x3), sarà ke è più comprensibile!!
    Immagini allegate Immagini allegate

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    A mio parere hai preso la strada giusta, ma anche se tu avessi optato per una soluzione "sbagliata" (o meno efficace) non credo si possa parlare comunque di stupidità.
    L'essere stupidi sta più che altro nel non tentare nulla o nel ripetere i propri errori senza essere capaci di correggerli.
    Come disse qualcuno: "Stupido è chi lo stupido fa".

    La suddivisione in parti del problema sta alla base di qualsiasi processo di elaborazione ed è sicuramente il primo passo da considerare per la risoluzione del problema stesso.

    In questo caso utilizziamo una griglia per suddividere lo stage in celle, in modo che il procedimento sia gestibile più facilmente.

    Il metodo che hai utilizzato, nel creare due cicli per identificare le righe e le colonne, potrebbe andare bene ma per esperienza ti consiglio un diverso procedimento adoperando piuttosto un unico ciclo (per la serie di clip) in cui identifichi l'indice dell'array (cioè delle celle). Da questo indice si potranno poi ottenere il numero di riga e quello di colonna per poi ricavarne le coordinate in cui posizionare ogni clip.

    Non sempre quindi è utile suddividere il problema per cercare di raggiungere la soluzione in modo più facile (in questo caso hai voluto utilizzare due cicli per identificare la griglia) ma a volte è più efficace risolvere la situazione in un unico passaggio. Infatti si può ottimizzare il procedimento utilizzando un unico ciclo .
    Questa è l'eccezione che conferma la regola.

    Posto un esempio su cui potrai eventualmente lavorare.
    Supponi di avere già disposto nello stage 5 clip che chiamerai (clip1, clip2, ecc)..

    Codice PHP:
    // utilizzo una funzione (è sempre comodo avere una funzione da poter richiamare in qualsiasi momento)
    function disponi() {
        
    // Dichiaro le variabili generali (è meglio abituarsi a farlo in previsione di un futuro passaggio ad AS3)
        
    var clip:MovieClipi:Numbero:Number;

        
    // Definisco le caratteristiche della griglia (potrei usare delle singole variabili ma un oggetto ha una maggiore scalabilità).
        
    var griglia:Object = {larghezza:550altezza:400righe:3colonne:3};

        
    // Creo un array per degli oggetti.
        //  Per identificare la serie degli oggetti da disporre sullo stage utilizzo un array
        //  supponendo che questi oggetti siano già presenti sullo stage.
        //  E' possibile comunque studiare e usare un qualsiasi altro sistema.
        
    var oggetti:Array = [clip1clip2clip3clip4clip5];

        
    // Deduco gli altri attributi della griglia in base alle caratteristiche definite sopra
        
    griglia['totaleCelle'] = griglia.righe*griglia.colonne;
        
    griglia['cella'] = {larghezza:griglia.larghezza/griglia.righealtezza:griglia.altezza/griglia.colonne};
        
    griglia['indici'] = new Array();

        
    // Creo l'array di indici della griglia popolando ogni elemento secondo una normale serie numerica.
        
    for (i=0i<griglia.totaleCellei++) {
            
    griglia.indici[i] = i;
        }

        
    // Eseguo un ciclo degli oggetti e li posiziono secondo l'ordine casuale
        // ottenuto prendendo a random gli elementi dell'array griglia.
        
    for (o in oggetti) {
            
    // Riferimento al clip corrente preso dalla sequenza degli oggetti.
            
    clip oggetti[o];
            
    // Pesco un indice casuale ed elimino questo elemento dall'array in modo da non poterlo ripescare.
            
    griglia.indici.splice(Math.random()*griglia.indici.length1)[0];

            
    // Posiziono il clip dentro la cella a cui si riferisce l'indice casuale.
            // Il clip viene inoltre posizionato casualmente all'interno della cella considerando la dimensione della cella e l'ingombro del clip.
            
    clip._x = (i%griglia.colonne)*griglia.cella.larghezza+Math.random()*(griglia.cella.larghezza-clip._width);
            
    clip._y int(i/griglia.righe)*griglia.cella.altezza+Math.random()*(griglia.cella.altezza-clip._height);
        }
    }

    // richiamo la funzione per disporre gli oggetti sullo stage
    disponi(); 
    Ho cercato di commentare al meglio ciò che ho fatto ma è probabile che diversi passaggi ti sembrino incomprensibili.
    Nel caso puoi sempre domandare chiarimenti.

    Per quanto riguarda l'utilizzo degli array dovresti dare prima uno sguardo alla guida.
    http://livedocs.adobe.com/flash/9.0_...LangRef_1.html
    Se poi ci sono dei dubbi che non riesci proprio a capire c'è sempre il forum (fare comunque sempre una ricerca prima di postare).

    Buon divertimento!
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    innanzitutto ti ringrazio molto dell'aiuto!
    da un primo sguardo mi sembra tutto abbastanza chiaro, a parte il fatto ke nn ho mai usato scrivere una funzione per poi richiamarla successivamente...ma diciamo ke questa parte riuscirò a capirla!!
    altra cosa a me ignota è sulle ultime due righe, quelle riferite alla posizione x e y dei movieclip: il simbolo % nn so cos'è, così come il comando int...

    ...domani studierò tutto con calma!! )

    grazie ancora
    monica

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Prima di tutto riporto lo script perchè ho dovuto correggere qualche piccolo bug:

    Codice PHP:
    // utilizzo una funzione (è sempre comodo avere una funzione da poter richiamare in qualsiasi momento)
    function disponi() {
        
    // Dichiaro le variabili generali (è meglio abituarsi a farlo in previsione di un futuro passaggio ad AS3)
        
    var clip:MovieClipi:Numbero:Number;

        
    // Definisco le caratteristiche della griglia (potrei usare delle singole variabili ma un oggetto ha una maggiore scalabilità).
        
    var griglia:Object = {larghezza:550altezza:350colonne:3righe:3};

        
    // Creo un array per degli oggetti.
        //  Per identificare la serie degli oggetti da disporre sullo stage utilizzo un array
        //  supponendo che questi oggetti siano già presenti sullo stage.
        //  E' possibile comunque studiare e usare un qualsiasi altro sistema.
        
    var oggetti:Array = [clip1clip2clip3clip4clip5];

        
    // Deduco gli altri attributi della griglia in base alle caratteristiche definite sopra
        
    griglia['totaleCelle'] = griglia.colonne*griglia.righe;
        
    griglia['cella'] = {larghezza:griglia.larghezza/griglia.colonnealtezza:griglia.altezza/griglia.righe};
        
    griglia['indici'] = new Array();

        
    // Creo l'array di indici della griglia popolando ogni elemento secondo una normale serie numerica.
        
    for (i=0i<griglia.totaleCellei++) {
            
    griglia.indici[i] = i;
        }

        
    // Eseguo un ciclo degli oggetti e li posiziono secondo l'ordine casuale
        // ottenuto prendendo a random gli elementi dell'array griglia.
        
    for (o in oggetti) {
            
    // Riferimento al clip corrente preso dalla sequenza degli oggetti.
            
    clip oggetti[o];
            
    // Pesco un indice casuale ed elimino questo elemento dall'array in modo da non poterlo ripescare.
            
    griglia.indici.splice(Math.random()*griglia.indici.length1)[0];
            
    // Posiziono il clip dentro la cella a cui si riferisce l'indice casuale.
            // Il clip viene inoltre posizionato casualmente all'interno della cella considerando la dimensione della cella e l'ingombro del clip.
            
    clip._x = (i%griglia.colonne)*griglia.cella.larghezza+Math.random()*(griglia.cella.larghezza-clip._width);
            
    clip._y Math.floor(i/griglia.colonne)*griglia.cella.altezza+Math.random()*(griglia.cella.altezza-clip._height);
        }
    }

    // richiamo la funzione per disporre gli oggetti sullo stage
    disponi(); 
    da un primo sguardo mi sembra tutto abbastanza chiaro, a parte il fatto ke nn ho mai usato scrivere una funzione per poi richiamarla successivamente...ma diciamo ke questa parte riuscirò a capirla!!
    Ho usato una funzione essenzialmente per due motivi, anzi tre:

    Praticità nell'utilizzo dello script.
    Una funzione ovviamente può essere richiamata da qualunque parte del tuo filmato e può essere richiamata anche più volte e in diverse circostanze. Ad esempio puoi richiamarla al click su un pulsante semplicemente associando tale funzione all'evento onRelease. Nel caso specifico non ha particolarmente senso ma è sempre meglio "predisporre" il tutto per un uso generalizzato.

    Identificazione di un'area di validità ben distinta.
    Una funzione ha una sua certa area di validità in cui tutte le variabili dichiarate al suo interno nascono, vivono e muoiono sempre e solo all'interno di tale funzione. Questo permette di avere una maggiore pulizia nell'uso delle variabili. Permette inoltre di avere più "istanze" della stessa funzione che mantengono ognuna la validità delle proprie variabili evitando possibili sovrascritture delle variabili stesse.
    Ad ogni modo è meglio evitare di disseminare variabili qua e là sulla root. In determinati casi questo può infatti essere utile per il risparmio di risorse perché si evita di mantenere in memoria delle variabili non più utilizzate dopo che la funzione ha fatto il suo dovere. Ovviamente bisogna tenere conto che la funzione stessa è una variabile tenuta in memoria (ma che volendo la si può eliminare in un sol colpo).

    Maggiore scalabilità e riutilizzo dello script.
    Una funzione può essere implementata facilmente per un utilizzo generalizzato. Supponi ad esempio di voler disporre, nello stesso filmato, diversi gruppi di clip in diverse griglie.. basterà in questo caso impostare la stessa funzione con dei parametri ed utilizzare sempre lo stesso script evitando quindi di ripetere blocchi di script simili.

    altra cosa a me ignota è sulle ultime due righe, quelle riferite alla posizione x e y dei movieclip: il simbolo % nn so cos'è, così come il comando int...
    Questo simbolo "%" è detto "operatore modulo", in sostanza calcola il resto di una divisione tra due numeri.

    Applicato al nostro script non fa altro che restituirci il valore della colonna.
    codice:
    (i%griglia.colonne)
    Tenendo presente che la variabile "i" rappresenta l'indice casuale di una cella che, nel caso specifico, ha un valore compreso tra 0 e 8 (data la griglia 3x3).
    Dividendo questo indice per il numero di colonne della griglia (griglia.colonne) otteniamo, come resto, il valore esatto della colonna in cui ricade la cella riferita a tale indice.

    Mentre la funzione "int" (che risulta essere obsoleta per cui l'ho sostituita con l'analogo metodo floor della classe Math) restituisce il valore intero di un numero (eliminando quindi la parte decimale nel caso ci si ritrovi con un numero decimale).

    Applicato al nostro script non fa altro che restituirci il valore della riga.
    codice:
    Math.floor(i/griglia.colonne)
    Dividendo l'indice "i" per il numero di colonne della griglia (non di righe come ho indicato erroneamente nello script iniziale), e prendendo la parte intera, otteniamo il valore esatto della riga in cui ricade la cella riferita a tale indice.

    Ecco perché ho scritto:
    adoperando piuttosto un unico ciclo (per la serie di clip) in cui identifichi l'indice dell'array (cioè delle celle). Da questo indice si potranno poi ottenere il numero di riga e quello di colonna per poi ricavarne le coordinate in cui posizionare ogni clip.
    Questi valori (relativi a colonna e riga della cella) sono poi moltiplicati per le rispettive dimensioni della cella così da ottenere dei valori che corrispondono alle coordinate dell'angolo superiore-sinistro della cella in questione.
    codice:
            (i%griglia.colonne)*griglia.cella.larghezza;
            Math.floor(i/griglia.colonne)*griglia.cella.altezza
    Qui va specificato che bisognerà adottare una convenzione affinché il sistemi di riferimenti tra griglia e clip sia compatibile.
    Infatti ho ipotizzato che il punto di registrazione di ogni clip sia riferito all'angolo superiore-sinistro (così come è solitamente).

    L'ultimo passaggio è quello di randomizzare la posizione del clip all'interno della cella.
    Non ho fatto altro che calcolarmi lo spazio utile rimanente nella cella, rispettivamente per la larghezza (griglia.cella.larghezza-clip._width) e per l'altezza (griglia.cella.altezza-clip._height), e quindi moltiplicarlo per un numero casuale.
    codice:
    clip._x = (i%griglia.colonne)*griglia.cella.larghezza+Math.random()*(griglia.cella.larghezza-clip._width);
    clip._y = Math.floor(i/griglia.colonne)*griglia.cella.altezza+Math.random()*(griglia.cella.altezza-clip._height);
    Mi scuso per la lunga esposizione, spero sia tutto chiaro.
    Buono studio.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    veramente grazie, sei stato disponibilissimo!!
    ti chiedo una cosa al volo prima di leggere bene tutto quello ke mi hai scritto, su come richiamare la funzione. infatti tutto ciò dovrà proprio succedere al release su un movieclip, xkè il tutto è inserito in un sito più completo. io di solito scrivo:
    Codice PHP:
    pippo_mc.onRelease=function(){"contenuto della funzione"
    in questo caso invece, x richiamare una funzione già scritta, si dovrebbe fare così??
    Codice PHP:
    pippo_mc.onRelease=disponi() 
    grazie ancora!!

  8. #8
    Utente bannato
    Registrato dal
    Jan 2009
    Messaggi
    713

    cu-cù? E' arrivato Max !!!

    mi consenta...
    guarda un po se ti piace questo esempio
    5 foto casuali in 9 celle 3 x 3

    http://max400.forumfree.it/?t=47199265
    Immagini allegate Immagini allegate

  9. #9
    gli oggetti ke ho io nn sono delle foto casuali, ma sono degli oggetti ke hanno un nome xkè devo poterli identificare e devono essere in un numero prestabilito. ovvero io ho 30 oggetti ognuno dei quali mi rappresenta un progetto, ke devono disporsi nello stage in modo casuale senza sovrapporsi, ma nn ci devono essere doppioni. nn si tratta di immagini ke vengono caricate a caso su diversi target, sono dei veri e proprio movieclip
    ma grazie cmq x l'esempio!!

  10. #10
    Utente bannato
    Registrato dal
    Jan 2009
    Messaggi
    713

    ah! capito!

    io pensavo dovessi fare uno di quei giochetti dove gli oggetti si accoppiano e poi scompaiono
    avevo visto l'esempio di killerworm...

    Nel tuo caso allora bisogna utilizzare un array.splice che ti elimina i vari oggetti presi dall'array
    oppure una semplice condizione if appoggiata ad un onEnterFrame di modo che se una cella è uguale ad un altra flash fa ripetere il random da capo...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.