Oppure

Loading
25/06/21 16:07
Thejuster
Per quanto riguarda l'indicizzazione della carta, basta inserire una proprietà di tipo int.
esattamente come dici IDCarta , però, credo sia sempre meglio utilizzare una Lista.
Gli array sono poco affidabili da sempre. Basta un indice sbagliato per avere un crash.
cosa che con le liste non accade.

Con una lista è anche più semplice recuperare un elemento anche perché sono già indicizzati.
Al click avendo già l'object (sender) che prende il tipo dalla carta stessa:


List<Carta> carte = new List<Carta>(); //Lista esempio

 private void C_OnCardClick(object sender, CardEventArgs e)
 {

Carta c = (Carta)sender;
var card = carte.Where(x => x.Numero == c.Numero && x.SemeCarta == c.SemeCarta).FirstOrDefault();
carte.Remove(card);

}



la var card è di tipo Carta quindi contiene già tutte le informazioni al riguardo della carta che viene cliccata. ( Numero e Seme)

si può in seguito decidere di eliminarla esempio dal deck, o dal tavolo.

Certo, Io al momento mi sto concentrando sulla parte grafica
(Classe Carta, Controlli Vari,e Tavolo)

Riguardo alla carta coperta, Posso impostare un bool di default su false
False = Scoperta
True = Coperta

Cmq mi piace molto per ora.
Il tuo sistema mi garba molto con la ListView. Soprattutto le carte le vedo di una maggiore qualità.


Ultima modifica effettuata da Thejuster 25/06/21 18:43
mire.forumfree.it/ - Mire Engine
C# UI Designer
28/06/21 15:57
Thejuster
osservando la prima bozza che avevi fatto, ho implementato un piccolo controllo per selezionare le carte
con una semplice animazione di colorazione del bordo

Giusto un test, per eseguire le scelte.
Magari se è troppo piccolo possiamo ridimensionarlo aggiungendo misure diverse e spostando gli offest di 2px

Avevo pensato di farlo apparire come un classico popup e con un piccolo ma efficace effetto grafico.
ovvero oscurare leggermente tutto il tavolo in modo da far risaltare agli occhi la scelta da fare.

Esempio:

recordit.co/…
Ultima modifica effettuata da Thejuster 28/06/21 18:38
mire.forumfree.it/ - Mire Engine
C# UI Designer
28/06/21 20:00
Thejuster
Riguardo al Log SVN ti riporto qui eventuali modifiche e magari future implementazioni.

Classe Astratta Popup che ci sarà utile in molti casi, ora spiego come

in questo esempio:

 class DialogoScelta : Popup
    {

        Control c;
        Theme.ThemeBase _parent;

        public DialogoScelta(Control parent) : base(parent)
        {
            c = parent;
            base.Parent = parent;

        }


        public override void AddControl(Control control)
        {
            c = (Controllo_Scelta)control;
            control.Location = new System.Drawing.Point((base.Width / 2) - 100, Controls.Count + 1 * 50);

            base.AddControl(control);            
        }


    }

//---------------------------------------------------
// In Un'altro Form o classe differente
//ESEMPIO DI IMPLEMENTAZIONE


        private void button1_Click(object sender, EventArgs e)
        {
          

            //Creo un Controllo Scelta
            Controllo_Scelta s = new Controllo_Scelta();

            //Aggiungo delle carte
            s.AddCard(new Carta(Carta.Tipo.Bastoni, 5));
            s.AddCard(new Carta(Carta.Tipo.Denari, 7));
            s.AddCard(new Carta(Carta.Tipo.Spade, 7));

            //Creo il Dialogo Modale della Scelta
            DialogoScelta dlg = new DialogoScelta(themeBase1);

            //Aggiungo al dialogo il controllo
            dlg.AddControl(s);

            //Eseguo il Dialogo
            dlg.Exec();
            
        }




Ho implementato un Dialogo Modale partendo dalla base della classe astratta Popup in modo da poterla riutilizzare nel caso servisse in un uso successivo. tipo "Vincitore della partita" o un semplice messaggio.

si popola in modo molto semplice


recordit.co/…

Ultima modifica effettuata da Thejuster 28/06/21 20:02
mire.forumfree.it/ - Mire Engine
C# UI Designer
30/06/21 8:40
Thejuster
Ok Carlo, la scelta è completata.
Non vorrei fare casini nel tuo sorgente.
quindi ti spiego qui come funziona ed eventuali modifiche da apportare.


Dunque Si crea la variabile alla classe DialogoScelta in modo globale.

Al click della carta da giocare:
Poniamo esempio che si gioca il fante di bastoni

