Tablero Hexagonal para juegos tipo Risk

P

Seguro que siempre os habéis preguntado como se hace un tablero hexagonal en pantalla

Aqui os dejo parte de mi codigo para que lo implementéis en vuestro programa si queréis....es muy sencillo
Gracias a _Leo de Lanzarote por sus correcciones en la rutina original

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
   DrawHexGrid();
}
//---------------------------------------------------------------------------
inline TPoint PosPt(int x, int y)
{
   const int sx = 70, sy = 41; //separación
   return Point((y&1)*sx + x*sx*2, y*sy);
}
//---------------------------------------------------------------------------
void __fastcall TForm1:SmilierawHexGrid()
{
   // limpia la pantalla
   skreen->Canvas->Brush->Color = clBlack;
   skreen->Canvas->Rectangle(0, 0, skreen->Width, skreen->Height);

   for (int y = 0; y < 12; ++y)
   {
       for (int x = 0; x < 8; ++x)
       {
           TPoint pos = PosPt(x, y);
           celda[x][y].rect = TRect(pos.x, pos.y, pos.x + 90, pos.y + 90);
           celda[x][y].flag = false;
           skreen->Canvas->Draw(pos.x, pos.y, Image1->Picture->Graphic);
       }
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::skreenMouseMove(TObject *Sender, TShiftState Shift,
       int X, int Y)
{
   static int oldCol = 0, oldRow = 0;

   // Busca celda
   bool found = false;
   int col, row;
   for (int y = 0; y < 12 && !found; ++y)
   {
       for (int x = 0; x < 8; ++x)
       {
           TPoint pos = PosPt(x, y);
           if (PtInRect(celda[x][y].rect, Point(X, Y)) &&
               !Image3->Picture->Bitmap->Canvas->Pixels[X - pos.x][Y - pos.y])
           {
               found = true;
               col = x;
               row = y;
               if (col == oldCol && row == oldRow) return;
               // Como ejemplo cambiamos la celda al pasar por encima
               celda[col][row].flag = !celda[col][row].flag;
               skreen->Canvas->Draw(pos.x, pos.y, celda[col][row].flag
                   ? Image2->Picture->Graphic : Image1->Picture->Graphic);
               break;
           }
       }
   }

   Caption = found ? String().sprintf(L"%d, %d", col, row) : String("<no>");

   oldCol = col;
   oldRow = row;
}
//---------------------------------------------------------------------------

tablerohexagonal

Usuarios habituales