Spostare più oggetti singoli (carte da gioco) contemporaneamente

mercoledì 07 aprile 2010 - 21.43

Cocci Profilo | Newbie

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

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

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

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

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

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

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



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

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


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

Alla fine ho creato degli eventi sul mouse da utilizzare direttamente nella form e così ho il pieno controllo.
grazie per l'aiuto.
Max
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 !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5