Deprecated: Function set_magic_quotes_runtime() is deprecated in /membri2/gm6guide/forum/inc/class_core.php on line 148

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 340

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 341

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 342

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 343

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 323

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 340

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 341

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 342

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /membri2/gm6guide/forum/inc/class_parser.php on line 343
Giochetto di abilità col mouse


Discussione chiusa  Scrivi discussione 
Giochetto di abilità col mouse
Autore Messaggio
Bak IV
Administrator
*******



Messaggi: 2,922
Gruppo: Administrators
Registrato: Nov 2005
Stato: Offline
Reputazione: 18
Messaggio: #1
Giochetto di abilità col mouse

freeflip ha scritto:
Chiedo qualche linea guida per il seguente progetto:

Il gioco consiste nel cliccare col mouse un'area dello schermo che viene evidenziata in modo casuale.

Esempio: la prima room viene suddivisa in 4 parti uguali, bisogna cliccare quella evidenziata, poi si evidenzierà una delle 3 rimanenti e così via.
Una volta finita la prima room sia passerà alla seconda che sarà suddivisa in rettangoli sempre più piccoli e via dicendo.

...e che ci vuole, ma la difficoltà è che il mouse sarà visibile per pochissimo solo quando si clicca, poi tornerà invisibile.

Non voglio mettere nessuno sprite per i rettangoli; deve essere tutto disegnato nell'evento draw.
Ogni room avrà delle variabili contenute anche nello script base, quindi quest'ultimo sarà unico per tutte le room.

Se il tutto può essere interessante chiedo aiuto per ridurre ai minimi termini il codice.


Bak IV ha scritto:
Si, si può fare, e senza troppi problemi...

Diventa un gioco simile a 'Simon', ricordate? Quel baracchino con pulsanti di diverso colore, che si illuminano in sequenza, ed in cui i giocatori devono memorizzare una sequenza sempre più lunga...

Vediamo come realizzarlo usando un'unico script...

Vista la natura del gioco, si può utilizzare una variabile che identifichi il livello e far nuovere il tutto nella stessa room. In base al livello cambia il numero di suddivisioni dello schermo, che useremo per disegnare dei riquadri di colore casuale, ottenedo così l'evidenziazione dell'area da cliccare.

Se tutto è lineare come sembra, in create dell'unico oggetto esistente, andranno inizializzate alcune variabili di comodo:

Codice:
livello=1;
MX=mouse_x();
MY=mouse_y();
timer=0;
completo=0;
/*
ne seguiranno altre, sto improvvisando...
*/


Quindi, la parte più ostica consiste nel disegnare un tot di riquadri proporzionale al livello raggiunto... quindi abilitare un contatore (timer in questo caso...) che limiti il tempo di apparizione dell'area ed il tempo totale a disposizione...

Ora, sappiamo che è sempre possibile determinare un rettangolo, sia indicando coordinate precise che facendogliele calcolare in base alla room.

Ad esempio, il primo riquadro in alto a sinistra sarà sempre dato da:

Codice:
draw_rectangle(0,0,room_width/qualcosa, room_height/qualcosa2);


Se il divisore è proporzionale al livello raggiunto, ecco qui che il rettangolo sarà sempre più piccolo e ce ne saranno sempre di più col crescere del livello... ma torniamo un'attimo indietro...

Lo stesso rapporto room_width/qualcosa può essere usato anche per determinare l'origine degli altri riquadri... ed il numero di volte che deve essere ripetuto il ciclo di gioco...

Ti consiglio di iniziare con un numero di suddivisioni fisso (ad es: quattro per schermata) , e di farlo diventare variabile quando avrai risolto questi due problemi:

- come far apparire un riquadro in posizione casuale rispetto a quelle possibili...

- come gestire il gioco usando un'espressione sempre valida al variare del numero di suddivisioni...


freeflip ha scritto:
Il problema maggiore è proprio quello di disegnare casualmente il rettangolo da cliccare, tenendo in considerazione che quelli già cliccati sono esclusi. (qui non riesco proprio a trovare una soluzione) :?


Bak IV ha scritto:
Vediamo di semplificare il problema.
Fissiamo il numero minimo di riquadri a 4 e vediamo di farlo funzionare così... per prima cosa otteniamo le coordinate che li descrivono:

- primo rettangolo:       (0, 0, room_with/2, room_height/2)
- secondo rettangolo    (room_width/2,0,room_width,room_height/2)
- terzo rettangolo         (0,room_height/2,room_width/2,room_height)
- quarto rettangolo       (room_width/2, room_height/2, room_width, room_height)

Ora che sappiamo questo, se ogni riquadro va disegnato una sola volta, sappiamo che un'iterazione andrà compiuta 4 volte, in modo esclusivo, cioè, una volta che un rettangolo viene cliccato, viene tolto dalla lista di quelli possibili...

Avremo una condizione iniziale che contempla 4 possibilità casuali, che diventano 3, 2, 1, e dopo determini il passaggio al livello sucessivo.

Vediamo se switch è indicato...

Codice:
//pseudocodice, da modificare!!!


//in create
n_rett=livello*4 //a livello 1 sono 4 ^_^
iterazione=0;

//in step
rett_attivo=round(random(n_rett-iterazione));

switch (rett_attivo){

case 1:
//disegna rett1
//if clicckato=1 iterazione+=1;
break;

case 2:
//disegna rett2
//if clicckato=1 iterazione+=1;
break;

case 3:
//disegna rett3
//if clicckato=1 iterazione+=1;
break;

case 4:
//disegna rett4
//if clicckato=1 iterazione+=1;
break;

}


Ovviamente questo sistema funziona solo con un numero fisso di elementi... Forse adattando questo sistema in un ciclo while che si conclude con n_rett=iterazione ci avviciniamo alla soluzione...


Bak IV ha scritto:
Riflettendoci... non è così semplice come mi sembrava a prima vista!  Lol

Ho preparato un piccolo demo per metterti sulla buona strada:

http://gm6guide.altervista.org/src/simon_v1.gm6

Lo schermo si aggiorna al rilascio della barra spaziatrice, pgup e pgdown modificano il livello (e quindi il numero di riquadri)... per trasformarlo in un gioco vero vanno aggiunte ancora molte parti:

-il rilevamento della posizione del mouse nell'area del riquadro
-il timer che determina il tempo di apparizione e scomparsa dei riquadri
-un sistema di esclusione per impedire che lo stesso riquadro possa apparire più di una volta per livello...


freeflip ha scritto:
Bene bene, adesso ci lavoro su un po' e vedo cosa riesco ad ottenere Biggrin





Questo messaggio stato modificato: 05-26-2007 01:02 PM da Bak IV.

05-26-2007 01:01 PM
Visita sito dell'autore trova tutti i messaggi dell'autore
Discussione chiusa  Scrivi discussione 

Guarda in versione stampabile
Invia la discussione a un amico
Sottoscrivi la discussione | Aggiungi discussione alle favorite

Salta al Forum: