CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Nov 2017 16:18

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 11 mensajes ] 
Autor Mensaje
NotaPublicado: 18 Abr 2014 12:52 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Hola a todos....

Hace unos dias que frecuento el canal de #Aetheria en el IRC Hispano, y comentando con las buenas gentes del lugar, se me ocurrió que podía intentar hacer un juego por mi cuenta (me gusta programar cosas en C++ Builder) y aportar mi grano de arena a la batalla por los jugadores perdidos de spañistán (amén de la comunidad hispano parlante que también los incluiremos)

Dicho y hecho, desempolvé el acceso directo al compilador (que tenía instalado desde hace años pero nunca tocaba) y me puse manos a la obra, sólo para darme cuenta que estaba tan oxidado en la programación que pasé 3 horas para programar 10 lineas funcionales con un bucle y una variable.....como no podía ser, fui hasta el bazar chino mas cercano, y adquirí por 2 euros un bote de aerospray 3 en 1 con el cual, rocié mi embotada cabeza y areas sobaqueras para (una vez lubricado) poder emprender la ardua tarea de programar al estilo John Carmack cuando tenia 3 años. (o sea, en plan churro total....que se le va a hacer)

Ya la cosa mejoraba, mi cerebro empezo a funcionar y pude crear un string grid y algunos bucles mas para tener digamos, el diseño en pantalla de la mazmorra donde el simbolito "#" significa una pared infranqueable y el vacio mas absoluto significa un lugar por donde pasar

para que veais lo chulo que me quedó, aqui incluyo un capture de pantalla, tened en cuenta que lo empece ayer día 17/04/2014 y aun esta en una fase temprana, de desarrollo, intentad ser indulgentes conmigo....no me abraséis a criticas.....tened paciencia...


Captura de Dungeon Quest Editor v1.0
--------------------------------------
Imagen


Sin mas noticias por el momento, me despido de vosotros.....


Última edición por Alpinador el 18 Abr 2014 14:35, editado 1 vez en total

Arriba
 Perfil  
 
NotaPublicado: 18 Abr 2014 14:18 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno, tras unas cuantas horas mas y algunos retoques de interface, la cosa va cogiendo algo de forma

para los mas impacientes, aqui teneis el ejecutable para que probéis a ver si os funciona en vuestra maquina y le deis a los botoncitos un rato (casi ninguno funciona)

http://www.qualinost.net/imagenes/dungeon_quest_editor.zip

echadle un vistazo:

Capture Dungeon Quest Editor v.1.0
-----------------------------------

Imagen


Arriba
 Perfil  
 
NotaPublicado: 20 Abr 2014 00:09 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno.....

el desarrollo sigue viento en popa aunque poco ha faltado para la catastrofe total (suerte que uno es apañao y consegui subsanar 2 errores que me han tenido en jaque todo el día), han sido 2 dias duros ahi probando cosas, equivocandome casi de continuo etc....pero finalmente creo que el resultado es bueno.

Esta vez, hay novedades frescas....os las detallo a continuación


COSAS QUE FUNCIONAN EN EL EDITOR
----------------------------------------
- El fichero Ejecutable es "Dungeon_Quest_Editor.exe" -...todos los demas ficheros exceptuando "dungeon_maps.dbf", son necesarios para que funcione (DLL's)
- Creacion de mapa desde cero rellenando toda la cuadricula con paredes automaticamente al iniciar el programa
- Posibilidad de agregar la descripcion de la "celda" activa y posterior guardado en fichero de disco.
- Posibilidad de rellenar 1 sola fila o 1 sola columna con paredes (boton derecho del raton sobre la cuadricula->menu contextual)
- Al cliquear en una celda con el simbolo "#" (pared) automaticamente borra la pared creando una nueva "celda" (estancia)
- Para guardar los mapas solo tenemos que darle a GUARDAR DATOS (boton)
- Para CARGAR los mapas del disco a la pantalla (memoria) solo tenemos que darle al menu superior MAPAS->Cargar Mapa
- inicialmente, solo esta pensado para 1 mapa y 1 solo archivo de datos, proximamente mejoraremos eso para que pueda guardar multiples mapas (niveles de mazmorra)
- inicialmente, el mapa lo conforman 99 celdas de ancho por 49 de alto (4.851 celdas en total) - Este tamaño no es variable por el usuario de momento
- los items y objetos que se pueden añadir a una localizacion (celda) estan limitados a 10 items de un solo uso (botellas, cofres, antorchas etc) y 10 objetos fijos que no podran moverse ni recogerse por el jugador (como pueden ser los Teletransportadores o las Puertas que conducen a otros niveles futuros).
----------------------------------------------------------------------------------------------------------------------------------------------------------------


COSAS QUE NO FUNCIONAN O BUGS
------------------------------------

- El panel "Items situados en localizacion (celda seleccionada) solo funciona parcialmente, es posible añadir los items y objetos de los desplegables a la lista, pero estos de momento no son guardados en disco......pronto lo arreglaremos , no os preocupéis....

- si tenemos seleccionada una celda y le damos a la rueda de scroll del raton.....ira borrando hacia arriba o hacia abajo las celdas.....esto tengo que mirar como arreglarlo...

- aun no he añadido la parte de insertar imagenes estáticas (JPG's) que acompañen a la descripcion de cada celda visitable (pero intentaremos solucionarlo tambien)
----------------------------------------------------------------------------------------------------------------------------------------------------------------


bueno, pues aqui os dejo el fichero comprimido en RAR del programa (ocupa unos 8 Mb)

http://www.qualinost.net/imagenes/dungeonquest_beta1.rar

y un capture del editor para que podais verlo aqui tambien la gente

Imagen


un saludo a todos y feliz regreso de vacaciones de Semana Santa


Arriba
 Perfil  
 
NotaPublicado: 20 Abr 2014 21:29 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno...otro dia mas programando y esta vez hay novedades que seguro os cautivarán jejeje

MEJORAS AÑADIDAS
-----------------------
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ahora es posible seleccionar que tipo de mapa queremos crear....los hay de 5 tipos

1) Mapa pequeño (20 x 20 celdas) serian 400 habitaciones
2) Mapa Mediano (100 x 50 celdas) serian 5000 habitaciones
3) Mapa Grande (200 x 100 celdas) serian 20.000 habitaciones
4) Mapa Extra-Grande (500 x 200 celdas) serian 100.000 habitaciones
5) Mapa Enorme MEGABLAST (1000x500 celdas) serian 500.000 habitaciones o localizaciones por donde puede moverse el jugador
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

