Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 16 di 18
  • livello principiante
Indice lezioni

Le funzioni

Sviluppare le funzioni di controllo del gioco
Sviluppare le funzioni di controllo del gioco
Link copiato negli appunti

Dopo aver disposto gli elementi principali nell'area di lavoro passiamo alla fase di programmazione, che poi è solitamente la fase più complessa di un gioco, anche quando esso è relativamente semplice come "concetto" come appunto Memory.

Il campo di gioco

Per prima cosa dobbiamo creare dinamicamente le carte e disporre i simboli sotto di esse. Per questo possiamo usare il primo fotogramma, inserendo il seguente codice:

Listato 1. Moltiplicare le istanze delle carte

for(n=2;n<17;n++){
  // Creiamo una nuova carta
  duplicateMovieClip("carta1","carta" add n,-n);
  // Posizioniamo la carta creata
  tellTarget("carta" add n){
    _x = _root.xPos;
    _y = _root.yPos;
  }
  // Impostiamo la posizione della prossima carta
  xPos += 30;
  if(n%4 == 0){
    yPos += 45;
    xPos = carta1._x;
  }
}

for(s=1;s<9;s++){
  call("estrai");
  primacarta=numero;
  call("estrai");
  secondacarta=numero;
  duplicateMovieClip("simbolo" add s, "simbolo" add s add "copy",10+s);
  duplicateMovieClip("simbolo" add s, "simbolo" add s add "copy2",20+s);
  _root["carta" add primacarta].simb = s add "copy";
  _root["carta" add secondacarta].simb = s add "copy2";
  _root["carta" add primacarta].valore = s;
  _root["carta" add secondacarta].valore = s;
  _root["simbolo" add s add "copy"]._x = _root["carta" add primacarta]._x;
  _root["simbolo" add s add "copy"]._y = _root["carta" add primacarta]._y;
  _root["simbolo" add s add "copy"]._visible = false;
  _root["simbolo" add s add "copy2"]._x = _root["carta" add secondacarta]._x;
  _root["simbolo" add s add "copy2"]._y = _root["carta" add secondacarta]._y;
  _root["simbolo" add s add "copy2"]._visible = false;
}

Spieghiamo cosa succede: utilizziamo un ciclo for per generare le istanze delle varie carte. Un ciclo è una serie di azioni che viene eseguita finchè una determinata condizione è verificata. In questo caso il ciclo viene eseguito finchè la variabile n risulta minore di 17, e ogni volta questa variabile viene incrementata di una unità.

Durante il ciclo viene creata una nuova carta duplicando la prima (duplicateMovieClip("carta1","carta" add n,-n)), quindi questa carta viene posizionata nello stage grazie al codice:

Listato 2. Posizionare l'istanza della carta

tellTarget("carta" add n){
  _x = _root.xPos;
  _y = _root.yPos;
}

A questo punto incrementiamo le variabili xPos e yPos in modo da impostare la posizione della prossima carta.

Terminato il primo ciclo (che si occupa di creare e disporre le carte), ha inizio un altro ciclo for, che crea le diverse "coppie" di carte per ogni simbolo: per prima cosa chiama la funzione estrai(), quindi crea due copie dei vari simboli e le posiziona sotto alle due carte estratte dalla funzione. Il blocco di codice:

Listato 3. Posizionare i simboli su ogni istanza della carta

_root["simbolo" add s add "copy"]._x = _root["carta" add primacarta]._x;
_root["simbolo" add s add "copy"]._y = _root["carta" add primacarta]._y;
_root["simbolo" add s add "copy"]._visible = false;
_root["simbolo" add s add "copy2"]._x = _root["carta" add secondacarta]._x;
_root["simbolo" add s add "copy2"]._y = _root["carta" add secondacarta]._y;
_root["simbolo" add s add "copy2"]._visible = false;

Si occupa di posizionare i simboli in corrispondenza delle carte e di nasconderli, mentre il codice:

