2011-02-02 13 views
9

OK, sembrerà una pazza idea - ma mi interessa emulare un'interfaccia di testo in stile anni 80 roguelike game in puro Java, cioè utilizzando Swing o simili.Interfaccia di testo Java puro per un gioco roguelike

Ecco più o meno quello che deve fare:

  • Fornire una griglia fissa dimensione dei caratteri di dimensioni fisse come "schermo" (ad esempio 100 * 75)
  • Utilizzare un font a spaziatura fissa appropriata, idealmente con un sacco di simboli interessanti
  • consentire l'impostazione di primo piano e di carattere colori di sfondo per ogni posizione di carattere individuale
  • permettere la stampa di stringhe o singoli caratteri in qualsiasi punto dello schermo (che dovrebbe sovrascrivere tutto ciò che è già presente nel buffer dello schermo in quelle posizioni)

Qualcuno sa di una buona soluzione esistente che consentirebbe questo? O sono bloccato con l'hacking uno insieme da zero?

p.s. il motivo per cui voglio Java puro è che possa essere eseguito in un'applet sandbox. Quindi le soluzioni JNI come jcurses sono tristemente escluse .....

+0

possibile duplicato [Java/swing: componente della console?] (Http://stackoverflow.com/questions/2806012/java-swing-console-component) –

+1

Mi ricordo quando ho suonato Angband per la prima volta, era così tanto tempo fa che la gente non sembrava nemmeno a me come se fossi pazzo. :) – biziclop

risposta

9
Non folle affatto

, questo è l'approccio ho implementato in legerdemain: http://roguelikefiction.com

ho usato un array bidimensionale di caratteri (char [] []) con una corrispondente matrice di java.awt.Color [] [] oggetti per tracciare i colori. È possibile inserire questi array in una classe che eredita da JPanel (che a sua volta fa parte di un JFrame) e eseguire tutto il disegno nel callback paintComponent() del pannello.

Niente di sbagliato con l'approccio Maledizioni/JNI, anche se si ottengono tutti i tipi di grandi glifi Unicode se si utilizza la rotta Swing. Legerdemain ne usa cinque o seicento.

+1

Grazie, ho finito per implementare qualcosa di molto simile a questo - disponibile qui per chiunque sia interessato: http://code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/main/java/mikera /ui/JConsole.java – mikera

+0

ps quali font Unicode hai trovato meglio per glifi roguelike? – mikera

+1

@mikera Courier New e Lucida Sans Typewriter. Sono entrambi a larghezza fissa, garantita per essere disponibile dal runtime Java e contengono molti glifi. –

2

Una volta (anni fa) ho iniziato a codificare qualcosa del genere (un'implementazione del terminale in Swing). Sono arrivato al punto di poter visualizzare testo con sequenze di escape ANSI per il movimento del cursore e i colori al suo interno, ma non ho implementato alcun input. Se sei interessato, lo scaverò.

+0

Due voti positivi (grazie), ma nessun commento che dice che dovrei scavare? Okay, quindi questo rimarrà nelle profondità del mio disco rigido ... –

3

Fornire una griglia fissa dimensione dei caratteri fissi formato come "schermata" (es 100 * 75)

stringa [] schermo = new string [75], quindi basta compilare ciascuno con 100 spazi :).

Utilizzare un font a spaziatura fissa appropriata, idealmente con un sacco di interessanti simboli

vedere questo link per alcuni buoni: http://cg.scs.carleton.ca/~luc/mono.html

consentire l'impostazione di primo piano e carattere di fondo colori per ciascuna posizione carattere singolarmente

Si potrebbero avere quegli effetti di testo usando un controllo che consente il rendering di HTML come il JEditorPane. In questo modo è possibile definire parole chiave speciali come "parola chiave speciale". (Ok questo è un po 'deprecato ma dovrebbe funzionare bene per il tuo caso. Sarebbe più semplice se memorizzi il tuo "stato di gioco" come una semplice stringa (array), ma fai il rendering html appena prima di farlo uscire.

Consenti la stampa di stringhe o singoli caratteri in qualsiasi punto dello schermo (che dovrebbe sovrascrivere tutto ciò che è già presente nel buffer dello schermo in quei luoghi)

Se avete seguito il mio consiglio a la domanda precedente di quanto tu abbia il tuo gamestate come un normale array di stringhe, poi trovi la stringa per la tua linea, trova usa string.substring (length) + "A" + string.substring (startindex: length + 2, string.length - (lunghezza + 2)); per costruire il tuo nuovo gamestate.

4

Per progetti di questo tipo, ho trovato essenziale separare rigorosamente il modello di gioco e la vista. Questo semplice example suggerisce l'architettura generale e questo più complesso game si espande sulla nozione. Il vantaggio è che la vista può evolversi separatamente dal gioco stesso, a cui non importa quale sia l'aspetto dell'ascolto.

Per i simboli, i glifi Unicode possono essere un'opzione accattivante, come suggerito in questo example.

2

Dato che stai parlando di interfacce canaglia e basate sui personaggi per rendere completo il viaggio fino al passato, perché non vai su Google per un'implementazione Curses C e fai la Vista con JNI. Il tuo modello e controller sono normali Java. Esiste un'implementazione Curses per quasi tutte le piattaforme.

+0

Sì, quello era il mio primo pensiero, ma mi piacerebbe che fosse in grado di eseguirlo in una sandbox senza privilegi .... quindi JNI non funzionerà: - ( – mikera

1

ho finito per l'attuazione di una semplice console di swing, ispirato molte delle risposte qui (! Grazie a tutti)

Per coloro che sono interessati, è disponibile qui:

Swing based Java text console

+1

: ora ospitato su GitHub come libreria separata: https://github.com/mikera/ swing-console – mikera