Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   tablero con TImages error raro (https://www.clubdelphi.com/foros/showthread.php?t=96712)

navbuoy 24-05-2024 18:44:14

tablero con TImages error raro
 
Hola amigos, a ver si alguien pudiese darme alguna indicacion de porque esto falla

tengo una rutina que dibuja en pantalla un tablero de hexagonos pero en modo 2D, esto es dibujando alternado en 2 bucles for las casillas hexagonales pero en realidad es como si dibujase en una rejilla 2D en horizontal y vertical

la cuestion, es que estoy tratando de que cuando cliqueo en una de las casillas, resaltarla y eso (en plan como que esta seleccionada)

y el codigo en el OnMouseDown lo tengo asi

Código:

        // Busca celda
        bool found = false;
        int col, row;
        for (int y = 0; y < 17; y++)
        {
                for (int x = 0; x < 12; x++)
                {

                                        TPoint pos = PosPt(x, y);
                        if (PtInRect(celda[x][y].rect, Point(X, Y)))
                        {
                                found = true;
                                col = x;
                                row = y;
                                CELDA_SELECTED.x = x;
                                CELDA_SELECTED.y = y;

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

la cuestion, es que las 2 primeras filas de arriba, las que corresponderian a coordenadas 1,1 - 2,1 , 3,1 etc es como si no las detectase, pero en el resto del tablero si las detecta...... alguien sabe porque pasa esto??? sin embargo la 0,0 si la detecta

la funcion PosPt es esta

Código:

//---------------------------------------------------------------------------
inline TPoint PosPt(int x, int y)
{
/* --> */  const int sx = 60, sy = 34; //separación
        return Point((y&1)*sx + x*sx*2, y*sy);
}
//---------------------------------------------------------------------------

añado una captura para que veais a que me estoy refiriendo del tablero de hexagonos


Neftali [Germán.Estévez] 27-05-2024 09:49:42

Es difícil saber qué está fallando sin más código.
Hay referencias ahí que no están presentes (celda[x][y]).

Deberías generar un log con la posición de los hexágonos creados y el punto donde estás pulsando con el ratón, para detectar el error.

navbuoy 28-05-2024 15:33:08

Gracias por responder Neftali

te cuento, el bucle de dibujado de rectangulos/hexagonos es asi



Código:

       

#define ICON_WIDTH 76
#define ICON_HEIGHT 76

for (int y = 0; y < 17; ++y)
        {
                for (int x = 0; x < 12; ++x)
                {


                        TPoint pos = PosPt(x, y);
                        celda[x][y].rect = TRect(pos.x, pos.y, pos.x + ICON_WIDTH, pos.y + ICON_HEIGHT);
       

                        if(color == 1) TABLERO->Canvas->Draw(pos.x, pos.y, hexbitmap1->Picture->Graphic);
                        else if(color == 2) TABLERO->Canvas->Draw(pos.x, pos.y, Image20->Picture->Graphic);

                        if(y%2 == 0) TABLERO->Canvas->Draw(pos.x, pos.y, small_hex_orange->Picture->Graphic);
                }
      }

los if son simplemente un control para pintar diferentes graficos de hexagonos dependiendo del valor "color" que le pases a la funcion de pintado

y "celda" esta definido asi, aunque tiene otras variables que aun no uso la que nos compete es "TRect rect" que como es obvio, almacena las coordenadas del hexagono/rectangulo para luego hacer la comprobacion de PtInRect()

Código:

struct uni {
                          struct {

                                                TRect rect;
                                                bool flag;
                                                int icon;
                                                int owner;
                                                int energy_level;
                                                int faction;
                                                struct conv convoy[8];
                          } celda[12][17];

                        }  UNIVERSE[MAX_UNIVERSE];


navbuoy 28-05-2024 15:38:17

neftali, no se muy bien lo que he tocado pero ya lo he arreglado

me parece que lo que cambie es las coordenadas de los bucles de 17 puse 15 y ahora si que detecta todas las celdas

podria ser eso?

navbuoy 28-05-2024 16:23:33

una cosa mas Neftali, si sabemos que los hexagonos van numerados en los bucles de izquierda a derecha y de arriba a abajo como haria para calcular la posicion del registro en la BD si tengo las coordenadas x,y de la celda de pantalla (hexagono)? son para X = 11 filas y para Y = 12 columnas el tablero

seria algo asi como X + (X * Y) ???


Te muestro como queda ahora


Neftali [Germán.Estévez] 29-05-2024 09:13:43

Cita:

Empezado por navbuoy (Mensaje 555775)
una cosa mas Neftali, si sabemos que los hexagonos van numerados en los bucles de izquierda a derecha y de arriba a abajo como haria para calcular la posicion del registro en la BD si tengo las coordenadas x,y de la celda de pantalla (hexagono)? son para X = 11 filas y para Y = 12 columnas el tablero

seria algo asi como X + (X * Y) ???


Si tienes 11 filas (X) y 12 columnas (Y), una posición Z, debería devolverte un indice con esta fórmula:

Código Delphi [-]
Z = ((Y-1) * 12) + X


Por ejemplo:
* Si pulsas la casilla 6 de la primera fila (6,1) => Z=((1-1)*12)+6 => Z=6
* Si pulsas la casilla 2 de la segunda fila (2,2) => Z=((2-1)*12)+2 => Z=14


NOTA: Si el primer índice es el 0, a la Z deberás restarle 1.

Por cierto, ¿la pantalla la has diseñado tú?
es espectacular!

navbuoy 29-05-2024 22:01:38

Si Neftali.... la hemos hecho yo y un dibujante de Peru me hizo los hexagonos, algunos de los iconos los cogimos de imagenes de naves de Google que habia asi de uso gratuito, esta un poco montado asi para ir viendo como quedaria aunque es posible que hagamos otros iconos de fichas para colocar en el tablero

El panel de Comprar/Vender tambien lo hizo mi amigo de Peru

navbuoy 30-05-2024 07:24:42

Neftali en mi caso la formula no necesita el -1 ya que son coordenadas absolutas del propio array (que empieza en 0,0)

Código:

Z = ((Y) * 12) + X
ya veras cuando tenga algo mas programado para el juego, va a estar muy bien, tengo algunas cosas pensadas con mi amigo para añadirle otras funcionalidades

navbuoy 01-06-2024 00:01:55

Mira Neftali, hemos hecho algunos arreglos en los paneles de interface

ya es funcional en algunas cosas por ejemplo mover las naves por las celdas (aunque esto tengo que mirar si implementar un tirador de dados que genere puntos de movimiento para que no sea moverse alegremente como les de la gana claro) y tambien los desplazamientos a Estaciones Espaciales y Planetas lo he hecho con 8 Timers para que 1) primero detecte que timers estan en funcionamiento y si encuentra uno que no esta Enabled entonces es el que coge para el viaje ..... 2) calcula una hipotetica "distancia" contando celdas hasta el destino y multiplicandolas por un valor bajo de forma que el "viaje" (donde pone FREE SLOT pondria "Nave tal en ruta hacia TAL SITIO" y entre los corchetes muestra un contador regresivo de segundos que seria el tiempo que le toma llegar a esa Estacion y tal..... tambien calcula unos miles de litros de fuel que el jugador tendria que "pagar" con creditos de su moneda del juego para cubrir esa distancia

y el login en la BD tambien esta hecho y con musiquita ambiental y algunos efectos de sonido

y luego los 2 botones a la derecha donde pone "Refresh Grid" con 2 flechas son para avanzar o retroceder en el tablero viendo de esa forma otras zonas con otras fichas en pantalla etc

y ya a Posteriori hare algun sistema de listado en ComboBox o algo con busqueda tecleando en la propiedad text de forma que puedas por ejemplo localizar Planetas o Estaciones (los cuales cada uno tendra un nombre unico asociado) de forma que no sea necesario andar desplazando mucho el tablero si por lo que sea el jugador quiere ir a tal planeta que este en la quinta puñeta del tablero jajaja

pese a no ser un juego "al uso" la verdad que estamos muy contentos porque funciona todo bastante bien.... no parece haber fallos asi de irsele la pinza al programa


navbuoy 02-06-2024 18:04:04

Hola Neftali

Hoy he estado haciendo la estructura para ya el tema de las naves que podria tener el usuario .... os la pongo aqui para que la veais (un maximo de 30 naves)

Cita:

struct {
int id_nave;
int Faccion;
char nombre_nave[40];
char categoria_nave[40];
float total_kgs_cargo;
bool hiperdrive_engine;
bool escudos_defensa;

struct {
int tipo_cargo;
float kgs_cargo;
char def_cargo[60];
} bodega[30];


} naves[30];


Casimiro Notevi 02-06-2024 19:43:34

¿Naves de carga? me gusta :)
Espero no llegar a un planeta lleno de aliens :D

Neftali [Germán.Estévez] 03-06-2024 08:47:50

Muy buena pinta.

Felicidades!!

navbuoy 04-06-2024 12:49:04

jeje gracias, ahi va otra actualizacion del tema HUDS

os cuento que estoy organizando el tema de Facciones/clanes, el juego por defecto tendra algunas Facciones definidas como principales (4 o 5 quizas) pero luego, dentro de cada Faccion, los jugadores podran crear Clanes que estaran formados por grupos de jugadores, todo esto de cara a posibles "conflictos" entre ellos, por ejemplo Clan XXX atacando naves de otro Clan rival etc.... ya vere como hacerlo pero la intencion es que ellos mismos lien el gran follón entre ellos.... me refiero al tema de atacar/saquear las mercacias que transportan los otros, destruirles las naves etc.... incluso veo "viable" que haya una especie de "categoria" en plan "En Busca y Captura" definida por algun tipo de accion, que conlleve que otros jugadores intenten "interceptarte y capturarte" lo cual quizas la penalizacion seria que te quitasen una importante cantidad de tus "creditos" en plan tener que pagar soborno/rescate o tal por la liberacion


navbuoy 04-06-2024 18:05:20

otro capture actualizado:

Os va gustando como queda?


Neftali [Germán.Estévez] 05-06-2024 08:33:19

^\||/^\||/^\||/^\||/
Está chulo.

navbuoy 05-06-2024 12:26:02

si, tambien le estoy implementando un sistema de ping basado en DATE and TIME del server, de esa forma, luego con el "demonio" que estara siempre funcionando para el tema de mover la IA (fichas de tablero) y cosas como ir revisando conexiones "muertas" (si se produce cierto desfase en minutos del ping) para de esa forma si alguien deja de estar conectado el demonio cambie el estado de ese player a offline

navbuoy 08-06-2024 11:40:32

ahi vamos ya con la parte de compra/venta de Naves



La franja horaria es GMT +2. Ahora son las 20:34:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi