Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#] mappa risiko
Forum - C# / VB.NET - [C#] mappa risiko

Avatar
Metal (Normal User)
Newbie


Messaggi: 16
Iscritto: 04/04/2011

Segnala al moderatore
Postato alle 12:26
Mercoledì, 28/12/2011
Ciao,
sto cercando di fare un programma per giocare a risiko, ma sono fermo alla mappa. Avevo pensato di dividere gli stati e fare un bottone per ogni stato, dandogli la forma dello stato stesso con queste funzioni trovate in rete

Codice sorgente - presumibilmente C#

  1. public static void CreateControlRegion(Control control, GraphicsPath path, Bitmap bitmap)
  2.         {
  3.             // Return if control and bitmap are null
  4.             if (control == null || path == null)
  5.                 return;
  6.  
  7.             // Set our control's size to be the same as the bitmap
  8.             control.Width = bitmap.Width;
  9.             control.Height = bitmap.Height;
  10.  
  11.             // Check if we are dealing with Form here
  12.             if (control is System.Windows.Forms.Form)
  13.             {
  14.                 // Cast to a Form object
  15.                 Form form = (Form)control;
  16.  
  17.                 // Set our form's size to be a little larger that the bitmap just
  18.                 // in case the form's border style is not set to none in the first
  19.                 // place
  20.                 form.Width += 15;
  21.                 form.Height += 35;
  22.  
  23.                 // No border
  24.                 form.FormBorderStyle = FormBorderStyle.None;
  25.  
  26.                 // Set bitmap as the background image
  27.                 form.BackgroundImage = bitmap;
  28.  
  29.                 // Calculate the graphics path based on the bitmap supplied
  30.                 GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
  31.  
  32.                 // Apply new region
  33.                 form.Region = new Region(graphicsPath);
  34.             }
  35.  
  36.             // Check if we are dealing with Button here
  37.             else if (control is Button)
  38.             {
  39.                 // Cast to a button object
  40.                 Button button = (Button)control;
  41.  
  42.                 // Do not show button text
  43.                 //button.Text = "";
  44.  
  45.                 // Change cursor to hand when over button
  46.                 //button.Cursor = Cursor.Hand;
  47.  
  48.                 // Set background image of button
  49.                 button.BackgroundImage = bitmap;
  50.  
  51.                 // Calculate the graphics path based on the bitmap supplied
  52.                 GraphicsPath graphicsPath = path; //CalculateControlGraphicsPath(bitmap);
  53.  
  54.                 // Apply new region
  55.                 button.Region = new Region(graphicsPath);
  56.             }
  57.         }
  58.  
  59.         // Calculate the graphics path that representing the figure in the bitmap
  60.         // excluding the transparent color which is the top left pixel.
  61.         public static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
  62.         {
  63.             // Create GraphicsPath for our bitmap calculation
  64.             GraphicsPath graphicsPath = new GraphicsPath();
  65.  
  66.             // Use the top left pixel as our transparent color
  67.             Color colorTransparent = bitmap.GetPixel(0, 0);
  68.  
  69.             // This is to store the column value where an opaque pixel is first found.
  70.             // This value will determine where we start scanning for trailing
  71.             // opaque pixels.
  72.             int colOpaquePixel = 0;
  73.  
  74.             // Go through all rows (Y axis)
  75.             for (int row = 0; row < bitmap.Height; row++)
  76.             {
  77.                 // Reset value
  78.                 colOpaquePixel = 0;
  79.  
  80.                 // Go through all columns (X axis)
  81.                 for (int col = 0; col < bitmap.Width; col++)
  82.                 {
  83.                     // If this is an opaque pixel, mark it and search
  84.                     // for anymore trailing behind
  85.                     if (bitmap.GetPixel(col, row) != colorTransparent)
  86.                     {
  87.                         // Opaque pixel found, mark current position
  88.                         colOpaquePixel = col;
  89.  
  90.                         // Create another variable to set the current pixel position
  91.                         int colNext = col;
  92.  
  93.                         // Starting from current found opaque pixel, search for
  94.                         // anymore opaque pixels trailing behind, until a transparent
  95.                         // pixel is found or minimum width is reached
  96.                         for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
  97.                             if (bitmap.GetPixel(colNext, row) == colorTransparent)
  98.                                 break;
  99.  
  100.                         // Form a rectangle for line of opaque pixels found and
  101.                         // add it to our graphics path
  102.                         graphicsPath.AddRectangle(new Rectangle(colOpaquePixel,
  103.                                                    row, colNext - colOpaquePixel, 1));
  104.  
  105.                         // No need to scan the line of opaque pixels just found
  106.                         col = colNext;
  107.                     }
  108.                 }
  109.             }
  110.  
  111.             // Return calculated graphics path
  112.             return graphicsPath;
  113.         }



ma ho scoperto che allineare i "confini" non è così semplice (ho fatto una prova con 2 pulsanti/stati ma vengono disegnati sovrapposti).
L'altra idea che avevo avuto era di usare un'immagine unica per il tabellone e poi ricavare lo stato su cui il giocatore clicca tramite le coordinate del mouse, ma credo che sia ancora più complicato.

Attualmente ho deciso di tenere un'immagine unica come sfondo e mettere dei pulsanti normali su ogni stato.
La domanda è: qualcuno saprebbe consigliarmi come fare? Perché mettere un pulsante su ogni stato non mi piace molto graficamente...

Ultima modifica effettuata da Metal il 28/12/2011 alle 13:17


yep
PM Quote