- Tambien hay disponible un pequeño panel de seleccion de color para el cursor de celda activa con 18 fabulosos colores para escoger.
- Añadida la opcion "Bloquear Edicion de Mapa"....con la cual activada, podremos cliquear una y mil veces sobre la rejilla que nuestro mapa estará a salvo de modificaciones

- Mejoras en el codigo en general....

Espero que os guste el nuevo Build del Dungeon Quest Editor.... aqui os lo dejo:

http://www.qualinost.net/imagenes/dungeonquest_beta2.rar

Imagen


Arriba
 Perfil  
 
NotaPublicado: 21 Abr 2014 15:19 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno, simplemente para gente que le guste el tema del codigo fuente.....aqui os dejo el codigo del archivo principal tal y como lo llevo hasta ahora

Código:
//---------------------------------------------------------------------------


#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int XX=0; int YY=0; int X2 = 0; int Y2 = 0; int Y_objetos = 0;
int click = 0;
int total_chars_memo_descripcion = 300;
int COLOR_CELDA_ACTIVA_EN_MAPA = 6;
int TAMANIO_DE_MAPA_A_CREAR = 2;
bool RELLENAR_GRID = False;





// Estos 2 arrays de enteros almacenan los items y objetos de cada celda
// al cambiar a una nueva celda el contenido de dichos arrays pasa a la estructura s.
int items_total[10];
int objetos_total[10];


FILE *stream;
struct mystruct
   {
    char localizacion ;
    AnsiString descripcion;
    int item1;
    int item2;
    int item3;
    int item4;
    int item5;
    int item6;
    int item7;
    int item8;
    int item9;
    int item10;
    int objeto1;
    int objeto2;
    int objeto3;
    int objeto4;
    int objeto5;
    int objeto6;
    int objeto7;
    int objeto8;
    int objeto9;
    int objeto10;
   };

struct mystruct s[20][20];
struct mystruct m[100][50];
struct mystruct g[200][100];
struct mystruct xg[500][200];
struct mystruct e[1000][500];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

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