Listato 4. Assegnare simboli e valori alle carte

_root["carta" add primacarta].simb = s add "copy";
_root["carta" add secondacarta].simb = s add "copy2";
_root["carta" add primacarta].valore = s;
_root["carta" add secondacarta].valore = s;

Associa alle carte le variabili simb e valore, che saranno utilizzate nel gioco per controllare quando vengono trovati due simboli uguali: le carte con lo stesso simbolo infatti avranno la variabile valore uguale tra loro.

La funzione estrai()

Inseriamo come fotogramma chiave il terzo della linea temporale, diamogli come etichetta "estrai" (come abbiamo già visto durante questa guida) e inseriamo il seguente codice

Listato 5. Generare l'estrazione casuale

numero = random(16)+1
if(_root["c"+numero] ne 1){
  _root["c"+numero] = 1
}
else{
  call("estrai")
}

La funzione è molto breve ma è fondamentale. Questa funzione infatti, quando viene richiamata, si occupa di selezionare le coppie di carte in cui inserire i simboli. La scelta è casuale grazie al comando random.

Per essere certi che la stessa carta non venga scelta più di una volta, impostiamo la variabile "c" + numero ad 1, così se durante un'altra estrazione casuale uscisse un numero già utilizzato, il controllo (if ...) se ne accorgerebbe e ripeterebbe la funzione fino all'estrazione di una carta non ancora utilizzata.

Azioni dell'utente

L'utente dovrà avere la possibilità di selezionare una carta e visualizzarne il simbolo, quindi selezionare una seconda carta e vedere il simbolo di quest'ultima: se i due simboli sono uguali le carte restano visibili e il punteggio aumenta, altrimenti le carte ritornano coperte. Una volta scoperte tutte le coppie, il giocatore vince.

La funzione che si occuperà del controllo, e che inseriremo nel secondo fotogramma nella linea temporale, con etichetta "controlla", è la seguente:

Listato 6. Gestire le selezioni dell'utente

if(clip_selezionato ne clip_uno){
  _click ++;
  if(_click == 1){
    clip_uno = clip_selezionato;
    cartauno = carta;
    valore_uno = valore_selezionato;
  }
  if(_click == 2){
    if(valore_selezionato ne valore_uno){
      _root["simbolo" add clip_uno]._visible = false;
      _root["simbolo" add clip_selezionato]._visible = false;
      _root[cartauno]._visible = true;
      _root[carta]._visible = true;
    } else {
      _root[cartauno]._visible = false;
      _root[carta]._visible = false;
      coppie++;
      if(coppie == 8){
        vittoria._visible = true;
      }
    }
    _click = 0;
    clip_uno = 0;
    cartauno = 0;
    valore_uno = 0;
  }
}

Alcune parti del codice saranno spiegate più a fondo nella prossima lezione, per ora ci basti sapere che _click, che abbiamo dichiarato all'inizio, avrà due possibili valori:

  • 1 l'utente sceglie la prima carta
  • 2 l'utente sceglie la seconda carta.

Nel primo caso saranno semplicemente impostate alcune variabili, da usare nel controllo successivo, grazie alle quali possiamo controllare quali carte sceglie l'utente e se i simboli corrispondono.

In caso di corrispondenza, i simboli rimarranno visibili e le carte saranno nascoste e non più selezionabili; in caso contrario, saranno nascosti i simboli.

Quando _click ha valore 2, dopo il controllo, quale che sia l'esito viene azzerata e torniamo allo stato di "nessuna carta scelta" (infatti dopo aver scelto due carte, siano i lori simboli uguali oppure no, l'utente dovrà selezionare altre due carte). Analogamente vengono impostate a zero anche le variabili relative al controllo delle carte selezionate.

Questa funzione sarà richiamata dal movieclip fittizio che abbiamo creato nella lezione precedente, che a sua volta interagirà col pulsante interno di ogni carta. Vedremo come unire il tutto nella prossima lezione.

Ti consigliamo anche