Gioco Mosaico tipo puzzle

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Lordfef
Membro
Messaggi: 134
Iscritto il: 30/07/2012, 7:03
Contatta:

Gioco Mosaico tipo puzzle

Messaggio da Lordfef »

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

Lordfef
Membro
Messaggi: 134
Iscritto il: 30/07/2012, 7:03
Contatta:

Re: Gioco Mosaico tipo puzzle

Messaggio da Lordfef »

La surface...questa ignota :fapensare:

Ok grazie della dritta, me la vado a studiare :manual:

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 :spat: )

Grazie anticipatamente

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Gioco Mosaico tipo puzzle

Messaggio da gameplay_extreme »

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:

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 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 :mrgreen: )

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.
Immagine
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
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

spriters2000
Membro attivo
Messaggi: 431
Iscritto il: 29/07/2011, 12:04
Specialità: Programmazione
Contatta:

Re: Gioco Mosaico tipo puzzle

Messaggio da spriters2000 »

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;
}

Avatar utente
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

Messaggio da torchipeppo »

Io ho un esempio che lo fa relativo (se fai così piazza subito l'origine, invece questo usa due variabili offset per farlo relativo):

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
Mettilo nell'object che deve essere draggato. Se più istanze sono sovrapposte, ne viene spostata solo una.
Il mio progetto attuale:
Spoiler
Traduzione del manuale GM8.1
I miei giochi su GMI:
Spoiler
  • Super Character Pong
  • Bug's Cave
  • Space: 9999

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Gioco Mosaico tipo puzzle

Messaggio da gameplay_extreme »

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
:cappa:

Edit:

Ho fatto una prova: come farei io a creare un picture puzzle (mediante il codice di tochipeppo)
Spoiler

Codice: Seleziona tutto

Information about object: oCas

Sprite: sCas
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

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

image_xscale = global.xdim
image_yscale = global.ydim




 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
}
}


 




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 Glob Left Released:
execute code:

//global.left release event
Drag=false



Draw Event:
execute code:

draw_sprite_part(sFoto,0,left,top,global.xdim,global.ydim,x,y)

if !(x > left - 10 &&  x < left + 10  &&  y > top - 10 && y < top + 10)
 global.vinto = false

______________________________________________________

Information about object: oInvis

Sprite: <no sprite>
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

Create Event:
execute code:

num_col = 3
num_ri = 2
num_ri = get_integer("righe = ",2)
num_col = get_integer("colonne = ",3)
if num_ri = 0 || num_col = 0
 {
  show_message("dati inseriti non validi")
  game_restart()
  exit
 }
global.xdim = sprite_get_width(sFoto) div num_col
global.ydim = sprite_get_height(sFoto) div num_ri

for (k=0;k<=num_col-1; k += 1)
 for (k2=0;k2<=num_ri-1; k2 += 1)
 {
  inst = instance_create(random(room_width),random(room_height),oCas)
  inst.left = k*global.xdim
  inst.top =  k2*global.ydim
 }
fatto = false


 Step Event:
execute code:

if global.vinto = true && fatto = false
 {
  show_message("Hai vinto!!")
  with (all) Drag = false
  fatto = true
 }
global.vinto = true


Draw Event:
execute code:

draw_set_color(c_black)
for (k=0;k<=num_col-1; k += 1)
 for (k2=0;k2<=num_ri-1; k2 += 1)
 {
   draw_rectangle(k*global.xdim,k2*global.ydim,k*global.xdim+global.xdim,k2*global.ydim+global.ydim,true)
 }


Key Press Event for R-key Key:
execute code:

game_restart()

______________________________________________________
PS: l'oggetto oCas deve avere una sprite 1x1

PPS: testato: funziona

:cappa:
Immagine
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
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: Gioco Mosaico tipo puzzle

Messaggio da sfigatto »

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
}
}

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 154 ospiti