void __fastcall TForm1::RELLENARTODALAFILA1Click(TObject *Sender)
{
  int cont1;

  // Rellenamos toda la fila de celdas de la rejilla con el caracter "#" (pared)
  for(cont1=1; cont1<=StringGrid_mapa->ColCount; cont1++)
  {
    StringGrid_mapa->Cells[cont1][YY] = "#";
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid_mapaMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
   // Esto nos muestra las coordenadas del raton dentro del string grid

   // StringGrid_mapa->MouseCoord(X,Y);
   // Edit1->Text = X;
   // Edit2->Text = Y;
   /////////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RELLENARTODOELMAPADEPAREDES1Click(TObject *Sender)
{
  int cont1;
  int cont2;

  // Rellenamos con el simbolo "#" (pared) todas las celdas de la rejilla
  for(cont2=0; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<=StringGrid_mapa->ColCount; cont1++)
   {
    StringGrid_mapa->Cells[cont1][cont2] = "#";
    }
    }
}
//---------------------------------------------------------------------------



void __fastcall TForm1::StringGrid_mapaSelectCell(TObject *Sender,
      int ACol, int ARow, bool &CanSelect)
{
  long Column, Row;


  Column = ACol;
  Row    = ARow;

  XX = ACol;
  YY = ARow;

  // Comprobamos si el mapa tiene el maplock desactivado y si es asi, borramos la celda.
  if(CheckBox_maplock->Checked == False) StringGrid_mapa->Cells[Column][Row] = " ";

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




void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  //if(click == 0 && CheckBox_maplock->Checked == False)
  //{ StringGrid_mapa->Cells[XX][YY] = "X"; click = 1; X2 = XX; Y2 = YY;}

  //else if(click == 1 && CheckBox_maplock->Checked == False)
  //       { StringGrid_mapa->Cells[XX][YY] = " "; click = 0;}
}
//---------------------------------------------------------------------------





void __fastcall TForm1::StringGrid_mapaClick(TObject *Sender)
{
   if(CheckBox_maplock->Checked == False)
   {
    //Borramos la X anterior del mapa para que no queden rastros de x
    //  StringGrid_mapa->Cells[X2][Y2] = " ";

    // Actualizamos el componente MEMO con la descripcion (si la hay) de la
    // Estructura de datos s.
      Memo1->Text = s[XX][YY].descripcion;
    }

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int contador;
 //Recorremos la lista hasta encontrar una linea en blanco
 for(contador = 0; contador <=10; contador++)
 {
  //Si la encontramos...
  if(StringGrid_items1solouso->Cells[0][contador] == "")
    {
     // copiamos del combo box el item seleccionado a la lista
     StringGrid_items1solouso->Cells[0][contador] = ComboBox_items->Text;
     break;
     }
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
   int contador;
 //Recorremos la lista hasta encontrar una linea en blanco
 for(contador = 0; contador <=10; contador++)
 {
   //Si la encontramos...
  if(StringGrid_siempreahi->Cells[0][contador] == "")
    {
     // copiamos del combo box el objeto seleccionado a la lista
     StringGrid_siempreahi->Cells[0][contador] = ComboBox_objetos_celda->Text;
     break;
     }
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
  //En caso de borrar un objeto de la lista,
  //la variable Y_objetos nos indica cual es el seleccionado
  StringGrid_siempreahi->Cells[0][Y_objetos] = "";
}
//---------------------------------------------------------------------------


void __fastcall TForm1::StringGrid_siempreahiSelectCell(TObject *Sender,
      int ACol, int ARow, bool &CanSelect)
{
  // Si seleccionamos una linea de la lista de objetos "siempre ahi"
  // actualizamos la variable Y_objetos con el numero de fila,
  //para poder utilizarla mas adelante
  Y_objetos = ARow;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::GuardarMapaActual1Click(TObject *Sender)
{

/*
if ((stream = fopen("mapfile.$$$", "wb")) == NULL) // open file
   {
      ShowMessage("Cannot open output file.");
      return;
   }

   fwrite(&s, sizeof(s), 1, stream); // write struct s to file
   fclose(stream); // close file

   */
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
 /*
  int cont1 = 1;
  int cont2 = 1;

  for(cont2=1; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=1; cont1<=StringGrid_mapa->ColCount; cont1++)
   {

     if(StringGrid_mapa->Cells[cont1][cont2] == "#") s[cont1][cont2].localizacion = '#';
      else if(StringGrid_mapa->Cells[cont1][cont2] == " ") s[cont1][cont2].localizacion = ' ';


    }
   }
   */

  int cont1;
  int cont2;

  Table_dungeon_maps->First();
  Table_dungeon_maps->Active = True;

 //Empieza el borrado del fichero de mapa
  Timer2->Enabled = True;

    while(!Table_dungeon_maps->Eof)
          { Table_dungeon_maps->Delete();
            Edit1->Text = cont2++; Edit1->Refresh(); }


  DataSource1->Enabled = True;
  Table_dungeon_maps->Active = True;
  ShowMessage("TABLA VACIADA...Procediendo a Guardado de Mapa y Datos");



    //Grabamos el MAPA en la Table_dungeon_maps (fichero DBF con los datos)
  for(cont2=0; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<=StringGrid_mapa->ColCount; cont1++)
   {
     Edit1->Text = cont1; Edit1->Refresh(); Label4->Visible = True;
     Edit2->Text = cont2; Edit2->Refresh();
     Table_dungeon_maps->Edit();
     Table_dungeon_maps->Insert();
    //if(s[cont1][cont2].localizacion == '#') StringGrid_mapa->Cells[cont1][cont2] = "#";
    //else if(s[cont1][cont2].localizacion == ' ') StringGrid_mapa->Cells[cont1][cont2] = " ";

     if(StringGrid_mapa->Cells[cont1][cont2] == "#") Table_dungeon_maps->FieldValues["ESTADO"] = "#";
     else if(StringGrid_mapa->Cells[cont1][cont2] == " ") Table_dungeon_maps->FieldValues["ESTADO"] = " ";

     Table_dungeon_maps->FieldValues["COL"] = cont1;
     Table_dungeon_maps->FieldValues["ROW"] = cont2;
     Table_dungeon_maps->FieldValues["DESCRIP"] = s[cont1][cont2].descripcion;
     Table_dungeon_maps->FieldValues["ITEM1"] = s[cont1][cont2].item1;
     Table_dungeon_maps->FieldValues["ITEM2"] = s[cont1][cont2].item2;
     Table_dungeon_maps->FieldValues["ITEM3"] = s[cont1][cont2].item3;
     Table_dungeon_maps->FieldValues["ITEM4"] = s[cont1][cont2].item4;
     Table_dungeon_maps->FieldValues["ITEM5"] = s[cont1][cont2].item5;
     Table_dungeon_maps->FieldValues["ITEM6"] = s[cont1][cont2].item6;
     Table_dungeon_maps->FieldValues["ITEM7"] = s[cont1][cont2].item7;
     Table_dungeon_maps->FieldValues["ITEM8"] = s[cont1][cont2].item8;
     Table_dungeon_maps->FieldValues["ITEM9"] = s[cont1][cont2].item9;
     Table_dungeon_maps->FieldValues["ITEM10"] = s[cont1][cont2].item10;
     Table_dungeon_maps->FieldValues["OBJET1"] = s[cont1][cont2].objeto1;
     Table_dungeon_maps->FieldValues["OBJET2"] = s[cont1][cont2].objeto2;
     Table_dungeon_maps->FieldValues["OBJET3"] = s[cont1][cont2].objeto3;
     Table_dungeon_maps->FieldValues["OBJET4"] = s[cont1][cont2].objeto4;
     Table_dungeon_maps->FieldValues["OBJET5"] = s[cont1][cont2].objeto5;
     Table_dungeon_maps->FieldValues["OBJET6"] = s[cont1][cont2].objeto6;
     Table_dungeon_maps->FieldValues["OBJET7"] = s[cont1][cont2].objeto7;
     Table_dungeon_maps->FieldValues["OBJET8"] = s[cont1][cont2].objeto8;
     Table_dungeon_maps->FieldValues["OBJET9"] = s[cont1][cont2].objeto9;
     Table_dungeon_maps->FieldValues["OBJET10"] = s[cont1][cont2].objeto10;
     Table_dungeon_maps->Post();
     Label4->Visible = False;
    }
    }
   ShowMessage("Mapa GUARDADO con EXITO");
   Timer2->Enabled = False;


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

void __fastcall TForm1::CargarMapa1Click(TObject *Sender)
{
 /*
 if ((stream = fopen("mapfile.$$$", "r+")) == NULL) // open the file
   {
      ShowMessage("No puedo abrir este archivo de MAPA.");
      return;
   }

   fread(&s, sizeof(s), 1, stream); // read struct from file
   fclose(stream); // close file
   */


  int cont1;
  int cont2;
  int iResult;

  Table_dungeon_maps->Active = True;
  Table_dungeon_maps->First();

  //Dibujamos el mapa en el StringGrid de pantalla (2 bucles for anidados recorriendo la cuadricula
  for(cont2=0; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<=StringGrid_mapa->ColCount; cont1++)
   {
     Label4->Visible = True;
     Edit1->Text = cont1; Edit1->Refresh();
     Edit2->Text = cont2; Edit2->Refresh();
    //if(s[cont1][cont2].localizacion == '#') StringGrid_mapa->Cells[cont1][cont2] = "#";
    //else if(s[cont1][cont2].localizacion == ' ') StringGrid_mapa->Cells[cont1][cont2] = " ";

    Edit1->Text = Table_dungeon_maps->FieldByName("ESTADO")->AsString;
       iResult = StrComp( Edit1->Text.c_str(), "#");

    if(iResult)
      { StringGrid_mapa->Cells[cont1][cont2] = " "; }

    else
      { StringGrid_mapa->Cells[cont1][cont2] = "#"; }

    // Cargamos los datos del fichero DBF a la estructura s.
    s[cont1][cont2].descripcion = Table_dungeon_maps->FieldByName("DESCRIP")->AsString;
    s[cont1][cont2].item1 = Table_dungeon_maps->FieldByName("ITEM1")->AsInteger;
    s[cont1][cont2].item2 = Table_dungeon_maps->FieldByName("ITEM2")->AsInteger ;
    s[cont1][cont2].item3 = Table_dungeon_maps->FieldByName("ITEM3")->AsInteger  ;
    s[cont1][cont2].item4 = Table_dungeon_maps->FieldByName("ITEM4")->AsInteger  ;
    s[cont1][cont2].item5 = Table_dungeon_maps->FieldByName("ITEM5")->AsInteger  ;
    s[cont1][cont2].item6 = Table_dungeon_maps->FieldByName("ITEM6")->AsInteger  ;
    s[cont1][cont2].item7 = Table_dungeon_maps->FieldByName("ITEM7")->AsInteger  ;
    s[cont1][cont2].item8 = Table_dungeon_maps->FieldByName("ITEM8")->AsInteger  ;
    s[cont1][cont2].item9 = Table_dungeon_maps->FieldByName("ITEM9")->AsInteger  ;
    s[cont1][cont2].item10 = Table_dungeon_maps->FieldByName("ITEM10")->AsInteger;
    s[cont1][cont2].objeto1 = Table_dungeon_maps->FieldByName("OBJET1")->AsInteger;
    s[cont1][cont2].objeto2 = Table_dungeon_maps->FieldByName("OBJET2")->AsInteger;
    s[cont1][cont2].objeto3 = Table_dungeon_maps->FieldByName("OBJET3")->AsInteger;
    s[cont1][cont2].objeto4 = Table_dungeon_maps->FieldByName("OBJET4")->AsInteger;
    s[cont1][cont2].objeto5 = Table_dungeon_maps->FieldByName("OBJET5")->AsInteger;
    s[cont1][cont2].objeto6 = Table_dungeon_maps->FieldByName("OBJET6")->AsInteger;
    s[cont1][cont2].objeto7 = Table_dungeon_maps->FieldByName("OBJET7")->AsInteger;
    s[cont1][cont2].objeto8 = Table_dungeon_maps->FieldByName("OBJET8")->AsInteger;
    s[cont1][cont2].objeto9 = Table_dungeon_maps->FieldByName("OBJET9")->AsInteger;
    s[cont1][cont2].objeto10 = Table_dungeon_maps->FieldByName("OBJET10")->AsInteger;

    // Procedemos con el siguiente registro de datos
    Table_dungeon_maps->Next();
    Label4->Visible = False;

    }
    }



    //Esto sirve para pintar las primeras filas y columnas en blanco FIXED ROWS AND COLS
   /*for(cont1=0; cont1<=100; cont1++)
    {
      StringGrid_mapa->Cells[cont1][0] = " ";
      if(cont1<50) StringGrid_mapa->Cells[0][cont1] = " ";

      }*/
     
   Edit1->Text = cont1-1; Edit1->Refresh();
   Edit2->Text = cont2-1; Edit2->Refresh();

   ShowMessage("Mapa CARGADO en Memoria con EXITO");
}
//---------------------------------------------------------------------------


void __fastcall TForm1::BORRARTODOvolveraempezareldiseo1Click(
      TObject *Sender)
{
  int cont1;
  int cont2;

  // Borramos todo el contenido del String Grid y lo dejamos en blanco
  for(cont2=0; cont2<StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<StringGrid_mapa->ColCount; cont1++)
   {
    StringGrid_mapa->Cells[cont1][cont2] = " ";
    }
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RELLENARTODALACOLUMNA1Click(TObject *Sender)
{


  int cont1;

  // Rellenamos toda la columna con el simbolo almuadilla que identifica una pared
  for(cont1=0; cont1<=StringGrid_mapa->RowCount; cont1++)
  {
    StringGrid_mapa->Cells[XX][cont1] = "#";
   }
}
//---------------------------------------------------------------------------




void __fastcall TForm1::Memo1Change(TObject *Sender)
{
  //Si el objeto MEMO es modificado, se actualiza la estructura de mapa
  s[XX][YY].descripcion = Memo1->Text;
}
//---------------------------------------------------------------------------



void __fastcall TForm1::StringGrid_mapaDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
 // standard colors
 ////////////////////////////////
 // clBlack   = TColor($000000);
 // clMaroon  = TColor($000080);
 // clGreen   = TColor($008000);
 // clOlive   = TColor($008080);
 // clNavy    = TColor($800000);
 // clPurple  = TColor($800080);
 // clTeal    = TColor($808000);
 // clGray    = TColor($808080);
 // clSilver  = TColor($C0C0C0);
 // clRed     = TColor($0000FF);
 // clLime    = TColor($00FF00);
 // clYellow  = TColor($00FFFF);
 // clBlue    = TColor($FF0000);
 // clFuchsia = TColor($FF00FF);
 // clAqua    = TColor($FFFF00);
 // clLtGray  = TColor($C0C0C0); // clSilver alias
 // clDkGray  = TColor($808080); // clGray alias
 // clWhite   = TColor($FFFFFF);


   TRect Casilla;//variable necesaria para pintar la celda

   // un simple switch para saber que color ha escogido el usuario
   switch(COLOR_CELDA_ACTIVA_EN_MAPA)
   {
     case 1:
     StringGrid_mapa->Canvas->Brush->Color=clBlack; break;
     case 2:
     StringGrid_mapa->Canvas->Brush->Color=clMaroon; break;
     case 3:
     StringGrid_mapa->Canvas->Brush->Color=clGreen; break;
     case 4:
     StringGrid_mapa->Canvas->Brush->Color=clOlive; break;
     case 5:
     StringGrid_mapa->Canvas->Brush->Color=clNavy; break;
     case 6:
     StringGrid_mapa->Canvas->Brush->Color=clPurple; break;
     case 7:
     StringGrid_mapa->Canvas->Brush->Color=clTeal; break;
     case 8:
     StringGrid_mapa->Canvas->Brush->Color=clGray; break;
     case 9:
     StringGrid_mapa->Canvas->Brush->Color=clSilver; break;
     case 10:
     StringGrid_mapa->Canvas->Brush->Color=clRed; break;
     case 11:
     StringGrid_mapa->Canvas->Brush->Color=clLime; break;
     case 12:
     StringGrid_mapa->Canvas->Brush->Color=clYellow; break;
     case 13:
     StringGrid_mapa->Canvas->Brush->Color=clBlue; break;
     case 14:
     StringGrid_mapa->Canvas->Brush->Color=clFuchsia; break;
     case 15:
     StringGrid_mapa->Canvas->Brush->Color=clAqua; break;
     case 16:
     StringGrid_mapa->Canvas->Brush->Color=clLtGray; break;
     case 17:
     StringGrid_mapa->Canvas->Brush->Color=clDkGray; break;
     case 18:
     StringGrid_mapa->Canvas->Brush->Color=clWhite; break;
   }

//los parametros que se pasan aqui son
//la columna y la fila que se quieren pintar, repectivamente.
   Casilla= StringGrid_mapa->CellRect(XX, YY);

//el parametro que espera el algoritmo FillRect es de tipo
// TRect, ahi es cuando se pinta la casilla del color que hayas puesto
// en la propiedad Canvas->Brush->Color
   StringGrid_mapa->Canvas->FillRect(Casilla);





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

void __fastcall TForm1::Button5Click(TObject *Sender)
{
 // Mostramos las Opciones de Configuracion Personalizada del Programa
 Form2->Show();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::NuevoMapeado1Click(TObject *Sender)
{
 //Mostramos el Formulario de Seleccion de tipo de MAPA
 Form3->ShowModal();

  int cont1;
  int cont2;

  switch(TAMANIO_DE_MAPA_A_CREAR)
  {
   case 1:
           StringGrid_mapa->ColCount = 20;
           StringGrid_mapa->RowCount = 20;
           break;
   case 2:
           StringGrid_mapa->ColCount = 100;
           StringGrid_mapa->RowCount = 50;

           break;
   case 3:
           StringGrid_mapa->ColCount = 200;
           StringGrid_mapa->RowCount = 100;

           break;
   case 4:
           StringGrid_mapa->ColCount = 500;
           StringGrid_mapa->RowCount = 200;

           break;
   case 5:
           StringGrid_mapa->ColCount = 1000;
           StringGrid_mapa->RowCount = 500;

           break;
   }



  Edit1->Text = StringGrid_mapa->RowCount;
  Edit2->Text = StringGrid_mapa->ColCount;


  for(cont2=0; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<=StringGrid_mapa->ColCount; cont1++)
   {
    if(RELLENAR_GRID == True) StringGrid_mapa->Cells[cont1][cont2] = "#";
    else if(RELLENAR_GRID == False) StringGrid_mapa->Cells[cont1][cont2] = " ";

    }
    }

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

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  int cont1;
  int cont2;

  switch(TAMANIO_DE_MAPA_A_CREAR)
  {
   case 0:
           StringGrid_mapa->ColCount = 20;
           StringGrid_mapa->RowCount = 20;
           break;

   case 1:
           StringGrid_mapa->ColCount = 60;
           StringGrid_mapa->RowCount = 30;
           break;
   case 2:
           StringGrid_mapa->ColCount = 100;
           StringGrid_mapa->RowCount = 50;

           break;
   case 3:
           StringGrid_mapa->ColCount = 200;
           StringGrid_mapa->RowCount = 100;

           break;
   case 4:
           StringGrid_mapa->ColCount = 500;
           StringGrid_mapa->RowCount = 200;

           break;
   case 5:
           StringGrid_mapa->ColCount = 1000;
           StringGrid_mapa->RowCount = 500;

           break;
   }



  Edit1->Text = StringGrid_mapa->ColCount;
  Edit2->Text = StringGrid_mapa->RowCount;


  for(cont2=0; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<=StringGrid_mapa->ColCount; cont1++)
   {
    if(RELLENAR_GRID == True) StringGrid_mapa->Cells[cont1][cont2] = "#";
    else if(RELLENAR_GRID == False) StringGrid_mapa->Cells[cont1][cont2] = " ";
    }
    }

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

void __fastcall TForm1::ParedenCeldaSeleccionada1Click(TObject *Sender)
{
  StringGrid_mapa->Cells[XX][YY] = "#";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CheckBox_RELLENAR_MAPAClick(TObject *Sender)
{
   if(CheckBox_RELLENAR_MAPA->Checked == True) RELLENAR_GRID = True;
   else RELLENAR_GRID = False;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button_borrar_mapaClick(TObject *Sender)
{
  int cont1;
  int cont2;

   if(Application->MessageBox("¿Realmente desea Borrar el Mapa?","Borrar el Mapa actual",MB_OKCANCEL + MB_ICONQUESTION) == 1)
  {

  // Borramos el Mapa
    for(cont2=0; cont2<=StringGrid_mapa->RowCount; cont2++)
  {
   for(cont1=0; cont1<=StringGrid_mapa->ColCount; cont1++)
   {
      if(RELLENAR_GRID == True) StringGrid_mapa->Cells[cont1][cont2] = "#";
      else if(RELLENAR_GRID == False) StringGrid_mapa->Cells[cont1][cont2] = " ";
     }
   }

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



y aqui el fichero de cabecera del archivo principal con los componentes utilizados en el Form

Código:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <Menus.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <ComCtrls.hpp>
#include <DB.hpp>
#include <DBGrids.hpp>
#include <DBTables.hpp>
#include <jpeg.hpp>
//---------------------------------------------------------------------------

class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TStringGrid *StringGrid_mapa;
        TPopupMenu *PopupMenu1;
        TMenuItem *InsertarPared1;
        TMenuItem *InsertarENEMIGO1;
        TMenuItem *ZONALIBREDEOBSTACULOS1;
        TMenuItem *RELLENARTODALAFILA1;
        TMenuItem *RELLENARTODALACOLUMNA1;
        TMenuItem *RELLENARTODOELMAPADEPAREDES1;
        TMenuItem *BORRARTODOvolveraempezareldiseo1;
        TEdit *Edit1;
        TEdit *Edit2;
        TImage *Image1;
        TPageControl *PageControl1;
        TTabSheet *TabSheet1;
        TGroupBox *GroupBox1;
        TPageControl *PageControl2;
        TTabSheet *TabSheet2;
        TTabSheet *TabSheet3;
        TStringGrid *StringGrid_siempreahi;
        TStringGrid *StringGrid_items1solouso;
        TComboBox *ComboBox_objetos_celda;
        TButton *Button2;
        TLabel *Label3;
        TComboBox *ComboBox_items;
        TButton *Button1;
        TLabel *Label2;
        TButton *Button3;
        TTimer *Timer1;
        TButton *Button4;
        TMainMenu *MainMenu1;
        TMenuItem *NuevoMAPA1;
        TMenuItem *NuevoMapeado1;
        TMenuItem *CargarMapa1;
        TMenuItem *GuardarMapaActual1;
        TDBGrid *DBGrid1;
        TDataSource *DataSource1;
        TTable *Table_dungeon_maps;
        TTimer *Timer2;
        TImage *Image2;
        TTabSheet *TabSheet4;
        TTabSheet *TabSheet5;
        TTabSheet *TabSheet6;
        TPanel *Panel1;
        TLabel *Label4;
        TMenuItem *ParedenCeldaSeleccionada1;
        TPanel *Panel2;
        TButton *Button_borrar_mapa;
        TCheckBox *CheckBox_RELLENAR_MAPA;
        TCheckBox *CheckBox_maplock;
        TButton *Button5;
        TImage *Image3;
        TLabel *Label1;
        TMemo *Memo1;
        void __fastcall RELLENARTODALAFILA1Click(TObject *Sender);
        void __fastcall StringGrid_mapaMouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y);
        void __fastcall RELLENARTODOELMAPADEPAREDES1Click(TObject *Sender);
        void __fastcall StringGrid_mapaSelectCell(TObject *Sender,
          int ACol, int ARow, bool &CanSelect);
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall StringGrid_mapaClick(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall StringGrid_siempreahiSelectCell(TObject *Sender,
          int ACol, int ARow, bool &CanSelect);
        void __fastcall GuardarMapaActual1Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall CargarMapa1Click(TObject *Sender);
        void __fastcall BORRARTODOvolveraempezareldiseo1Click(
          TObject *Sender);
        void __fastcall RELLENARTODALACOLUMNA1Click(TObject *Sender);
        void __fastcall Memo1Change(TObject *Sender);
        void __fastcall StringGrid_mapaDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State);
        void __fastcall Button5Click(TObject *Sender);
        void __fastcall NuevoMapeado1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall ParedenCeldaSeleccionada1Click(TObject *Sender);
        void __fastcall CheckBox_RELLENAR_MAPAClick(TObject *Sender);
        void __fastcall Button_borrar_mapaClick(TObject *Sender);
private:   // User declarations
public:      // User declarations

        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------
#endif


Arriba
 Perfil  
 
NotaPublicado: 21 Abr 2014 20:53 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno....hoy he retocado algo la zona de interface jugando un poco con el color AZUL

asi ha quedado finalmente


Imagen


este es el menu de Personalizacion del Editor (ya se pueden customizar los desplegables de Items y Objetos de cada celda


Imagen



y este el menu de seleccion de tipo de mapa (he añadido la opcion de rellenar la rejilla con simbolo "#" (paredes) o bien inicializar el mapa en blanco


Imagen


Arriba
 Perfil  
 
NotaPublicado: 22 Abr 2014 23:06 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno....hoy ha sido un día productivo...

Por una parte, he arreglado algunos errores que tenia el guardado de datos (aun me queda uno por pulir pero no interfiere demasiado ... y por otra...me he dado cuenta que estaba usando una resolucion de pantalla altísima para crear el interface....me he bajado a los 1024x768 pixels y he ajustado el editor a esa resolución de momento

Tambien he añadido una pestaña "MUSICA" en la cual se halla un reproductor basico de ficheros MIDI que tengo previsto incluir en el cliente de juego (mediante el editor se podrán asignar diferentes midi a ciertas partes del juego)

Tambien he implementado una cosa que creo que le gustará a mucha gente....la gente que lo haya probado en alguna de sus versiones...se habrán dado cuenta que con la rueda wheel de scroll del raton...la celda activa se desplazaba hacia arriba y abajo por las filas ayudando a borrar varias celdas fácilmente con solo hacer scroll vertical.....y os habréis preguntado ¿y como hago para borrar varias celdas horizontalmente ? pues fácil....pulsando la tecla TABULADOR del teclado....

Tambien he creado un nuevo logo mas chulo que el anterior y añadido algunas otras funcionalidades al interface...

aqui os dejo un capture del editor en estos momentos..... seguimos actualizando mañana!!!

Imagen


Arriba
 Perfil  
 
NotaPublicado: 23 Abr 2014 20:21 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Bueno....esto es una actualizacion de esta tarde día 23 de Abril de 2014 a las 9:00 de la noche aproximadamente

He cambiado de nuevo el logo y he retocado el interface en diseño visual
Tambien he añadido una pestaña MUSICA (en el capture mas abajo podeis verlo) para cargar ficheros MIDI y Mp3 y escucharlos (solo escucharlos de momento)

He corregido algunos errores mas, entre ellos ese que no interferia mucho pero daba por saco y creo que ahora funciona mucho mejor

TIP: cuando estéis dibujando en el mapa, podeis utilizar TABULADOR y Shift TABULADOR para moveros horizontalmente y la rueda (scroll wheel) del raton para pintar verticalmente

Tambien, si estais sobre una casilla (celda) vacia y pulsais BARRA ESPACIADORA insertará en esa posicion una pared (#)

aqui os dejo la version del editor Beta 3 y un capture de pantalla

http://www.qualinost.net/imagenes/dungeonquest_Editor_Beta3.rar



Imagen



Imagen


Arriba
 Perfil  
 
NotaPublicado: 24 Abr 2014 02:09 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Hoy tambien ha tocado diseñar algunas cartas de juego para la futura mecanica de juego de combates entre el jugador y la maquina....aqui podéis ver algunas....estan sin terminar

Nota: (los dibujos los he cogido de google images.....no soy tan buen grafista..)

Imagen


Arriba
 Perfil  
 
NotaPublicado: 24 Abr 2014 07:47 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 27 Ene 2010 20:38
Mensajes: 1278
Currazo te estás pegando, amigo.

¿Cuál será la mecánica del editor/juego? no estoy muy puesto en este tipo de entretenimientos.


Arriba
 Perfil  
 
NotaPublicado: 24 Abr 2014 20:03 
Desconectado
Elfito
Elfito

Registrado: 31 Ago 2011 10:05
Mensajes: 12
Hola Comely

bueno....la mecanica de juego es algo que estoy discutiendo con mi mujer y un amigo todos los dias (les estoy dando la paliza del copon con el juego jjjaja)

La idea, es que vez que visitas una celda o sea cada movimiento en una "celda" del mapeado de la mazmorra, en pantalla se mostrará una rejilla de varias casillas...digamos que cada "localizacion o Habitacion" del mapeado contiene una habitacion de X celdas (no muchas, las justas para distribuir en la misma los enemigos, items y posibles salidas hacia otra celda....solo se mostrará la habitacion en curso en pantalla.....los movimientos por las casillas de dicha localizacion, se harán por turnos (turno del PC y turno del jugador) tirando un dado de 6 caras

Luego vienen los combates, una vez tengas a un enemigo frente a ti, puedes escoger entre huir o luchar.....si huyes tendras una ligera penalizacion en salud y monedas....digamos que perderás algo de salud y unas cuantas monedas de tu bolsa....

Los combates se juegan en una partida de cartas en la cual hay 1 barra de energía para cada carta...(4 barras el PC y 4 barras el jugador.-- cada barra corresponde a la salud de esa carta) primero, al comienzo sacas 4 cartas y vas tirando dados...hay 4 cartas (mano de juego) y 1 carta Bonificador/Penalizador que puedes coger del mazo cuando te toque el turno de tirar los dados y saques un 5 o un 6 (el bonificador dura varios turnos y luego la carta vuelve al mazo....tener en cuenta que puede tanto beneficiarte como perjudicarte...esto es aleatorio .

(si sacas un 1, 2 , 3, o 4) se produce el ataque a las cartas del contrincante, restandole a las barras de salud de sus cartas, el porcentaje que corresponda....una vez acabas con una carta, el jugador o maquina queda con 3 2 o 1 carta....asi hasta que uno de los 2 pierda todas las cartas ....entonces....el que las haya perdido habrá perdido la batalla

Esto lo he pensado un poco como he visto que podria ser sin complicarlo en exceso para que los combates no tengan una duracion desmesurada sino que sean dinámicos y breves, pues el objetivo del juego es explorar la caverna o mazmorra principal....los combates son eventos como puede ser por ejemplo que encuentres una celda "Tienda" donde puedes vender y comprar objetos (como pociones de salud, objetos magicos o items de juego"

Luego estan los teletransportadores que son casillas especiales que cuando las pisas, pasas a otra parte del mapa....los teletransportadores estan enlazados por parejas y fluyen en las 2 direcciones....si por ejemplo tenemos teletransportadores A y B.... si pisas en la celda "A" conduce a "B" y "B" conduce a "A" ... instantaneamente

Despues estan las puertas....hay puertas que conducen a otros niveles de mapeado...dichas puertas son fijas para cada nivel y siempre estan en el mismo lugar....

Si a vosotros se os ocurre alguna otra dinámica de juego de cartas, agradecería esa aportacion por vuestra parte...pero explicadmelo bien eh??? con pelos y señales como si tuviese 5 años yo....

aqui os dejo una captura del interface de juego de cartas.... tened en cuenta que no es el interface definitivo, aun le queda bastante por diseñar pero es la aproximación que tengo por el momento

Imagen


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 11 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM