aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vscode/launch.json1
-rw-r--r--src/main.rs4
-rw-r--r--src/viewport.rs35
3 files changed, 23 insertions, 17 deletions
diff --git a/.vscode/launch.json b/.vscode/launch.json
index e2e657d..981f449 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -22,6 +22,7 @@
"program": "${workspaceRoot}/target/debug/roguelike",
"args": [],
"cwd": "${workspaceRoot}",
+ "terminal": "external"
}
]
} \ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index 3f7f81c..bed0c8d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -16,8 +16,8 @@ use state::State;
use viewport::{CrossTermViewPort, ViewPort};
use world::Dungeon;
-const DUNGEON_SIZE_X: usize = 20;
-const DUNGEON_SIZE_Y: usize = 20;
+const DUNGEON_SIZE_X: usize = 80;
+const DUNGEON_SIZE_Y: usize = 24;
const DUNGEON_DEPTH: usize = 5;
fn player_name() -> String {
diff --git a/src/viewport.rs b/src/viewport.rs
index 1fd13aa..7b4fb3e 100644
--- a/src/viewport.rs
+++ b/src/viewport.rs
@@ -2,7 +2,7 @@ use crate::events::ViewportEvent;
use crate::world::{DOWN, LEFT, RIGHT, UP};
use crossterm::cursor;
use crossterm::cursor::MoveTo;
-use crossterm::input::{input, InputEvent, KeyEvent, SyncReader};
+use crossterm::input::{input, InputEvent, KeyEvent, TerminalInput};
use crossterm::screen::{EnterAlternateScreen, LeaveAlternateScreen, RawScreen};
use crossterm::terminal;
use crossterm::{execute, queue, Output};
@@ -15,12 +15,14 @@ use crate::tiling::tile_to_str;
pub trait ViewPort {
fn render_state(&mut self, state: &State);
+ fn wait_input(&mut self) -> Option<ViewportEvent>;
}
pub struct CrossTermViewPort {
xsize: usize,
ysize: usize,
- reader: SyncReader,
+ raw: RawScreen,
+ input: TerminalInput,
start: (usize, usize),
}
@@ -31,7 +33,7 @@ impl CrossTermViewPort {
let term_size = terminal::size().unwrap();
execute!(stdout(), EnterAlternateScreen).unwrap();
execute!(stdout(), cursor::Hide).unwrap();
- let _raw = RawScreen::into_raw_mode();
+ let raw = RawScreen::into_raw_mode().unwrap();
// Initialise state, create the player and dungeon
let xsize = term_size.0 as usize;
@@ -42,7 +44,8 @@ impl CrossTermViewPort {
CrossTermViewPort {
xsize,
ysize,
- reader: input.read_sync(),
+ raw,
+ input,
start: (0, 0),
}
}
@@ -129,9 +132,20 @@ impl CrossTermViewPort {
"quit: q, movement{up(k), down(j), left(h), right(l)}",
))
}
+}
+
+impl ViewPort for CrossTermViewPort {
+ fn render_state(&mut self, state: &State) {
+ self.draw_level(state);
+ self.draw_entities(state);
+ self.draw_player(state);
+ self.draw_ui(state);
+ }
+
+ fn wait_input(&mut self) -> Option<ViewportEvent> {
+ let mut reader = self.input.read_sync();
- pub fn wait_input(&mut self) -> Option<ViewportEvent> {
- if let Some(event) = self.reader.next() {
+ if let Some(event) = reader.next() {
return match event {
InputEvent::Keyboard(KeyEvent::Char('q')) => Some(ViewportEvent::Quit),
InputEvent::Keyboard(KeyEvent::Char('?')) => {
@@ -160,15 +174,6 @@ impl CrossTermViewPort {
}
}
-impl ViewPort for CrossTermViewPort {
- fn render_state(&mut self, state: &State) {
- self.draw_level(state);
- self.draw_entities(state);
- self.draw_player(state);
- self.draw_ui(state);
- }
-}
-
impl Drop for CrossTermViewPort {
fn drop(&mut self) {
execute!(stdout(), LeaveAlternateScreen).unwrap();