good-web-game 0.6.1

An alternative implementation of the ggez game engine, based on miniquad
Documentation
extern crate glam;
extern crate good_web_game as ggez;

use ggez::audio;
use ggez::event;
use ggez::graphics;
use ggez::input;
use ggez::{Context, GameResult};

use ggez::event::quit;
use quad_snd::PlaySoundParams;

struct MainState {
    sound: audio::Source,
    volume: f32,
}

impl MainState {
    fn new(ctx: &mut Context) -> GameResult<MainState> {
        let sound = audio::Source::new(ctx, "/sound.ogg")?;
        let s = MainState {
            sound,
            volume: PlaySoundParams::default().volume,
        };
        Ok(s)
    }

    fn play_once(&mut self, ctx: &mut Context) -> GameResult {
        self.sound.set_repeat(false);
        self.sound.play(ctx)
    }

    fn play_repeating(&mut self, ctx: &mut Context) -> GameResult {
        self.sound.set_repeat(true);
        self.sound.play(ctx)
    }

    fn stop(&self, ctx: &mut Context) -> GameResult {
        self.sound.stop(ctx)
    }

    fn increase_volume(&mut self, ctx: &mut Context) -> GameResult {
        self.volume += 0.1;
        self.sound.set_volume(ctx, self.volume)
    }

    fn decrease_volume(&mut self, ctx: &mut Context) -> GameResult {
        self.volume -= 0.1;
        self.sound.set_volume(ctx, self.volume)
    }
}

impl event::EventHandler<ggez::GameError> for MainState {
    fn update(
        &mut self,
        _ctx: &mut Context,
        _quad_ctx: &mut miniquad::GraphicsContext,
    ) -> GameResult {
        Ok(())
    }

    fn draw(&mut self, ctx: &mut Context, quad_ctx: &mut miniquad::GraphicsContext) -> GameResult {
        graphics::clear(ctx, quad_ctx, [0.1, 0.2, 0.3, 1.0].into());

        let text = graphics::Text::new("Press number key 1 to to play a sound,\n2 to play repeated,\n3 to stop,\nUp to increase volume,\nDown to decrease volume,\nor escape to quit.");
        graphics::draw(
            ctx,
            quad_ctx,
            &text,
            (glam::Vec2::new(100.0, 100.), graphics::Color::WHITE),
        )?;

        graphics::present(ctx, quad_ctx)?;
        Ok(())
    }

    fn key_down_event(
        &mut self,
        ctx: &mut Context,
        _quad_ctx: &mut miniquad::GraphicsContext,
        keycode: event::KeyCode,
        _keymod: input::keyboard::KeyMods,
        _repeat: bool,
    ) {
        match keycode {
            event::KeyCode::Key1 => self.play_once(ctx).unwrap(),
            event::KeyCode::Key2 => self.play_repeating(ctx).unwrap(),
            event::KeyCode::Key3 => self.stop(ctx).unwrap(),
            event::KeyCode::Up => self.increase_volume(ctx).unwrap(),
            event::KeyCode::Down => self.decrease_volume(ctx).unwrap(),
            event::KeyCode::Escape => {
                quit(ctx);
            }
            _ => (),
        }
    }
}

pub fn main() -> GameResult {
    ggez::start(
        ggez::conf::Conf::default().cache(Some(include_bytes!("resources.tar"))),
        |ctx, _quad_ctx| Box::new(MainState::new(ctx).unwrap()),
    )
}