Ver Mensaje Individual
  #1  
Antiguo 08-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Reputación: 3
navbuoy Va por buen camino
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

Última edición por navbuoy fecha: 08-10-2024 a las 11:05:18.
Responder Con Cita