2011-02-02 12 views
9

Bien, esto va a sonar como una idea loca, pero me interesa emular una interfaz de texto roguelike game estilo años 80 en Java puro, es decir, usando Swing o similar.Interfaz de texto de Java pura para un juego roguelike

Aquí es más o menos lo que tiene que hacer:

  • Proporcionar una rejilla de tamaño fijo de caracteres de tamaño fijo como la "pantalla" (por ejemplo, 100 * 75)
  • Usar una fuente de espacio fijo apropiada, idealmente con una gran cantidad de símbolos interesantes
  • Permitir el ajuste de caracteres de primer plano y fondo para cada posición de carácter individual
  • Permitir la impresión de cadenas o caracteres individuales en cualquier lugar de la pantalla (que debe sobrescribir lo que ya está en la pantalla en esas ubicaciones)

¿Alguien sabe de una buena solución existente que permitiría esto? ¿O estoy atrapado con hackear uno desde cero?

p.s. la razón por la que quiero Java puro es para que pueda ejecutarse en un applet de espacio aislado. Así que las soluciones JNI como jcurses lamentablemente están descartadas .....

+0

posible duplicado de [Java/swing: ¿componente de la consola?] (Http://stackoverflow.com/questions/2806012/java-swing-console-component) –

+1

Recuerdo cuando jugué Angband por primera vez, hace tanto tiempo que la gente ni siquiera miraba a mí como si estuviera enojado. :) – biziclop

Respuesta

9
No loco en absoluto

, este es el enfoque que implementado en Legerdemain: http://roguelikefiction.com

I utiliza una matriz bidimensional de caracteres (char [] []) con una matriz correspondiente de java.awt.Color [] [] objetos para rastrear los colores. Puede insertar estas matrices en una clase que herede de JPanel (que a su vez es parte de un JFrame) y hacer todo el dibujo en la devolución de llamada paintComponent() del panel.

No hay nada de malo en el enfoque Curses/JNI tampoco, aunque obtienes todo tipo de glifos Unicode si vas a la ruta Swing. Legerdemain usa cinco o seiscientos de ellos.

+1

Gracias, terminé implementando algo muy similar a esto - disponible aquí para cualquier persona interesada: http://code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/main/java/mikera /ui/JConsole.java – mikera

+0

ps ¿Qué fuentes Unicode encontraste mejores para los glifos de roguelike? – mikera

+1

@mikera Courier New y Lucida Sans Typewriter. Ambas son de ancho fijo, garantizadas para estar disponibles por el tiempo de ejecución de Java, y contienen muchos glifos. –

2

Una vez (hace años) comencé a codificar algo como esto (una implementación de terminal en Swing). Llegué al punto en que podía mostrar texto con secuencias de escape ANSI para el movimiento del cursor y los colores en él, pero no implementé ninguna entrada. Si estás interesado, lo desenterraré.

+0

Dos votos (gracias), pero no hay comentarios que digan que debo excavar? De acuerdo, entonces esto permanecerá en lo más profundo de mi disco duro ... –

3

Proporcionar una rejilla de tamaño fijo de caracteres de tamaño fijo como la "pantalla" (por ejemplo 100 * 75)

string [] pantalla = new string [75], a continuación, sólo llene cada uno con 100 espacios :).

Utilice una fuente de espacio fijo apropiada, idealmente con una gran cantidad de interesantes símbolos

ver este enlaces para unos pocos buenos: http://cg.scs.carleton.ca/~luc/mono.html

Permitir ajuste de primer plano y personaje de fondo colores para cada posición de carácter individualmente

Puede tener esos efectos de texto usando un control que permita la representación de HTML como el JEditorPane. De esta forma, podría definir palabras clave especiales como "palabra clave especial". (De acuerdo, está un poco obsoleto, pero debería funcionar bien para su caso. Sería más fácil si almacena su "estado del juego" como una cadena normal (matriz), pero haga que el html se represente justo antes de que se emita.

Habilitar la impresión de cadenas o caracteres individuales en cualquier lugar en la pantalla (que debe sobrescribir lo que ya está en el búfer de pantalla en esos lugares)

Si has seguido mi consejo de la pregunta anterior que tiene su gamestate como una matriz de cuerdas normal, entonces usted acaba de encontrar la cuerda para su línea, encontrar el uso string.substring (longitud) + "A" + string.substring (startindex: length + 2, string.length - (longitud + 2)); para construir tu nuevo sistema de juego.

4

Para proyectos de este tipo, me pareció esencial separar rigurosamente el modelo y la vista del juego. Este simple example sugiere la arquitectura general, y este game más complejo se expande en la noción. El beneficio es que la vista puede evolucionar por separado del juego en sí, lo que no le importa cómo se ve la vista.

Para los símbolos, los glifos Unicode pueden ser una opción atractiva, como se sugiere en este example.

2

Como estás hablando de interfaces deshonestas y basadas en caracteres para completar el viaje al pasado, ¿por qué no buscas una implementación de Curses C y haces la Vista con JNI? Su modelo y controlador son Java de forma regular. Hay una implementación de Curses para casi todas las plataformas.

+0

Sí, eso fue lo primero que pensé, pero me gustaría poder ejecutarlo en un cajón de arena sin privilegios ... por lo tanto, JNI no funcionará: - ( – mikera

1

que terminó la implementación de una consola de oscilación simple, inspirado en muchas de las respuestas aquí (! Gracias a todos)

Para aquellos que estén interesados, está disponible aquí:

Swing based Java text console

+1

Actualización: ahora alojado en GitHub como una biblioteca separada: https://github.com/mikera/ columpio-consola – mikera

Cuestiones relacionadas