111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #[cfg(target_arch = "wasm32")]
 | |
| extern crate console_error_panic_hook;
 | |
| 
 | |
| use bevy::{
 | |
|     input::{
 | |
|         keyboard::KeyboardInput,
 | |
|         mouse::{MouseButtonInput, MouseMotion, MouseWheel},
 | |
|     },
 | |
|     prelude::*,
 | |
| };
 | |
| 
 | |
| fn main() {
 | |
|     #[cfg(target_arch = "wasm32")]
 | |
|     {
 | |
|         std::panic::set_hook(Box::new(console_error_panic_hook::hook));
 | |
|         console_log::init_with_level(log::Level::Debug).expect("cannot initialize console_log");
 | |
|     }
 | |
| 
 | |
|     App::build()
 | |
|         .add_resource(WindowDescriptor {
 | |
|             width: 300,
 | |
|             height: 300,
 | |
|             ..Default::default()
 | |
|         })
 | |
|         .add_default_plugins()
 | |
|         // One time greet
 | |
|         .add_startup_system(hello_wasm_system.system())
 | |
|         // Track ticks (sanity check, whether game loop is running)
 | |
|         .add_system(counter.system())
 | |
|         // Track input events
 | |
|         .init_resource::<TrackInputState>()
 | |
|         .add_system(track_input_events.system())
 | |
|         .run();
 | |
| }
 | |
| 
 | |
| fn hello_wasm_system() {
 | |
|     log::info!("hello wasm");
 | |
| }
 | |
| 
 | |
| fn counter(mut state: Local<CounterState>, time: Res<Time>) {
 | |
|     if state.count % 60 == 0 {
 | |
|         log::info!(
 | |
|             "tick {} @ {:?} [Δ{}]",
 | |
|             state.count,
 | |
|             time.time_since_startup(),
 | |
|             time.delta_seconds
 | |
|         );
 | |
|     }
 | |
|     state.count += 1;
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| struct CounterState {
 | |
|     count: u32,
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| struct TrackInputState {
 | |
|     keys: EventReader<KeyboardInput>,
 | |
|     cursor: EventReader<CursorMoved>,
 | |
|     motion: EventReader<MouseMotion>,
 | |
|     mousebtn: EventReader<MouseButtonInput>,
 | |
|     scroll: EventReader<MouseWheel>,
 | |
| }
 | |
| 
 | |
| fn track_input_events(
 | |
|     mut state: ResMut<TrackInputState>,
 | |
|     ev_keys: Res<Events<KeyboardInput>>,
 | |
|     ev_cursor: Res<Events<CursorMoved>>,
 | |
|     ev_motion: Res<Events<MouseMotion>>,
 | |
|     ev_mousebtn: Res<Events<MouseButtonInput>>,
 | |
|     ev_scroll: Res<Events<MouseWheel>>,
 | |
| ) {
 | |
|     // Keyboard input
 | |
|     for ev in state.keys.iter(&ev_keys) {
 | |
|         if ev.state.is_pressed() {
 | |
|             log::info!("Just pressed key: {:?}", ev.key_code);
 | |
|         } else {
 | |
|             log::info!("Just released key: {:?}", ev.key_code);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Absolute cursor position (in window coordinates)
 | |
|     for ev in state.cursor.iter(&ev_cursor) {
 | |
|         log::info!("Cursor at: {}", ev.position);
 | |
|     }
 | |
| 
 | |
|     // Relative mouse motion
 | |
|     for ev in state.motion.iter(&ev_motion) {
 | |
|         log::info!("Mouse moved {} pixels", ev.delta);
 | |
|     }
 | |
| 
 | |
|     // Mouse buttons
 | |
|     for ev in state.mousebtn.iter(&ev_mousebtn) {
 | |
|         if ev.state.is_pressed() {
 | |
|             log::info!("Just pressed mouse button: {:?}", ev.button);
 | |
|         } else {
 | |
|             log::info!("Just released mouse button: {:?}", ev.button);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // scrolling (mouse wheel, touchpad, etc.)
 | |
|     for ev in state.scroll.iter(&ev_scroll) {
 | |
|         log::info!(
 | |
|             "Scrolled vertically by {} and horizontally by {}.",
 | |
|             ev.y,
 | |
|             ev.x
 | |
|         );
 | |
|     }
 | |
| }
 | 
