Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Sab 02 Sep, 2017 12:11 pm Asunto: A vueltas con el HexGrid |
|
|
Hola, a ver si alguien, es que estoy ya durante varios dias intentando dibujar un HexGrid con estas imagenes del ejemplo que os adjunto y me da errores de memoria
queria hacer una rejilla hexagonal de unas dimensiones mayores que la pantalla y que sea scrolleable ...esto creo que lo puedo conseguir con el componente scrollbox y un TImage
tengo el siguiente código
| Código: |
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "acPNG"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MediaPlayer1->Play();
DrawHexGrid();
}
//---------------------------------------------------------------------------
inline TPoint PosPt(int x, int y)
{
/* --> */ const int sx = 58, sy = 40; //separación
return Point((y&1)*sx + x*sx*2, y*sy);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawHexGrid()
{
// limpia la pantalla
skreen->Canvas->Brush->Color = clBlack;
skreen->Canvas->Rectangle(0, 0, skreen->Width, skreen->Height);
for (int y = 0; y < 14; ++y)
{
for (int x = 0; x < 10; ++x)
{
TPoint pos = PosPt(x, y);
/* --> */ celda[x][y].rect = TRect(pos.x, pos.y, pos.x + Image1->Width, pos.y + Image1->Height);
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 < 14 && !found; ++y)
{
for (int x = 0; x < 10; ++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;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Panel1->Visible = false;
MediaPlayer1->Stop();
}
//---------------------------------------------------------------------------
|
pero a veces si cambio los valores de "y" y "x" del bucle que lo pinta, me da un error de pantalla y se me abre el fichero System en la linea:
| Cita: | if (MonitorSupport <> nil) and (FLockEvent <> nil) then
MonitorSupport.FreeSyncObject(FLockEvent); |
no entiendo que puede pasar
os dejo aqui el proyecto y un capture....se supone que cuando pasas el raton por encima debe pintar las celdas en azul y detectarlas en el title de la app (coordenadas) pero hay algunas que no las pinta ni detecta las coordenadas y no se porque
el MediaPlayer1 es para proyectar un AVI pero ignoradlo
http://www.qualinost.tk/imagenes/tablero_hexagona_espacial.rar |
|