Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Spostare più oggetti singoli (carte da gioco) contemporaneamente
mercoledì 07 aprile 2010 - 21.43
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Cocci
Profilo
| Newbie
3
messaggi | Data Invio:
mer 7 apr 2010 - 21:43
Ciao a tutti.
Sto creando il gioco della scala 40 e gradirei dei consigli su un problema che è sorto.
Ho l'oggetto grafico CTRCARTA che non è nient'altro che una classe derivata da control che disegna un'immagine. Su questa classe ho implementato i vari movimenti come si vedono nei giochi tipo solitario: seleziona la carta, sposta la carta, ecc..
Di per se UNA istanza di questo oggetto va benissimo, una carta si sposta senza problemi; ma se volessi implementare lo spostamento di più carte contemporaneamente? Il click sulla carta sposta quella carta precisa, e quindi pensavo a qualcosa che wrappasse quella classe e che mi facesse propagare gli eventi in cascata.
Pensavo (non so se è l'idea giusta) di ereditare dalla classe CtrCarta una che avesse come campo una lista di carte, solo che non saprei come fare in modo di scatenare gli eventi di pressione del mouse per farli poi propagare sulle carte.
A qualcuno viene in mente qualche idea?
grazie
Max
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
gio 8 apr 2010 - 12:45
Ciao
immaginiamo che hai un oggetto che contiene l'elenco delle tue carte da gioco e in questo oggetto hai un evento:
public event SpostaTutteLeCarte(sender as object, e as EventArgs)
o in c#
public event EventHandler SpostaTutteLeCarte;
quello che vuoi fare è invocare per ogni carta l'evento sposta singolo se si invoca l'evento spostatutte:
public sub SpostaTutte(sender as object, e as EventArgs) Handle SpostaTutteLeCarte
for each c as carta in me.Carte
c.spostasingola(sender,e)
end for
end sub
in c#
public void SpostaTutte(object sender, EventArgs e)
{
foreach (carta c in me.Carte)
{
c.spostasingola(sender,e);
}
}
spero di essere stato chiaro
altrimenti scrivi pure
ciao
Antonio Esposito
MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
shaolin
Profilo
| Newbie
23
messaggi | Data Invio:
gio 8 apr 2010 - 13:28
Ciao Antonio, grazie per la risposta.
Il problema è che lo spostamento della carta avviene tramite gli eventi sul mouse:
protected override void OnMouseDown(MouseEventArgs e)
protected override void OnMouseMove(MouseEventArgs e)
protected override void OnMouseUp(MouseEventArgs e)
Ti viene in mente un modo per associare questo alla tua idea dell'evento?
Grazie ancora
Max
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
gio 8 apr 2010 - 14:00
ciao
puoi usare uno di quegli eventi per ciclare con il foreach tra tutte le carte che hai
Antonio Esposito
MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
shaolin
Profilo
| Newbie
23
messaggi | Data Invio:
gio 8 apr 2010 - 14:29
Scusa, forse non mi sono spiegato bene.
Quegli eventi sono nella classe CARTA che rappresenta una singola carta, non ho una lista; quella ce l'ho (almeno per ora) in una classe derivata da carta.
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
gio 8 apr 2010 - 15:53
uhm... vediamo se ho capito, altrimenti spiegami meglio:
tu hai una classe carta, poi hai una nuova classe che eredita da carta chiamiamola carta2, in carta2 hai una lista?
oppure: hai una classe carta, li hai una proprietà che punta ad una seconda classe in cui c'è un elenco?
Antonio Esposito
MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
shaolin
Profilo
| Newbie
23
messaggi | Data Invio:
gio 8 apr 2010 - 16:02
Esatta la prima. La classe "ctrCarta" è la rappresentazione grafica di una carta e la seconda classe ctrSetCarte è ereditata (anche se forse in questo caso non ha molto senso) da "ctrCarta".
Cosa succede?
Quando clicco su una carta si attivano gli eventi per il mouse di cui sopra riferiti alla classe "ctrCarta", questo è ovvio.
Il mio intento sarebbe quello di poter generare prima un evento su CtrSetCarte in modo da poter ciclare su ogni carta e richiamare in cascata gli eventi del mouse di ogni singola carta.
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
ven 9 apr 2010 - 09:47
ciao
in effetti non vedo la necessità di ereditare da quella classe,
se fossi in te magari conserverei l'elenco fuori dalla classe stessa, nel form o nella pagina (a seconda di dove ti trovi) in un posto accessibile da ognuna di quelle classi, così da poter iterare nel modo che ti ho descritto
Antonio Esposito
MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
shaolin
Profilo
| Newbie
23
messaggi | Data Invio:
ven 9 apr 2010 - 12:08
Grazie, è un'ottima idea. In questo modo la classe CtrSetCarte non ha più necessità di esistere e controllo il gruppo di carte direttamente dalla form.
Cosa ne pensi se propagassi gli eventi MouseDown/Up/Move anche nella form in modo che quando faccio un click sul controllo anche la form ne sia a conoscenza e possa gestire la situazione?
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
ven 9 apr 2010 - 13:58
ciao
puoi farlo, ma ansicchè propagare l'evento e lasciarlo in gestione alla carta, dovresti collegare l'evento di tutte le carte presenti sempre allo stesso evento di pagina che le gestirà sempre tutte insieme.
se le carte sono dinamiche come immagino, dovresti usare qualcosa tipo:
for each c as carta in carte
AddHandler c.Click, AddressOf GestisciIlClickDiTutteLeCarte
Antonio Esposito
MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
Cocci
Profilo
| Newbie
3
messaggi | Data Invio:
gio 15 apr 2010 - 21:58
Alla fine ho creato degli eventi sul mouse da utilizzare direttamente nella form e così ho il pieno controllo.
grazie per l'aiuto.
Max
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !