Struct ascii_forge::prelude::KeyEvent
source · pub struct KeyEvent {
pub code: KeyCode,
pub modifiers: KeyModifiers,
pub kind: KeyEventKind,
pub state: KeyEventState,
}
Expand description
Represents a key event.
Fields§
§code: KeyCode
The key itself.
modifiers: KeyModifiers
Additional key modifiers.
kind: KeyEventKind
Kind of event.
Only set if:
- Unix:
KeyboardEnhancementFlags::REPORT_EVENT_TYPES
has been enabled withPushKeyboardEnhancementFlags
. - Windows: always
state: KeyEventState
Keyboard state.
Only set if KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
has been enabled with
PushKeyboardEnhancementFlags
.
Implementations§
source§impl KeyEvent
impl KeyEvent
sourcepub const fn new(code: KeyCode, modifiers: KeyModifiers) -> KeyEvent
pub const fn new(code: KeyCode, modifiers: KeyModifiers) -> KeyEvent
Examples found in repository?
examples/event_visualizer.rs (line 29)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
fn main() -> Result<(), Box<dyn Error>> {
let mut event = Event::FocusGained;
let mut window = Window::init()?;
if !window.supports().keyboard() {
window.restore()?;
eprintln!("This game does not support this terminal.\nIf Curious, look up terminals that support the kitty keyboard protocol");
return Err("Terminal Unsupported".into());
}
loop {
window.update(Duration::ZERO)?;
if let Some(new_event) = window.event() {
event = new_event.clone();
}
render!(
window, [
vec2(0, 20) => "To Quit, Press Ctrl + C".red(),
vec2(0, 0) => format!("{:#?}", event).replace('\t', " "),
]
);
if window.key(KeyEvent::new(KeyCode::Char('c'), KeyModifiers::CONTROL)) {
break;
}
}
Ok(())
}
More examples
examples/inline.rs (line 40)
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
fn progress_bar() -> io::Result<()> {
let mut window = Window::init_inline(2)?;
let timer = SystemTime::now();
let duration = Duration::from_secs(3);
// The Inline Render Loop
loop {
// Render's the Window and captures events
window.update(Duration::ZERO)?;
let amount_done = SystemTime::now().duration_since(timer).unwrap();
let percent = amount_done.as_secs_f64() / duration.as_secs_f64();
if percent >= 1.0 {
break;
}
let x = (window.size().x as f64 * percent).round() as u16;
// Create the progress bar text
let text_green = "|".repeat(x as usize).green();
let text_red = "|".repeat((window.size().x - x) as usize).red();
// Render the Progress Bar
render!(window, [
vec2(0, 1) => text_green,
vec2(x, 1) => text_red,
vec2(0, 0) => "Progress"
]);
// End the loop if key is pressed early
if window.key(KeyEvent::new(KeyCode::Char('c'), KeyModifiers::CONTROL)) {
break;
}
}
window.restore()
}
examples/space_invaders.rs (line 277)
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
pub fn app(window: &mut Window) -> io::Result<String> {
let mut score = 0;
let mut player = Player::new(window, 'W'.green());
let mut projectiles = vec![];
let mut enemies = vec![];
let mut delta = Duration::ZERO;
let mut spawner = Duration::from_millis(800);
let mut move_timer = Duration::from_millis(200);
let mut shoot_timer = Duration::from_millis(500);
let info_text = Buffer::sized_element("Press C-q to quit");
// Main Game Loop
loop {
let start = SystemTime::now();
// update the window, without blocking the screen
window.update(Duration::from_secs_f64(1.0 / 60.0))?;
if window.code(KeyCode::Char(' ')) {
projectiles.push(Projectile::new(
vec2(player.loc.x - 1, player.loc.y - 1),
-0.3,
"|||".green(),
))
}
// Render and update projectiles
projectiles.retain(|x| x.alive(window));
projectiles.iter_mut().for_each(|x| {
x.update();
x.draw(window);
});
// Render and update the player.
player.update(window);
player.draw(window);
match spawner.checked_sub(delta) {
Some(s) => spawner = s,
None => {
enemies.push(Enemy::new(vec2(0, 3), 'M'.red(), 10));
spawner = Duration::from_secs(2);
}
}
match move_timer.checked_sub(delta) {
Some(m) => move_timer = m,
None => {
if enemies.iter_mut().any(|x| x.enemy_move(window)) {
return Ok(format!("Game Over\nScore was: {}", score));
}
move_timer = Duration::from_millis(200);
}
}
if player.hit(&projectiles) {
return Ok(format!("Game Over\nScore was: {}", score));
}
match shoot_timer.checked_sub(delta) {
Some(s) => shoot_timer = s,
None => {
enemies.iter_mut().for_each(|x| {
projectiles.push(Projectile::new(vec2(x.loc.x, x.loc.y + 1), 0.3, "|".red()))
});
shoot_timer = Duration::from_millis(500);
}
}
enemies.retain_mut(|x| {
if x.hit(&projectiles) {
score += x.score;
false
} else {
true
}
});
enemies.iter_mut().for_each(|x| x.draw(window));
render!(
window, [
vec2(0, 0) => format!("Score: {}", score),
vec2(window.size().x - info_text.size().x, 0) => info_text
]
);
if window.key(KeyEvent::new(KeyCode::Char('c'), KeyModifiers::CONTROL)) {
break;
}
delta = SystemTime::now().duration_since(start).unwrap();
}
Ok("Game Exited".to_string())
}
sourcepub const fn new_with_kind(
code: KeyCode,
modifiers: KeyModifiers,
kind: KeyEventKind
) -> KeyEvent
pub const fn new_with_kind( code: KeyCode, modifiers: KeyModifiers, kind: KeyEventKind ) -> KeyEvent
Examples found in repository?
examples/space_invaders.rs (lines 69-73)
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
pub fn update(&mut self, window: &mut Window) {
if window.key(KeyEvent::new_with_kind(
KeyCode::Right,
KeyModifiers::NONE,
KeyEventKind::Press,
)) {
self.input = 1;
} else if window.key(KeyEvent::new_with_kind(
KeyCode::Right,
KeyModifiers::NONE,
KeyEventKind::Release,
)) {
self.input = self.input.min(0);
}
if window.key(KeyEvent::new_with_kind(
KeyCode::Left,
KeyModifiers::NONE,
KeyEventKind::Press,
)) {
self.input = -1;
} else if window.key(KeyEvent::new_with_kind(
KeyCode::Left,
KeyModifiers::NONE,
KeyEventKind::Release,
)) {
self.input = self.input.max(0);
}
self.loc.x = (self.loc.x as i32 + self.input).clamp(0, window.size().x as i32) as u16;
}
pub const fn new_with_kind_and_state( code: KeyCode, modifiers: KeyModifiers, kind: KeyEventKind, state: KeyEventState ) -> KeyEvent
Trait Implementations§
source§impl PartialEq for KeyEvent
impl PartialEq for KeyEvent
source§impl PartialOrd for KeyEvent
impl PartialOrd for KeyEvent
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self
and other
) and is used by the <=
operator. Read moreimpl Copy for KeyEvent
impl Eq for KeyEvent
Auto Trait Implementations§
impl RefUnwindSafe for KeyEvent
impl Send for KeyEvent
impl Sync for KeyEvent
impl Unpin for KeyEvent
impl UnwindSafe for KeyEvent
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more