Ciao a tutti, stavo pensando a un mini-game all'interno della mia app principale.
L'idea è quella di prendere una foto, spezzarla in 6 parti e permettere all'utente mediante drag&drop di ricomporre il puzzle.
Mi chiedevo se non ci fosse già in giro un esempio da studiare senza dover partire da punto a capo.
Grazie, saluti
Gioco Mosaico tipo puzzle
Re: Gioco Mosaico tipo puzzle
La surface...questa ignota
Ok grazie della dritta, me la vado a studiare
Per il Drag&Drop avete qualche esempio al volo? (Ricordo di aver visto un gioco di carte tipo il solitario di Windows, ma non ricordo più dove )
Grazie anticipatamente
Ok grazie della dritta, me la vado a studiare
Per il Drag&Drop avete qualche esempio al volo? (Ricordo di aver visto un gioco di carte tipo il solitario di Windows, ma non ricordo più dove )
Grazie anticipatamente
- gameplay_extreme
- GMI VIP
- Messaggi: 3824
- Iscritto il: 13/11/2010, 16:23
- Uso: GM:Studio 2
- Contatta:
Re: Gioco Mosaico tipo puzzle
in "mr.Onion" e in "Haunted Hause" ho usato draw_sprite_part.
Praticamene vengono create tante istanze dell'oggetto oCasella (a ricoprire tutta l'area di immagine) e per ogni istanza viene:
1) specificato quale parte della immagine deve visualizzare (ancora le caselle non sono mescolate)
2) marchiata con un numero "num" (questi numeri sono crescenti e analizzandone la posizione si può capire se l'immagine è stata ricomposta correttamente)
3) memorizzato l'id in un array bidimensionale "m"
poi le caselle venivano mescolate,
basta fare una cosa tipo:
a questo punto sono mescolate, notare che non è che si spostano relamente di posto ma si scambiano il contenuto delle variabili (o per lo meno il sistema che ho ideato io funziona così...)
a questo punto quando il giocatore clicca su una casella basta usare mouse_x, mouse_y e si può determinare la colonna e la riga della casella. Quando il giocatore clicca su una seconda casella con medesimo calcolo si trova colonna2 e riga2. Infine Usil'algoritmo dello scambio (devi scambiare le variabili dell'istanza che ha come id m[colonna,riga] con le variabili dell'istanza che ha come id m[colonna2,riga2]) e voila...le due caselle che il giocatore ha selezionato invertono la posizione tra di loro (anche se come ho detto prima non è che si scambiano realmente di posto)).
Ogni volta che c'è uno scambio devi anche controllare se num parte da 1 (rpima casella in alto a sinistra) e va a finire ORDINATAMENTE a 9 (ultima casella a destra), se è cosi il giocatore a vinto (o il programmatore si è dimenticato di mescolare le caselle )
almeno io ho fatto così...
Edit: questo sistema non prevede il trascinamento ma solo lo scambio delle caselle (va beh forse dovrei chiamarli pezzi?) mediante dei click.
Praticamene vengono create tante istanze dell'oggetto oCasella (a ricoprire tutta l'area di immagine) e per ogni istanza viene:
1) specificato quale parte della immagine deve visualizzare (ancora le caselle non sono mescolate)
2) marchiata con un numero "num" (questi numeri sono crescenti e analizzandone la posizione si può capire se l'immagine è stata ricomposta correttamente)
3) memorizzato l'id in un array bidimensionale "m"
poi le caselle venivano mescolate,
basta fare una cosa tipo:
Codice: Seleziona tutto
repeat(50)
{
x1 = random_range(0,num_col-1)
x2 = random_range(0,num_col-1)
y1 = random_range(0,num_ri-1)
y2 = random_range(0,num_ri-1)
//poi metti le istruzioni che scambiano le variabili dell'istanza che ha come id m[x1,y1] con quelle dell'istanza che ha come id m[x2,y2]
}
a questo punto quando il giocatore clicca su una casella basta usare mouse_x, mouse_y e si può determinare la colonna e la riga della casella. Quando il giocatore clicca su una seconda casella con medesimo calcolo si trova colonna2 e riga2. Infine Usil'algoritmo dello scambio (devi scambiare le variabili dell'istanza che ha come id m[colonna,riga] con le variabili dell'istanza che ha come id m[colonna2,riga2]) e voila...le due caselle che il giocatore ha selezionato invertono la posizione tra di loro (anche se come ho detto prima non è che si scambiano realmente di posto)).
Ogni volta che c'è uno scambio devi anche controllare se num parte da 1 (rpima casella in alto a sinistra) e va a finire ORDINATAMENTE a 9 (ultima casella a destra), se è cosi il giocatore a vinto (o il programmatore si è dimenticato di mescolare le caselle )
almeno io ho fatto così...
Edit: questo sistema non prevede il trascinamento ma solo lo scambio delle caselle (va beh forse dovrei chiamarli pezzi?) mediante dei click.
Ultima modifica di gameplay_extreme il 17/11/2012, 18:09, modificato 3 volte in totale.
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!
iscriviti qui gratuitamente a GMI !
Spoiler
-
- Membro attivo
- Messaggi: 431
- Iscritto il: 29/07/2011, 12:04
- Specialità: Programmazione
- Contatta:
Re: Gioco Mosaico tipo puzzle
evento pressione dito (se non basta questo per capirlo, non ho game maker studio) :
drag=true
evento rilascio dito:
drag=false
step:
if(drag=true) {
x=mouse_x;
y=mouse_y;
}
drag=true
evento rilascio dito:
drag=false
step:
if(drag=true) {
x=mouse_x;
y=mouse_y;
}
- torchipeppo
- Membro
- Messaggi: 215
- Iscritto il: 01/06/2011, 17:32
- Specialità: Teoria e Manuali
- Uso: GameMaker 8
- Località: Da qualche parte...
- Contatta:
Re: Gioco Mosaico tipo puzzle
Io ho un esempio che lo fa relativo (se fai così piazza subito l'origine, invece questo usa due variabili offset per farlo relativo):
Mettilo nell'object che deve essere draggato. Se più istanze sono sovrapposte, ne viene spostata solo una.
Codice: Seleziona tutto
Create Event:
execute code:
//this is for create event only
Drag=false//this switches the object "on and off" basicaly
Mouse_Offset_X=0//used to calculate the offset of the mouse click to object for X
Mouse_Offset_Y=0//used to calculate the offset of the mouse click to object for Y
global.myid=id//used to grab the instance id of the object directly under mouse pointer
Step Event:
execute code:
with(global.myid)//with the object directly under mouse pointer
{
if(Drag=true)//if the object has been clicked (is "on")
{
x=mouse_x-Mouse_Offset_X//object's X = offset of obj.x & mouse_x
y=mouse_y-Mouse_Offset_Y//object's Y = offset of obj.y & mouse_y
}
}
Mouse Event for Left Pressed:
execute code:
with(all)//you can put whatever you want to check for in this, not just "all"
{
if(position_meeting(mouse_x,mouse_y,self)
)//checks for obj directly under mouse
{
global.myid=self.id;//sets the global var to the id of instance under mouse
Drag=true;// turns "Drag" on making the obj dragable by the mouse
Mouse_Offset_X=mouse_x-x;//moves object to the mouse_x possition
Mouse_Offset_Y=mouse_y-y;//moves object to the mouse_y possition
}
}
Mouse Event for Left Released:
execute code:
//global.left release event
Drag=false
Il mio progetto attuale:
Spoiler
I miei giochi su GMI:
Spoiler
- gameplay_extreme
- GMI VIP
- Messaggi: 3824
- Iscritto il: 13/11/2010, 16:23
- Uso: GM:Studio 2
- Contatta:
Re: Gioco Mosaico tipo puzzle
Step Event:
execute code:
with(global.myid)//with the object directly under mouse pointer
{
if(Drag=true)//if the object has been clicked (is "on")
{
with (all) depth = 0
depth = -999
x=mouse_x-Mouse_Offset_X//object's X = offset of obj.x & mouse_x
y=mouse_y-Mouse_Offset_Y//object's Y = offset of obj.y & mouse_y
}
}
Aggiungendo la parte in grassetto, se si seleziona un tassello che è rimasto parzialmente coperto va automaticamente in primo piano
Edit:
Ho fatto una prova: come farei io a creare un picture puzzle (mediante il codice di tochipeppo)
PPS: testato: funziona
execute code:
with(global.myid)//with the object directly under mouse pointer
{
if(Drag=true)//if the object has been clicked (is "on")
{
with (all) depth = 0
depth = -999
x=mouse_x-Mouse_Offset_X//object's X = offset of obj.x & mouse_x
y=mouse_y-Mouse_Offset_Y//object's Y = offset of obj.y & mouse_y
}
}
Aggiungendo la parte in grassetto, se si seleziona un tassello che è rimasto parzialmente coperto va automaticamente in primo piano
Edit:
Ho fatto una prova: come farei io a creare un picture puzzle (mediante il codice di tochipeppo)
Spoiler
PS: l'oggetto oCas deve avere una sprite 1x1
PPS: testato: funziona
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!
iscriviti qui gratuitamente a GMI !
Spoiler
Re: Gioco Mosaico tipo puzzle
Scusate, se io volessi usare il codice per draggare gli oggetti di questa discussione, come posso modificarlo in maniera che il "draggamento" sia limitato ad una certa parte dello schermo?
Per esempio tenendo premuto il pulsante del mouse e draggando l'oggetto, poniamo oltre y<=200, il mouse deve perdere la capacità di draggare l'oggetto. In tutti i tentativi che ho fatto una volta che l'oggetto viene preso dal mouse l'oggetto non si stacca una volta superata la linea dei 200.
questo è solo uno dei tanti tentativi che ho fatto agendo sullo step event:
with(global.myid)//with the object directly under mouse pointer
{
if (y>=200) && (Drag=true)//if the object has been clicked (is "on")
{
with (all) depth = 0
depth = -999
x=mouse_x-Mouse_Offset_X//object's X = offset of obj.x & mouse_x
y=mouse_y-Mouse_Offset_Y//object's Y = offset of obj.y & mouse_y
}
}
Per esempio tenendo premuto il pulsante del mouse e draggando l'oggetto, poniamo oltre y<=200, il mouse deve perdere la capacità di draggare l'oggetto. In tutti i tentativi che ho fatto una volta che l'oggetto viene preso dal mouse l'oggetto non si stacca una volta superata la linea dei 200.
questo è solo uno dei tanti tentativi che ho fatto agendo sullo step event:
with(global.myid)//with the object directly under mouse pointer
{
if (y>=200) && (Drag=true)//if the object has been clicked (is "on")
{
with (all) depth = 0
depth = -999
x=mouse_x-Mouse_Offset_X//object's X = offset of obj.x & mouse_x
y=mouse_y-Mouse_Offset_Y//object's Y = offset of obj.y & mouse_y
}
}
Chi c’è in linea
Visitano il forum: Nessuno e 154 ospiti