Camino nefasto.
Después de todo este tiempo, no sé si quiera cuándo habrá sido el último día de actualización de este blog. Ni por darme cuenta. De todas formas, no he estado parado.
Claro está que no voy a hacer una actualización de mi vida personal, pero sí de la evolución de este proyecto mío, del world-builing y del desarrollo del supuesto RPG que pretendo crear.
Al final de la parrafada añadiré las imágenes pertinentes contextualizadoras o no completamente innecesarias.
El desarrollo.
Durante estos meses, por decir algo, en mi mente se iba gestando la fatidica idea del desarrollo de un videojuego RPG al más puro estilo japonés clásico por turnos, medieval, de fantasía, con equipo, aliniaciones de este, y un largo etc. Por el camino he aprendido a programar, más o menos, y sigo en ello, aún no soy nada, en Java. Aun me queda múchisimo, por no decir todo, como OOP y la implmenteación de interfaces, pero por el momento, con lo que llevo aprendido, quería ir formando lo que era el esqueleto (figura 1) del juego. Después de más o menos haber creído tenerlo hecho, me lancé de lleno al desarrollo de algún tipo de código pensando en la gran escala. Pensé "Minecraft está desarrollado en Java... Mi proyecto es diez mil veces más sencillo que el juego de Mojang, evidentemente. No creo que sea complicado empezár a desarrollar, por lo menos, algo en texto, si acaso con ASCII, aunque ahora no me preocupe eso.".
Y a ello me dispuse. Hice cosas como las siguientes:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// Game class
public class Game {
// Attributes
private String name;
private int currentLevel;
private Player player; // Player instance
private NarrativeManager narrativeManager; // NarrativeManager instance
private JFrame frame; // Main game window
private JTextArea textArea; // Text area for game output
private JTextField inputField; // Input field for user commands
// Constructor
public Game() {
this.name = "--------[The Ruins of E'felone ]--------";
this.currentLevel = 0; // Default level
this.player = null; // No player loaded initially
createAndShowGUI(); // Create the GUI
}
// Create and show the game GUI
private void createAndShowGUI() {
frame = new JFrame(name);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setLayout(new BorderLayout());
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(textArea);
frame.add(scrollPane, BorderLayout.CENTER);
inputField = new JTextField();
inputField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String input = inputField.getText();
handleUserInput(input);
inputField.setText(""); // Clear input field
}
});
frame.add(inputField, BorderLayout.SOUTH);
frame.setVisible(true); // Show the window
textArea.append("Welcome to --Arcana Magna --\n");
mainMenu(); // Show the main menu
}
// Handle user input from the input field
private void handleUserInput(String input) {
switch (input.toLowerCase()) {
case "1":
createCharacter();
break;
case "2":
credits();
break;
case "3":
if (player != null) {
narrativeManager = new NarrativeManager(textArea, inputField);
narrativeManager.startAdventure(player); // Start the adventure
} else {
textArea.append("You shall create a character first.\n");
}
break;
case "4":
exit(); // Exit the game
break;
default:
textArea.append("Invalid option. Please choose again.\n");
break;
}
}
// Start the game
public void start() {
textArea.append("Comencing adventure.\n");
textArea.append(name + "\n");
}
// Show the main menu
private void mainMenu() {
textArea.append("Main Menu:\n");
textArea.append("1. Create Character\n");
textArea.append("2. View Credits\n");
textArea.append("3. Start Adventure\n");
textArea.append("4. Exit\n");
textArea.append("Choose an option: \n");
}
// Create a character
private void createCharacter() {
String playerName = JOptionPane.showInputDialog(frame, "Enter your adventurer's name:");
String[] options = {"Warrior", "Mage", "Rogue", "Cleric", "Scout"};
int classChoice = JOptionPane.showOptionDialog(frame, "Choose thy occupation:",
"Character Class", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
null, options, options[0]);
CharacterClass characterClass = null;
switch (classChoice) {
case 0:
characterClass = CharacterClass.WARRIOR;
break;
case 1:
characterClass = CharacterClass.MAGE;
break;
case 2:
characterClass = CharacterClass.ROGUE;
break;
case 3:
characterClass = CharacterClass.CLERIC;
break;
case 4:
characterClass = CharacterClass.SCOUT;
break;
default:
textArea.append("Invalid class choice. Defaulting to Warrior.\n");
characterClass = CharacterClass.WARRIOR;
}
// Create the player
player = new Player(playerName, 1, characterClass); // Start at level 1
textArea.append("You are: " + player.getName() + " the " + characterClass + "\n");
}
// Show credits
public void credits() {
textArea.append("Game developed by Qaffqa.\n");
}
// Exit game
public void exit() {
textArea.append("Exiting game...\n");
// Save logic can be added here
System.exit(0); // Exit application
}
// Main method
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Game game = new Game(); // Create a Game instance
game.start(); // Start the game
});
}
}
Para el ojo inexperto podrá verse como una barahunda sin sentido de código y sintaxis que ni le va ni le viene. Pero para el ojo enterado o el amateur puede que vea cosas sin sentido de todas formas... Me subí a las barbas... del código, en general. Intenté sobrevenirme en cuanto a la cosas que comprendo y tengo control, y evidentemente, me abrumé.
Más aún cuando, con el ansia de ver algo físico reprensentado en la pantalla de mi ordenador (como se puede ver en el código) usé Swing para hacer la interfaz interactiva. Algo logré, sin saber bien muy cómo. Pero no es lo que quiero. En parte sí, pero mi falta de conocimiento y el auto-atosigamiento por el querer algo YA me ha hecho dar marcha atrás en el desarrollo en Java.
┌──────────────────────────────────────────────────────────────────┐ │ │ │ ┌───────────────────────────┐ ┌──────────────────────────────┐ │ │ │>. narración _________ │ │ │ │ │ │ │ ┼──────────────────────────────┼ │ │ │ ____________ │ │ │ │ │ │ ___________________ │ │ │ │ │ │ _________ │ │ │ │ │ │ │ │ │ │ │ │ 1. │ │ │ │ │ │ 2. │ │ │ │ │ │ 3. (opciones del jugador)│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┼──────────────────────────────┤ │ │ │ │ │┌────────┐┌───────┐┌─────────┐│ │ │ │ │ ││ ││ ││ ││ │ │ │┌─────────────────────────┐│ │└────────┘└───────┘└─────────┘│ │ │ ││>. (input del jugador) ││ │┌────────┐┌────────┐┌───────┐ │ │ │ ││ ││ ││ ││ ││ │ │ │ │ │└─────────────────────────┘│ │└────────┘└────────┘└───────┘ │ │ │ └───────────────────────────┘ └──────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────────┘
Lo dibujado en los carácteres de arriba pretende representar, grosso modo, cómo pretendo que sea la GUI del juego. Algo sencillo.
- En el rectángulo de la izquierda se representa todos los elementos textuales de la narración o los menús.
- En el rectángulo de la derecha se presenta toda la información gráfica. Tiene, generalmente, dos funciones:
- Muestra del mapa de la mazmorra por donde se mueve el jugador. Diseñado en ASCII. Supone la única interacción directa con un espacio abierto.
- Muestra las imágenes pertinentes de los eventos que ocurran al interaccionar o ser interaccionado. p.e. Un combate, una tienda, una conversación, abrir un cofre ...
- Las secciones de abajo representan los perosnajes pertenecientes a la party del jugador (y el jugador), siendo seis el número máximo
- Todas las interacciones del jugador se representan mediante inputs de texto en la caja de comando en el rectángulo de la izquierda.
Hecho todo aquello, intenté volver a RPG Maker. Craso error. Jamás.
Y ahora estoy enfrascado en un proyecto secundario para intentar, de alguna manera, comprender los macros del Harlow en Twine 2... Deseenme suerte.
No hay comentarios:
Publicar un comentario