copper-rs 1.0.0

Copper.rs is a simple library for 2D games written in Rust targeting HTML5.
Documentation

use wasm_bindgen::prelude::*;
use crate::io::MouseButton;

#[wasm_bindgen]
extern {
    fn copperCreatePointer(element_id: &str) -> usize;

    fn copperPointerIsMouse(pointer: usize) -> bool;
    fn copperPointerPressing(pointer: usize, button: usize) -> bool;
    fn copperPointerMouseX(pointer: usize) -> f32;
    fn copperPointerMouseY(pointer: usize) -> f32;
    fn copperPointerTouchCount(pointer: usize) -> usize;
    fn copperPointerTouchX(pointer: usize, index: usize) -> f32;
    fn copperPointerTouchY(pointer: usize, index: usize) -> f32;

    fn copperDropPointer(pointer: usize);
}

fn get_mouse_button_js(button: MouseButton) -> usize {
    match button {
        MouseButton::Left => 0,
        MouseButton::Scrollwheel => 1,
        MouseButton::Right => 2,
    }
}

pub struct Pointer {
    pointer: usize
}

impl Pointer {
    pub fn from_document() -> Pointer { Pointer { pointer: copperCreatePointer("") } }
    pub fn from_element(element_id: &str) -> Pointer { Pointer { pointer: copperCreatePointer(element_id) } }

    pub fn is_mouse(&self) -> bool { copperPointerIsMouse(self.pointer) }
    pub fn pressing(&self, button: MouseButton) -> bool { copperPointerPressing(self.pointer, get_mouse_button_js(button)) }
    pub fn mouse_x(&self) -> f32 { copperPointerMouseX(self.pointer) }
    pub fn mouse_y(&self) -> f32 { copperPointerMouseY(self.pointer) }

    pub fn is_touch(&self) -> bool { !copperPointerIsMouse(self.pointer) }
    pub fn touches(&self) -> Vec<[f32; 2]> {
        let mut result: Vec<[f32; 2]> = vec![[0.0; 2]; copperPointerTouchCount(self.pointer)];
        for i in 0..result.len() {
            result[i] = [copperPointerTouchX(self.pointer, i), copperPointerTouchY(self.pointer, i)];
        }
        result
    }
}

impl Drop for Pointer {
    fn drop(&mut self) {
        copperDropPointer(self.pointer);
    }
}