2013-03-20 11 views
6

Sto provando a elaborare un gioco basato sul testo di base mentre sto imparando Java. Mi piacerebbe poter contare i giri del gioco come mezzo per gestire il ritmo di determinati eventi. Ad esempio, gli spogliatoi potrebbero essere limitati a una volta per round (un secondo, nel codice di test.) Una piccola creatura potrebbe attaccare o cambiare stanze a una velocità maggiore, mentre una più grande potrebbe essere più ingombrante. Bene finora? Grande.Gestione del tempo in un gioco basato su testo (Java)

Così, ho preparato questo e ho subito capito che avrei colpito un blocco ogni volta che il ciclo di attesa ha aspettato che il giocatore inserisse un comando. Codice:

private void startPlaying() { 
    //declare clock/round variables. 
    int lastRound = 0; 
    int currentRound = 0; 
    long lastTime = System.currentTimeMillis(); 
    long currentTime; 

    while (player.getIsPlaying()){ 
     //Clocking 
     currentTime = System.currentTimeMillis(); 
     if ((lastTime + 1000) < currentTime) { 
      lastTime = currentTime; 
      lastRound = currentRound; 
      currentRound++; 
      System.out.println("Current round:\t" + currentRound + "\tCurrent time:\t" + currentTime); //EDIT:NOTE: This is just a test line to observe the loop. 
     }//end if (Clocking) 

     Command command = new Command(); 
     String[] commandString = command.setAll(); //Array gets parsed elsewhere. 
     player.doCommand(commandString); 
     //Class Player extends Pawn extends Actor; Pawn has most command methods. 
    } 
    finishPlaying(); 
}//END STARTPLAYING() 

Quindi, ecco la mia domanda:

C'è un modo ho potuto utilizzare un metodo separato per registrare il tempo/arrotonda concomitante al loop mentre presenta il giocatore con un prompt dei comandi?

In caso contrario, c'è un modo diverso per rendere questo un non-problema che non sto ancora vedendo/praticato in ancora?

risposta

4

Dai uno sguardo allo Concurrency tutorial. Con i thread è possibile attendere l'input dell'utente senza arrestare altri processi (e rendere questi altri processi eseguiti allo stesso tempo, non in parallelo, ma in time-sharing).

+0

Suppongo che il tutorial di Oracle sarebbe stato un punto di partenza più ragionevole.Up-voting una volta che ho la reputazione. – eenblam

1

Si chiama "loop di gioco" che consente al gioco di funzionare senza problemi indipendentemente dall'input dell'utente.

La soluzione più semplice - creare 2 fili, Frist attenderà per l'input dell'utente e la mette in ConcurrentLinkedQueue con una capacità 1. Il secondo filo verrà eseguito il vostro ciclo di gioco e prende l'input dell'utente dalla coda per elaborarlo se coda non è vuota .

È possibile utilizzare qualsiasi struttura dati che si desidera scambiare dati tra 2 thread, può essere anche variabile variabile volatile. Gli unici requisiti per leggere l'accesso in scrittura a questa variabile dovrebbero essere sincronizzati in qualche modo.

+0

Fantastico, grazie per la spiegazione concisa. Probabilmente avrò bisogno di dedicare un po 'di tempo ai documenti, ma sembra abbastanza fattibile. – eenblam

1

Un'avventura di testo in tempo reale? Sembra interessante. Non suggerirei di provare a fare concorrenza per questo particolare problema, ci sono modi più semplici.

Normalmente non si configura il blocco in ingresso con il tempo in secondi. A meno che tu non abbia il tuo cuore fisso su questo design, ti suggerirei entrambi.

1) Non bloccare l'input dell'utente. Scrivi il tuo codice di gestione degli input controllando la pressione dei tasti su ciascun fotogramma. Quindi puoi semplicemente calcolare la differenza di tempo tra le iterazioni. Per esempio. un mostro si muove di 1 secondo di blocco, quindi se l'iterazione del loop corrente ha richiesto 100 ms, si sposta di 0.1 blocchi. (memorizzare questi valori come float s internamente, anche se si disegna su una griglia di testo

2) Incrementare il tempo di gioco in "tick" in base all'input dell'utente. Questo sarebbe NetHack/Roguelike-style. I mostri possono muovere così tanti blocchi per tick, anziché per secondo.

+0

Pensato al metodo tick, ma non riesco a vedere che il trasferimento a un'implementazione multiplayer, che sarebbe un bel progetto per il futuro. Apprezzo anche l'approccio alternativo nell'opzione 1, poiché sarebbe un progetto illuminante di per sé. Probabilmente userò i thread comunque solo per impararli (l'obiettivo originale) e quindi implementare questa gestione dell'input all'interno di quel thread. – eenblam

1

Sì, c'è un modo. Dovresti inserire il codice "Round Counting" nel proprio Thread, in modo che non venga bloccato dall'utente in attesa di immettere dati. Il pacchetto java.util.concurrency può essere d'aiuto.

Vedere Java Doc il metodo scheduleAtFixedRate() eseguirà una eseguibile a intervalli fissi. Il codice "round counting" verrebbe spostato in una classe che implementa l'interfaccia runnable. E questo sarebbe eseguito all'intervallo di tempo impostato. Questo è abbastanza avanzato però.

Problemi correlati