Skip to content

Instantly share code, notes, and snippets.

@michaelfairley
Last active July 5, 2018 18:01
Show Gist options
  • Save michaelfairley/bd3b5c85a500d0ae01f76cdd6f95f606 to your computer and use it in GitHub Desktop.
Save michaelfairley/bd3b5c85a500d0ae01f76cdd6f95f606 to your computer and use it in GitHub Desktop.
struct Playing {
state: GameState,
event_queue: VecDeque<Vec<Event>>,
event_time: f32,
}
impl Playing {
fn handle_input(&mut self, input: InputEvent) {
match input_event {
KeyboardInput(Key::Right) => self.event_queue.extend(self.state.handle(Dir::Right)),
// ...,
}
}
fn advance(&mut self, delta_t: f32) {
if events.is_empty() { return; }
self.event_time += delta_t * how_fast_i_want_things_to_animate * self.event_queue.size();
if self.event_time > 1.0 {
let events = self.event_queue.pop_front().unwrap();
for event in events {
self.state.apply(&event);
}
if let Some(front) = self.event_queue.front() {
for event in events {
event.play_sound_effect();
}
}
self.event_time = 0.0;
}
}
fn draw_stuff(&self) {
let player_movement = self.events.iter().find(|e| matches!(e, Event::PlayerMove(_)));
let player_offset = match player_movement {
None => v3(0.0, 0.0, 0.0),
Some(Dir::Right) => v3(1.0, 0.0, 0.0),
// ...,
};
let player_location = self.state.player_location.to_v3() + player_offset * self.animation_time;
render_the_player_model(player_location);
// ...
}
}
struct GameState {
player_location: Vec2<i32>,
enemies: Vec<Enemy>,
// ...
}
impl GameState {
fn handle(&self, player_move_dir: Dir) -> Vec<Vec<Event>> {
let mut result = vec![];
result.push_back(vec![Event::PlayerMove(player_move_dir)]);
let mut enemy_reactions = vec![];
for (i, enemy) in self.enemies.iter().enumerate() {
enemy_reactions.push_back(Event::EnemyMove(i, Dir::random()))
}
// All the enemies move simultaneously
result.push_back(enemy_reactions);
result
}
impl apply(&mut self, event: &Event) {
match event {
Event::PlayerMove(dir) => self.player_location += dir,
Event::EnemyMove(i, dir) => self.enemies.location += dir,
// ...
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment