use bevy::{input::touch::TouchPhase, prelude::*, window::WindowMode}; // the `bevy_main` proc_macro generates the required ios boilerplate #[bevy_main] fn main() { App::new() .insert_resource(WindowDescriptor { resizable: false, mode: WindowMode::BorderlessFullscreen, ..default() }) .add_plugins(DefaultPlugins) .add_startup_system(setup_scene) .add_startup_system(setup_music) .add_system(touch_camera) .add_system(button_handler) .run(); } fn touch_camera( windows: ResMut, mut touches: EventReader, mut camera: Query<&mut Transform, With>, mut last_position: Local>, ) { for touch in touches.iter() { if touch.phase == TouchPhase::Started { *last_position = None; } if let Some(last_position) = *last_position { let window = windows.primary(); let mut transform = camera.single_mut(); *transform = Transform::from_xyz( transform.translation.x + (touch.position.x - last_position.x) / window.width() * 5.0, transform.translation.y, transform.translation.z + (touch.position.y - last_position.y) / window.height() * 5.0, ) .looking_at(Vec3::ZERO, Vec3::Y); } *last_position = Some(touch.position); } } /// set up a simple 3D scene fn setup_scene( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, asset_server: Res, ) { // plane commands.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Plane { size: 5.0 })), material: materials.add(Color::rgb(0.1, 0.2, 0.1).into()), ..default() }); // cube commands.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), material: materials.add(Color::rgb(0.5, 0.4, 0.3).into()), transform: Transform::from_xyz(0.0, 0.5, 0.0), ..default() }); // sphere commands.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Icosphere { subdivisions: 4, radius: 0.5, })), material: materials.add(Color::rgb(0.1, 0.4, 0.8).into()), transform: Transform::from_xyz(1.5, 1.5, 1.5), ..default() }); // light commands.spawn_bundle(PointLightBundle { transform: Transform::from_xyz(4.0, 8.0, 4.0), point_light: PointLight { intensity: 5000.0, shadows_enabled: true, ..default() }, ..default() }); // camera commands.spawn_bundle(Camera3dBundle { transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); // Test ui commands.spawn_bundle(Camera2dBundle::default()); commands .spawn_bundle(ButtonBundle { style: Style { justify_content: JustifyContent::Center, align_items: AlignItems::Center, position_type: PositionType::Absolute, position: UiRect { left: Val::Px(50.0), right: Val::Px(50.0), top: Val::Auto, bottom: Val::Px(50.0), }, ..default() }, ..default() }) .with_children(|b| { b.spawn_bundle(TextBundle { text: Text { sections: vec![TextSection { value: "Test Button".to_string(), style: TextStyle { font: asset_server.load("fonts/FiraSans-Bold.ttf"), font_size: 30.0, color: Color::BLACK, }, }], alignment: TextAlignment { vertical: VerticalAlign::Center, horizontal: HorizontalAlign::Center, }, }, ..default() }); }); } fn button_handler( mut interaction_query: Query< (&Interaction, &mut UiColor), (Changed, With