update examples with new input device and main loop event handling stuff

This commit is contained in:
Gered 2023-02-27 14:51:55 -05:00
parent 3dfb8fe466
commit f2f7ae5dee
7 changed files with 39 additions and 81 deletions

View file

@ -55,7 +55,6 @@ impl AudioGenerator for SineWaveGenerator {
fn main() -> Result<()> { fn main() -> Result<()> {
let mut system = SystemBuilder::new().window_title("Audio Playback").vsync(true).build()?; let mut system = SystemBuilder::new().window_title("Audio Playback").vsync(true).build()?;
let mut is_running = true;
let mut using_queue_commands = false; let mut using_queue_commands = false;
let mut volume = 1.0; let mut volume = 1.0;
@ -69,24 +68,15 @@ fn main() -> Result<()> {
let mut statuses = [AudioChannelStatus { size: 0, position: 0, playing: false }; NUM_CHANNELS]; let mut statuses = [AudioChannelStatus { size: 0, position: 0, playing: false }; NUM_CHANNELS];
while is_running { while !system.do_events() {
system.do_events_with(|event| { if system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
match event { break;
SystemEvent::Quit => {
is_running = false;
},
_ => {}
}
});
if system.keyboard.is_key_pressed(Scancode::Escape) {
is_running = false;
} }
let mut audio_device = system.audio.lock(); let mut audio_device = system.audio.lock();
audio_device.volume = volume; audio_device.volume = volume;
if system.keyboard.is_key_pressed(Scancode::Num1) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num1) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_buffer(&sounds[0], false); system.audio_queue.play_buffer(&sounds[0], false);
} else { } else {
@ -94,7 +84,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::Num2) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num2) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_buffer(&sounds[1], false); system.audio_queue.play_buffer(&sounds[1], false);
} else { } else {
@ -102,7 +92,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::Num3) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num3) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_buffer(&sounds[2], false); system.audio_queue.play_buffer(&sounds[2], false);
@ -111,7 +101,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::Num4) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num4) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_buffer(&sounds[3], false); system.audio_queue.play_buffer(&sounds[3], false);
@ -120,7 +110,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::Num5) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num5) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_buffer(&sounds[4], false); system.audio_queue.play_buffer(&sounds[4], false);
} else { } else {
@ -128,7 +118,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::Num6) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num6) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_generator(Box::new(SineWaveGenerator::new()), false); system.audio_queue.play_generator(Box::new(SineWaveGenerator::new()), false);
} else { } else {
@ -136,7 +126,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::Num7) { if system.input_devices.keyboard.is_key_pressed(Scancode::Num7) {
let index = rnd_value(0, sounds.len() - 1); let index = rnd_value(0, sounds.len() - 1);
if using_queue_commands { if using_queue_commands {
system.audio_queue.play_buffer_on_channel(7, &sounds[index], false)?; system.audio_queue.play_buffer_on_channel(7, &sounds[index], false)?;
@ -145,7 +135,7 @@ fn main() -> Result<()> {
} }
} }
if system.keyboard.is_key_pressed(Scancode::S) { if system.input_devices.keyboard.is_key_pressed(Scancode::S) {
if using_queue_commands { if using_queue_commands {
system.audio_queue.stop_all(); system.audio_queue.stop_all();
} else { } else {
@ -155,13 +145,13 @@ fn main() -> Result<()> {
system.audio_queue.apply_to_device(&mut audio_device)?; system.audio_queue.apply_to_device(&mut audio_device)?;
if system.keyboard.is_key_pressed(Scancode::KpMinus) { if system.input_devices.keyboard.is_key_pressed(Scancode::KpMinus) {
volume -= 0.1; volume -= 0.1;
} }
if system.keyboard.is_key_pressed(Scancode::KpPlus) { if system.input_devices.keyboard.is_key_pressed(Scancode::KpPlus) {
volume += 0.1; volume += 0.1;
} }
if system.keyboard.is_key_pressed(Scancode::Q) { if system.input_devices.keyboard.is_key_pressed(Scancode::Q) {
using_queue_commands = !using_queue_commands; using_queue_commands = !using_queue_commands;
} }

View file

@ -27,8 +27,6 @@ fn main() -> Result<()> {
.vsync(true) .vsync(true)
.build()?; .build()?;
let mut is_running = true;
let font = BitmaskFont::new_vga_font()?; let font = BitmaskFont::new_vga_font()?;
let (balls_bmp, balls_palette) = Bitmap::load_pcx_file(Path::new("./assets/balls.pcx"))?; let (balls_bmp, balls_palette) = Bitmap::load_pcx_file(Path::new("./assets/balls.pcx"))?;
@ -61,21 +59,12 @@ fn main() -> Result<()> {
balls.push(ball); balls.push(ball);
} }
while is_running { while !system.do_events() {
system.do_events_with(|event| { if system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
match event { break;
SystemEvent::Quit => {
is_running = false;
},
_ => {}
}
});
if system.keyboard.is_key_pressed(Scancode::Escape) {
is_running = false;
} }
if system.keyboard.is_key_up(Scancode::S) { if system.input_devices.keyboard.is_key_up(Scancode::S) {
for i in 0..NUM_BALLS { for i in 0..NUM_BALLS {
let ball = &mut balls[i]; let ball = &mut balls[i];
ball.x += ball.dir_x; ball.x += ball.dir_x;

View file

@ -17,21 +17,10 @@ fn main() -> Result<()> {
let mut states = States::new(); let mut states = States::new();
states.push(SimulationState)?; states.push(SimulationState)?;
let mut is_running = true;
let tick_frequency = game.context.system.tick_frequency(); let tick_frequency = game.context.system.tick_frequency();
let mut last_ticks = game.context.system.ticks(); let mut last_ticks = game.context.system.ticks();
while is_running && !states.is_empty() { while !game.context.system.do_events() && !states.is_empty() {
game.context.system.do_events_with(|event| {
match event {
SystemEvent::Quit => {
is_running = false;
},
_ => {}
}
});
let ticks = game.context.system.ticks(); let ticks = game.context.system.ticks();
let elapsed = ticks - last_ticks; let elapsed = ticks - last_ticks;
last_ticks = ticks; last_ticks = ticks;

View file

@ -78,12 +78,12 @@ pub struct SimulationState;
impl AppState<Game> for SimulationState { impl AppState<Game> for SimulationState {
fn update(&mut self, _state: State, context: &mut Game) -> Option<StateChange<Game>> { fn update(&mut self, _state: State, context: &mut Game) -> Option<StateChange<Game>> {
if context.context.system.keyboard.is_key_up(Scancode::S) { if context.context.system.input_devices.keyboard.is_key_up(Scancode::S) {
context.do_events(); context.do_events();
context.component_systems.update(&mut context.context); context.component_systems.update(&mut context.context);
} }
if context.context.system.keyboard.is_key_pressed(Scancode::Escape) { if context.context.system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
return Some(StateChange::Pop(1)); return Some(StateChange::Pop(1));
} }

View file

@ -27,17 +27,17 @@ impl MainMenuState {
impl AppState<Game> for MainMenuState { impl AppState<Game> for MainMenuState {
fn update(&mut self, state: State, context: &mut Game) -> Option<StateChange<Game>> { fn update(&mut self, state: State, context: &mut Game) -> Option<StateChange<Game>> {
if state == State::Active { if state == State::Active {
if context.core.system.keyboard.is_key_pressed(Scancode::Escape) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
return Some(StateChange::Pop(1)); return Some(StateChange::Pop(1));
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Up) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Up) {
self.selection = (self.selection - 1).clamp(0, 1); self.selection = (self.selection - 1).clamp(0, 1);
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Down) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Down) {
self.selection = (self.selection + 1).clamp(0, 1); self.selection = (self.selection + 1).clamp(0, 1);
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Return) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Return) {
match self.selection { match self.selection {
0 => return Some(StateChange::Push(Box::new(GamePlayState::new()))), 0 => return Some(StateChange::Push(Box::new(GamePlayState::new()))),
1 => return Some(StateChange::Pop(1)), 1 => return Some(StateChange::Pop(1)),
@ -113,17 +113,17 @@ impl AppState<Game> for GamePlayState {
fn update(&mut self, state: State, context: &mut Game) -> Option<StateChange<Game>> { fn update(&mut self, state: State, context: &mut Game) -> Option<StateChange<Game>> {
if state == State::Active { if state == State::Active {
if self.in_menu { if self.in_menu {
if context.core.system.keyboard.is_key_pressed(Scancode::Escape) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
self.in_menu = false; self.in_menu = false;
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Up) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Up) {
self.selection = (self.selection - 1).clamp(0, 1); self.selection = (self.selection - 1).clamp(0, 1);
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Down) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Down) {
self.selection = (self.selection + 1).clamp(0, 1); self.selection = (self.selection + 1).clamp(0, 1);
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Return) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Return) {
match self.selection { match self.selection {
0 => self.in_menu = false, 0 => self.in_menu = false,
1 => return Some(StateChange::Pop(1)), 1 => return Some(StateChange::Pop(1)),
@ -131,24 +131,24 @@ impl AppState<Game> for GamePlayState {
} }
} }
} else { } else {
if context.core.system.keyboard.is_key_pressed(Scancode::Escape) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
self.in_menu = true; self.in_menu = true;
} }
if let Some((player_entity, _)) = context.core.entities.components::<Player>().single() { if let Some((player_entity, _)) = context.core.entities.components::<Player>().single() {
if context.core.system.keyboard.is_key_down(Scancode::Up) { if context.core.system.input_devices.keyboard.is_key_down(Scancode::Up) {
context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::North)); context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::North));
} }
if context.core.system.keyboard.is_key_down(Scancode::Down) { if context.core.system.input_devices.keyboard.is_key_down(Scancode::Down) {
context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::South)); context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::South));
} }
if context.core.system.keyboard.is_key_down(Scancode::Left) { if context.core.system.input_devices.keyboard.is_key_down(Scancode::Left) {
context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::West)); context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::West));
} }
if context.core.system.keyboard.is_key_down(Scancode::Right) { if context.core.system.input_devices.keyboard.is_key_down(Scancode::Right) {
context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::East)); context.core.event_publisher.queue(Event::TurnAndMove(*player_entity, Direction::East));
} }
if context.core.system.keyboard.is_key_pressed(Scancode::Space) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Space) {
context.core.event_publisher.queue(Event::Attack(*player_entity)); context.core.event_publisher.queue(Event::Attack(*player_entity));
} }
} }

View file

@ -100,7 +100,7 @@ impl DemoState {
impl AppState<App> for DemoState { impl AppState<App> for DemoState {
fn update(&mut self, state: State, context: &mut App) -> Option<StateChange<App>> { fn update(&mut self, state: State, context: &mut App) -> Option<StateChange<App>> {
if state == State::Active { if state == State::Active {
if context.core.system.keyboard.is_key_pressed(Scancode::Escape) { if context.core.system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
return Some(StateChange::Pop(1)) return Some(StateChange::Pop(1))
} }
} }

View file

@ -8,24 +8,14 @@ use libretrogd::utils::rnd_value;
fn main() -> Result<()> { fn main() -> Result<()> {
let mut system = SystemBuilder::new().window_title("Minimal Template").vsync(true).build()?; let mut system = SystemBuilder::new().window_title("Minimal Template").vsync(true).build()?;
let mut is_running = true;
let font = BitmaskFont::new_vga_font()?; let font = BitmaskFont::new_vga_font()?;
system.video.clear(0); system.video.clear(0);
system.video.print_string("Hello, world!", 20, 20, FontRenderOpts::Color(15), &font); system.video.print_string("Hello, world!", 20, 20, FontRenderOpts::Color(15), &font);
while is_running { while !system.do_events() {
system.do_events_with(|event| { if system.input_devices.keyboard.is_key_pressed(Scancode::Escape) {
match event { break;
SystemEvent::Quit => {
is_running = false;
},
_ => {}
}
});
if system.keyboard.is_key_pressed(Scancode::Escape) {
is_running = false;
} }
let x = rnd_value(0, SCREEN_RIGHT) as i32; let x = rnd_value(0, SCREEN_RIGHT) as i32;