Newsgroup: it.comp.lang.visual-basic
Titolo: Giochi di carte...

Salve a tutto l'NG... VOlevo sapere se qualcuno sa come fanno i 
programmi dei giochi di carte (come il solitario di Win) a permettere 
all'utente di trascinare una carta.
Io avevo pensato a sfruttare gli eventi mouse_down e mouse_move per 
spostare letteralmente la picturebox su cui è disegnata la carta in 
questione, o addirittura di creare un form in run-time su cui disegnare 
la carta su cui ho cliccato e spostare il form sfruttando i movimenti 
del mouse (magari con un bel SetCapture). Il problema però è questo: 
come faccio a sfruttare gli eventi che si genererebbero se invece 
sfruttasi il drag'n'drop? Con quel metodo è possibile capire dove sto 
trascinando la carta e dove l'ho lasciata. Sfruttando solo il movimento 
di un form (spostandono in runtime) non si generano eventi perchè un 
form che passa su una picturebox non genera alcun evento (ovviamente).
Più che altro, avreste consigli da darmi?
Il problema mio principale è capire dove ho trascinato il form con su 
disegnata la carta... anche perchè sfrutterò due form di gioco: uno su 
cui si trovano le carte da gioco dei giocatori, e l'altro su cui 
finiranno gli scarti.
Idee? Thx in anticipo!

Io farei tutto in un form. Ti risparmi molti casini.
Al massimo puoi creare un array di valori dove salvi quali carte stai
spostando in quel momento...
ma non mi sembra una buona idea...
Il consiglio è quello di creare un solo form e sfruttare il mousemove.
bye
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
www.nicolaottomano.it

 Idee? Thx in anticipo!
Mhhh, l'idea di form separati forse non è la più semplice.
Se invece usi oggetti come le picturebox all'interno dello stesso form puoi
usare questo codice che gestisce il trascinamento e rileva la collisione tra
picturebox basandosi sulle coordinate e gli eventi del mouse.
Il codice è spartano inefficiente, ma dovrebbe funzionare.
Per provarlo crea semplicemente due picturebox in una form e poi usa il
mouse per trascinare una sull'altra
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
If Button = 1 Then
    Picture1.Left = Picture1.Left + (x)
    Picture1.Top = Picture1.Top + (y)
End If
End Sub
Private Sub Picture2_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
If Button = 1 Then
    Picture2.Left = Picture2.Left + (x)
    Picture2.Top = Picture2.Top + (y)
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As
Single, y As Single)
If sovrapposta(Picture1, Picture2) Then
    MsgBox "picture1 droppata su picture2"
End If
End Sub
Private Sub Picture2_MouseUp(Button As Integer, Shift As Integer, x As
Single, y As Single)
If sovrapposta(Picture1, Picture2) Then
    MsgBox "picture1 droppata su picture2"
End If
End Sub
Function sovrapposta(p1 As PictureBox, p2 As PictureBox)
Dim x, y, rx1, rx2, rx3, rx4, ry1, ry2, ry3, ry4
rx1 = p2.Left
rx2 = rx1 + p2.Width
rx3 = rx2
rx4 = rx1
ry1 = p2.Top
ry2 = ry1
ry3 = ry1 + p2.Height
ry4 = ry3
x = p1.Left
y = p1.Top
If puntoInRettangolo(x, y, rx1, ry1, rx2, ry2, rx3, ry3, rx4, ry4) Then
sovrapposta = True: Exit Function
x = p1.Left + p1.Width
y = p1.Top
If puntoInRettangolo(x, y, rx1, ry1, rx2, ry2, rx3, ry3, rx4, ry4) Then sovr
apposta = True: Exit Function
x = p1.Left + p1.Width
y = p1.Top + p1.Height
If puntoInRettangolo(x, y, rx1, ry1, rx2, ry2, rx3, ry3, rx4, ry4) Then
sovrapposta = True: Exit Function
x = p1.Left
y = p1.Top + p1.Height
If puntoInRettangolo(x, y, rx1, ry1, rx2, ry2, rx3, ry3, rx4, ry4) Then
sovrapposta = True: Exit Function
sovrapposta = False
End Function
Function puntoInRettangolo(x, y, rx1, ry1, rx2, ry2, rx3, ry3, rx4, ry4) As
Boolean
puntoInRettangolo = False
If x > rx2 Then Exit Function
If x < rx1 Then Exit Function
If y < ry1 Then Exit Function
If y > ry3 Then Exit Function
puntoInRettangolo = True
End Function
termoPilucco

> Io farei tutto in un form. Ti risparmi molti casini.
Si sarebbe cosa buona e giusta, ma tieni conto che voglio fare la Scala 
40. Ora... ogni giocatore ha le sue belle 13 carte (più la pescata e son 
14). Quindi devo avere spazio per un massimo di 14 carte ciascuno.
Poi... ogni giocatore mette per terra i suoi scarti, a cui possono 
aggiungere altre carte gli altri giocatori, e quindi le carte scartate 
da ogni giocatore possono aumentare aggiungendoci altri scarti... e lo 
spazio su un form non è più necessario.
Quindi mi tocca per forza sfruttare un form per le carte possedute dai 
giocatori e un altro per metterci i punti messi per terra. Il problema 
non è tanto questo, quanto lo spostamento della carta... ma come cavolo 
fanno gli altri giochi? Ho scaricato un plugin per firefox 0.8 in cui ci 
sono i giochi di carte, e pure quelli hanno le carte che si muovono a 
botta di click

