Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   codigo casero para controlar una estructura X-Y con paredes o suelo libre (https://www.clubdelphi.com/foros/showthread.php?t=96886)

navbuoy 08-10-2024 10:47:06

codigo casero para controlar una estructura X-Y con paredes o suelo libre
 
os explico porque pongo esto, resulta, que para lo de caminar por las estaciones espaciales, yo, en mi "inmensa sabiduria" y tras muchas noches a base de cafe apestoso marca carrefour, no se me ocurrio otra genialidad que establecer una rejilla X-Y de celdillas de 32x32 pixeles para el tema del suelo y tal de por donde han de moverse los jugadores (en fin)

Bueno, como uno no es precisamente Einstein reencarnado pues dije, hare un programa para automatizar en cierta manera la creacion de esa estructura visualmente para poder crear las paredes (valor 1) y los suelos por donde puedan caminar (valor 0)

y hice esto:

Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "acPNG"
#pragma resource "*.dfm"
TForm1 *Form1;

TEdit* EditBoxes[1104];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        // Crear dinámicamente 1000 EditBoxes
        int topPosition = 0; // Posición inicial en el eje Y
        int leftPosition = 0; // Posición inicial en el eje X
        int editWidth = 12; // Ancho del EditBox
        int editHeight = 5; // Altura del EditBox
        int margin = 20; // Espacio entre EditBoxes
        int count_edits = 0;

        for(int i = 0; i < 1104; i++) {
                // Crear el TEdit dinámicamente
                EditBoxes[i] = new TEdit(this);
                EditBoxes[i]->Parent = this; // Establecer el formulario como padre del TEdit
                EditBoxes[i]->MaxLength = 1;
                EditBoxes[i]->OnKeyPress = EditKeyPress;

                // Establecer posición en el formulario
                EditBoxes[i]->Left = leftPosition;
                EditBoxes[i]->Top = topPosition;
                // Establecer tamaño
                EditBoxes[i]->Width = editWidth;
                EditBoxes[i]->Height = editHeight;
                EditBoxes[i]->Text = 0;
                EditBoxes[i]->Tag = i;

                // Ajustar la siguiente posición vertical
                leftPosition += editWidth + margin; // Mover a la siguiente posicion
                count_edits++;
                // Si la posición vertical excede la anchura, hacer salto de columna
                if(count_edits == 48) {
                        topPosition += 32; // Resetear posición Y
                        leftPosition = 0;
            count_edits = 0;
                }
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::C1Click(TObject *Sender)
{
  if(OpenPictureDialog1->Execute() == false) return;

 Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
//---------------------------------------------------------------------------
 // Evento OnKeyPress para limitar la entrada a '0' o '1'
void __fastcall TForm1::EditKeyPress(TObject *Sender, System::WideChar &Key)
{
        TEdit* selectedEdit = dynamic_cast<TEdit*>(Sender);
        // Identificar cuál EditBox fue activado usando Sender
        if (selectedEdit != nullptr)
        {
                // Verificar si el carácter ingresado es '0', '1', o la tecla de retroceso
          if ((Key == '0' || Key == '1' || Key == VK_BACK))
          {
                // Obtener el índice del EditBox desde la propiedad Tag
                int index = selectedEdit->Tag;
                EditBoxes[index]->Text = Key;
          }
                // Si no es un carácter válido, cancela la entrada
                Key = 0;
        }
}


void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
  if(Key == VK_F5)
 {

  String fichero = InputBox(L"Guardar Estructura de Obstaculos", L"Introduce tu nombre de archivo con extension .txt", L"");
  String nombre_struct = "";

  if(fichero == "")
        {
          ShowMessage("No se ha guardado nada, no has introducido ningun nombre de archivo TXT");
          return;
        }

        // Encuentra la posición del último punto en el nombre del archivo
        int posicionPunto = fichero.LastDelimiter('.');
        // Si se encontró un punto, se obtiene la parte del nombre antes de la extensión
        if (posicionPunto != 0)
        {
          nombre_struct = fichero.SubString(1, posicionPunto - 1);
          }
        else { ShowMessage("El fichero debe terminar en .TXT o .txt para ser valido, no se ha guardado nada"); return;
                  }

                  Memo1->Clear();

                  AnsiString linea0 = "struct " + nombre_struct + "{";
                  AnsiString linea = "";
                  int counter_lines = 0;

                  for(int c=0; c < 1104; ++c)
                  {
                        if(c == 0) {
                                                  Memo1->Lines->Add(linea0);
                                                  linea = linea + EditBoxes[c]->Text + ",";
                                                  counter_lines++;
                                                  }

                        if(c == 1103)
                          {
                                linea = linea + EditBoxes[c]->Text.ToInt() + "};";
                                Memo1->Lines->Add(linea);
                                Memo1->Lines->SaveToFile(fichero);
                          }

                        if(counter_lines == 48)
                          {
                                Memo1->Lines->Add(linea);
                                counter_lines = 0;
                                linea = "";
                          }

                        else { linea = linea + EditBoxes[c]->Text.ToInt() + ","; counter_lines++;  }

                  }

  }

  Key=0;
  return;


}
//---------------------------------------------------------------------------


la salida visual es asi, utilizo un grafico por detras para "orientarnos" donde puedan estar las paredes claro....
y los edit boxes estan alineados conforme a rejilla de 32x32



luego en el propio programa pues utilizo la estructura comprobandola para ver si es caminable o no donde se vaya a mover el sprite

ESTRUCTURA:

Cita:

struct estacion1[1104]{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
aunque mirandolo ahora creo que me he pasado en el numero de elementos jejeje (la ultima linea de ceros creo que sobra con respecto a la cuadricula)

luego lo que hago es una formula de conversion que me dijo Neftali creo, que es (y) * filas + x = (posicion en esa estructura) para convertir las coordenadas X-Y


La franja horaria es GMT +2. Ahora son las 20:11:14.

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