{
 private void C_OnCardClick(object sender, CardEventArgs e)
        {
            //Creo il Dialogo Modale della Scelta
            dlg = new DialogoScelta(themeBase1, (Carta)sender); //Tavolo e Carta Giocata

            //Creo un Controllo Scelta
            Controllo_Scelta s = new Controllo_Scelta();
            s.AddCard(new Carta(Carta.Tipo.Denari, 2));
            s.AddCard(new Carta(Carta.Tipo.Spade, 6));      
            dlg.AddControl(s);


            //Aggiungo altra eventuale Scelta
            s = new Controllo_Scelta();
            s.AddCard(new Carta(Carta.Tipo.Coppe, 2));
            s.AddCard(new Carta(Carta.Tipo.Spade, 4));
            s.AddCard(new Carta(Carta.Tipo.Denari, 2));
            dlg.AddControl(s);

            //Creo relativo evento di conferma
            dlg.OnSceltaConfermata += Dlg_OnSceltaConfermata;

            //Eseguo il Dialogo
            dlg.Exec();
        }

        private void Dlg_OnSceltaConfermata(Controllo_Scelta scelta)
        {
            string cartescelte = "";

            for(int i = 0; i < scelta.Carte.Count; i++)
            {
                cartescelte = cartescelte + $"[ {scelta.Carte[i].Numero} - {scelta.Carte[i].SemeCarta} ] , ";
            }

            MessageBox.Show(cartescelte);

            dlg.Dispose();
        }





Puoi trovare l'esempio nel form_di_esempio

recordit.co/…

Il Dialogo è Modale, non va a disturbare gli altri controlli quindi viene visualizzato solo in quell'occasione.
Ma bisogna dopo rilasciare la risorsa.
Ultima modifica effettuata da Thejuster 30/06/21 8:42
mire.forumfree.it/ - Mire Engine
C# UI Designer
01/07/21 8:48
Carlo
Ho fatto un commit, con implementato il tuo DialogoScelta, è solo una prova, va messo in una sub, e la lista delle carte possibili da scegliere, vanno in una lista, invece che in un elenco testo diviso da punti e virgola.
Codice da riga 277 a riga 311

Perplessità, se uso themeBase1 come sfondo con i controlli sopra, tutto è mooolto rallentato.

Il DialogoScelta credevo che si aprisse in un dialog modale separato, non succede perché ho rimosso themeBase1 ?

Visto che quando creo dlg passo anche la carta giocata:
dlg = new DialogoScelta(this, cartaGiocatore); //Tavolo e Carta Giocata

dovrebbe essere automaticamente mostrata da un lato delle possibili scelte a dimensione intera (una copia visto che poi viene eliminata).
Ultima modifica effettuata da Carlo 01/07/21 9:33
in programmazione tutto è permesso
01/07/21 13:06
Thejuster
Quel tipo di dialogo che ho creato, non è un form che va ad aprirsi.
E un controllo che va ad occupare momentaneamente la parte dell'oggetto che lo chiama.

facendo this al form1 esempio.
Il dialogo apparirà sul Form1 e non sul themebase1
Entrambi, sia Form1 che Themebase sono Container Control. quindi fungono allo stesso modo.

Per offuscare momentaneamente il tavolo devi assegnare come parent il themebase1 si.

Il DialogoScelta fa in modo di bloccare tutto il themebase1 e rendere visibile una nuova parte pulita del tavolo
mostrando una nuova schermata completamente diversa da quella del themebase1.

Per capire meglio, c'è il "Form_dei_test" dove è scritto tutto l'esempio.

Ovviamente il DialogScelta si può implementare in qualunque modo.
Forse avrei dovuto inserire un titolo più appropriato, ma al momento quello nelle meningi :rotfl:

Riguardo alla velocità, devo dare un occhiata.
Magari ci sono troppi cicli di Repaint sulle carte o sul tavolo.

Più tardi dò una controllata ance al tue nuove modifiche.
Ultima modifica effettuata da Thejuster 01/07/21 13:08
mire.forumfree.it/ - Mire Engine
C# UI Designer
01/07/21 17:49
Carlo
OK tutto chiaro, l'esempio di Form_dei_test l'ho usato per fare le aggiute su Form1, non ero entrato nel merito di come avevi costruito DialogoScelta e dal nome pensavo fesse un dialog, ma va bene così, non chiedo di cambiarlo.

Fammi sapere appena controlli la mia implementazione, naturalmente per far apparire il tuo dialog devi giocare e aspettare che si presenti la situazione di scelta multipla.

Per controllare la lentezza di themebase1, dovrai selezionare tutti i controlli sul form1, tagliarli, aggiungere themebase1 con la proprietà dock a fill (mi sembra che l'ho messa a none) e reincollarci sopra i controlli, anche il codice va modificato sui controls.add da this a themebase1 (ma lo sai già;):rotfl:
Ultima modifica effettuata da Carlo 02/07/21 5:30
in programmazione tutto è permesso
28/07/21 13:52
Thejuster
void giocata per la scopa.
In che modo effettui la verifica delle carte? vedo degli ID 32;2; esempio anche se ho solo giocato una carta, mi appaiono due ID.
posso magari dedurre che il primo numero sta per la carta giocata. 32 può indicare un seme col relativo numero e la seconda cifra l'ID del giocatore che ha giocato giusto?

Ho notato che manca la verifica della scopa il chè e fondamentale.
ma non ho ben capito il modo in cui effettui le verifiche delle carte giocate.

avevo in mente un animazione carina per segnalare la scopa appena effettuata.
Ultima modifica effettuata da Thejuster 28/07/21 13:53
mire.forumfree.it/ - Mire Engine
C# UI Designer