Allora... ti ringrazio per il suggerimento.
Effettivamente questa soluzione in parte è venuta in mente anche a me.
Ho pensato di risolvere così:
- Creo due form, uno per le carte possedute dai players e l'altro con i 
punti scartati;
- Sfrutto il mousedown sulle varie carte (o sugli user control che 
presto creerò per avere l'oggetto grafico "carta") e trascino una 
picture box da un forma all'altro (presto posterò del codice sul sito 
comune), infatti ho smanettato e la cosa è abbastanza semplice, non ci 
vuole molto.
Ho intenzione di sfruttare una picture box standalone per simulare la 
carta in trascinamento da un form all'altro. Quindi non ci sn problemi 
per questo.
Poi m'è venuto in capa di utilizzare funzioni tipo quelle che mi hai 
suggerito tu: per ora ho fatto la funzione IsInForm(ByVal X as Long, 
ByVal Y as Long, ByRef F as Form) as Boolean che mi restituisce VERO se 
le coordinate del punto (in twips) passate sono interne al form passato 
per riferimento.
Questo è il codice di esempio:
http://digilander.iol.it/darkbytes/provadrg.rar
E' rudimentale per ora ma nel contesto l'idea è questa.
Poi per controllare dove rilascio la carta penso sarà più o meno la 
stessa cosa: con delle funzioni di supporto controllo la posizione del 
left-top corner della picture box nel form relativo, e da lì decido cosa 
fare...
Suggerimenti per migliorare la cosa?
Thx in anticipo cmq a tutti :)

E se crei un solo form con due frame uno sovrapposto all'altro e visualizzi
quello che serve al momento?


 bye
bye...

> No perchè l'idea di un solo form sarebbe la soluzione ideale...
Premetto che non so giocare a scala quaranta..
Comunque lo spazio su schermo per creare un form grande è lo stesso che per
creare due form piccoli...


 creare due form piccoli...
Beh se le finestre diventano leggermente sovrapposte no... e poi non so 
se hai visto l'esempio che ho pubblicato. Piů sotto, in questo thread, 
ho postato a termopilucco la mia risposta ad un suo suggerimento, e lě 
trovi un link ad una cosa che ho fatto in vb come primo approccio a 
questo problema.
In quel modo lo spazio si risparmia, perň non so ancora se č la 
soluzione migliore...


Ho visto l'esempio e devo dire che il passaggio tra i due form
(graficamente) non mi piace.
Resto sempre dell'idea di creare un unico form e su quello fai i vari
passaggi.
Perň č chiaro che "de gustibus"...


 passaggi.
Si è verissimo quello che dici, ma non riesco ancora a capire dove trovo 
tutto lo spazio necessario per piazzare su un solo form tutto quello che 
mi serve...
Tornando alla tua idea dei due frame... potrei anche usare due grandi 
picture box resizabili in fase di esecuzione, ma come permettere 
all'utente di vedere una o l'altra mentre sta trascinando la carta?
Uhm.......
Forse quando mi trovo nella seconda zona potrei fare uno zoom......
Non mi avrai capito di sicuro in quest'ultimo punto, ma l'idea mi sta 
scendendo giù dalla cima dei capelli verso il cervello... forse fra un 
po' posto un'altro esempio....

 po' posto un'altro esempio....    
...ed eccolo qui:
http://darkbyte.supereva.it/provadrg2.rar
Forse cosě va meglio... ripeto, anche questa č solo una bozza, ma per 
fare l'esempio va bene.

 fare l'esempio va bene.
Già va meglio.
La mia idea era questa invece:
www.nicolaottomano.it/provadrg.zip


 bye
bye e thx ancora :)

Io purtroppo (ripeto) non conosco la scala quaranta, quindi non saprei come
consigliarti al meglio.
Se è simile al burraco (è un misto tra scala quaranta e canasta) credo che
la mia soluzione non sia male, poi è chiaro che in base alle esigenze ci si
regola.
buon lavoro. :-)


 bye
Salut!

 misto tra scala 40 e canasta? :)
Perchè me l'ha detto molta gente che conosce entrambi i giochi... :-)


ma perchè non usi un programmino gia' esistente, io lo uso per giocare
a burraco  online e ti dirò che siamo in tanti e non ci troviamo
affatto male, facci una visitina su msn groups...insieme per giocare 
troverai tutte le istruzioni del caso...ciao Peter


Cioè? In che senso? La scala 40 già pronta? O un componente installato 
con i giochi di msn? Che intendi?
Se intendi la scala 40 già pronta, scusa a 'sto punto nessuno farebbe + 
nessuna cosa per hobby in programmazione perchè tanto esiste già 
qualcosa di funzionante in giro :)
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque.
(Michael Corleone)