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.
|