Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lista de componentes, bibliotecas y recursos para Delphi de código libre Neftali [Germán.Estévez] OOP 7 20-02-2017 17:00:49
Libro: Software Libre para una sociedad libre rretamar La Taberna 33 31-05-2011 11:09:34
Ahora por fin un accesorio casero para Geeks mamcx La Taberna 4 26-02-2008 16:20:32
Disco de cifrado Casero (Especial para los aburridos pensadores de los últimos días) Neftali [Germán.Estévez] Noticias 0 22-11-2006 11:05:00
[Software libre] Publicada gestión comercial libre (GPL) para Kylix ... kinobi Noticias 4 13-10-2003 15:19:36


La franja horaria es GMT +2. Ahora son las 04:59:24.


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
Copyright 1996-2007 Club Delphi