 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Lun 28 May, 2018 5:27 pm Asunto: porque no pinta la triada de celdas superiores?? |
|
|
Hola amigos......tengo este codigo
| Código: | //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "acPNG"
#pragma resource "*.dfm"
TForm1 *Form1;
////////////////////////////////////////////////////////////////////////////
struct { TRect rect; bool flag; int icon; } celda[15][12];
//---------------------------------------------------------------------------
inline TPoint PosPt(int x, int y)
{
/* --> */ const int sx = 62, sy = 36; //separación
return Point((y&1)*sx + x*sx*2, y*sy);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DrawHexGrid(1);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawHexGrid(int color)
{
Form1->DoubleBuffered = true;
TABLERO->Left = 0;
TABLERO->Top = 0;
TABLERO->Width = 1600;
TABLERO->Height = 865;
// limpia la pantalla pintando el FONDO como background
//TABLERO->Canvas->Draw(0, 0, Fondo->Picture->Graphic);
for (int y = 0; y < 15; ++y)
{
for (int x = 0; x < 12; ++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;
if(color == 1) TABLERO->Canvas->Draw(pos.x, pos.y, Image1->Picture->Graphic);
else if(color == 2) TABLERO->Canvas->Draw(pos.x, pos.y, Image1->Picture->Graphic);
if(y%2 == 0) TABLERO->Canvas->Draw(pos.x, pos.y, Image2->Picture->Graphic);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TABLEROMouseMove(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 < 15 && !found; y++)
{
for (int x = 0; x < 12; x++)
{
TPoint pos = PosPt(x, y);
if (PtInRect(celda[x][y].rect, Point(X, Y)) &&
!Image1->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;
TABLERO->Canvas->Draw(pos.x, pos.y, celda[col][row].flag
? Image3->Picture->Graphic : Image4->Picture->Graphic);
break;
}
}
}
Caption = found ? String().sprintf(L"%d, %d", col, row) : String("<no>");
oldCol = col;
oldRow = row;
}
//--------------------------------------------------------------------------- |
la cuestion es que en el evento onmouseMOVE cambia todas las casillas menos la triada superior....... no se que pasa pero me da que es algun error matematico en el calculo de rects o algo
adjunto el codigo del proyecto
http://www.stardust-game.org/testing/prueba_hexgrid.rar
agradeceria una solucion rapida al tema .... gracias. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 30 May, 2018 2:36 am Asunto: |
|
|
Tienes las dimensiones de "celda" intercambiadas, donde tienes:
| Código: | struct { TRect rect; bool flag; int icon; } celda[15][12]; |
debería ser:
| Código: | struct { TRect rect; bool flag; int icon; } celda[12][15];
^ ^
X Y
|
Por cierto, esta parte:
| Alpinador escribió: | | agradeceria una solucion rapida al tema .... gracias |
En un foro gratuito suena mal por mucho “agradecimiento” y “gracias” que lleve, en muchos foros frases como esa te habrían traído problemas. Se que muchas veces se pone sin mala intención y sin pensarlo demasiado, pero poniéndose en el lado de la persona que te va a ayudar es más fácil de entender.. |
|
| Volver arriba |
|
 |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Jue 31 May, 2018 5:29 pm Asunto: |
|
|
jejejeje....ok leo....voy a ver si cambiando eso....soluciono
si....efectivamente era eso..... si te digo la verdad lo pensé pero lo que hice fue cambiar el orden del bucle x y del onmouse move.....
lo de la solucion rapida me referia a que alguien arrojase luz o ideas ....porque muchas veces mis mensajes no los responde nadie
en fin.....gracias Leo |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|