mirror of
https://github.com/bevyengine/bevy
synced 2024-11-26 06:30:19 +00:00
b6a647cc01
Adds a `default()` shorthand for `Default::default()` ... because life is too short to constantly type `Default::default()`. ```rust use bevy::prelude::*; #[derive(Default)] struct Foo { bar: usize, baz: usize, } // Normally you would do this: let foo = Foo { bar: 10, ..Default::default() }; // But now you can do this: let foo = Foo { bar: 10, ..default() }; ``` The examples have been adapted to use `..default()`. I've left internal crates as-is for now because they don't pull in the bevy prelude, and the ergonomics of each case should be considered individually.
119 lines
4.2 KiB
Rust
119 lines
4.2 KiB
Rust
use bevy::{
|
|
diagnostic::{Diagnostics, FrameTimeDiagnosticsPlugin},
|
|
prelude::*,
|
|
};
|
|
|
|
/// This example illustrates how to create UI text and update it in a system. It displays the
|
|
/// current FPS in the top left corner, as well as text that changes colour in the bottom right.
|
|
/// For text within a scene, please see the text2d example.
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins)
|
|
.add_plugin(FrameTimeDiagnosticsPlugin::default())
|
|
.add_startup_system(setup)
|
|
.add_system(text_update_system)
|
|
.add_system(text_color_system)
|
|
.run();
|
|
}
|
|
|
|
// A unit struct to help identify the FPS UI component, since there may be many Text components
|
|
#[derive(Component)]
|
|
struct FpsText;
|
|
|
|
// A unit struct to help identify the color-changing Text component
|
|
#[derive(Component)]
|
|
struct ColorText;
|
|
|
|
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
|
// UI camera
|
|
commands.spawn_bundle(UiCameraBundle::default());
|
|
// Text with one section
|
|
commands
|
|
.spawn_bundle(TextBundle {
|
|
style: Style {
|
|
align_self: AlignSelf::FlexEnd,
|
|
position_type: PositionType::Absolute,
|
|
position: Rect {
|
|
bottom: Val::Px(5.0),
|
|
right: Val::Px(15.0),
|
|
..default()
|
|
},
|
|
..default()
|
|
},
|
|
// Use the `Text::with_section` constructor
|
|
text: Text::with_section(
|
|
// Accepts a `String` or any type that converts into a `String`, such as `&str`
|
|
"hello\nbevy!",
|
|
TextStyle {
|
|
font: asset_server.load("fonts/FiraSans-Bold.ttf"),
|
|
font_size: 100.0,
|
|
color: Color::WHITE,
|
|
},
|
|
// Note: You can use `Default::default()` in place of the `TextAlignment`
|
|
TextAlignment {
|
|
horizontal: HorizontalAlign::Center,
|
|
..default()
|
|
},
|
|
),
|
|
..default()
|
|
})
|
|
.insert(ColorText);
|
|
// Rich text with multiple sections
|
|
commands
|
|
.spawn_bundle(TextBundle {
|
|
style: Style {
|
|
align_self: AlignSelf::FlexEnd,
|
|
..default()
|
|
},
|
|
// Use `Text` directly
|
|
text: Text {
|
|
// Construct a `Vec` of `TextSection`s
|
|
sections: vec![
|
|
TextSection {
|
|
value: "FPS: ".to_string(),
|
|
style: TextStyle {
|
|
font: asset_server.load("fonts/FiraSans-Bold.ttf"),
|
|
font_size: 60.0,
|
|
color: Color::WHITE,
|
|
},
|
|
},
|
|
TextSection {
|
|
value: "".to_string(),
|
|
style: TextStyle {
|
|
font: asset_server.load("fonts/FiraMono-Medium.ttf"),
|
|
font_size: 60.0,
|
|
color: Color::GOLD,
|
|
},
|
|
},
|
|
],
|
|
..default()
|
|
},
|
|
..default()
|
|
})
|
|
.insert(FpsText);
|
|
}
|
|
|
|
fn text_update_system(diagnostics: Res<Diagnostics>, mut query: Query<&mut Text, With<FpsText>>) {
|
|
for mut text in query.iter_mut() {
|
|
if let Some(fps) = diagnostics.get(FrameTimeDiagnosticsPlugin::FPS) {
|
|
if let Some(average) = fps.average() {
|
|
// Update the value of the second section
|
|
text.sections[1].value = format!("{:.2}", average);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn text_color_system(time: Res<Time>, mut query: Query<&mut Text, With<ColorText>>) {
|
|
for mut text in query.iter_mut() {
|
|
let seconds = time.seconds_since_startup() as f32;
|
|
// We used the `Text::with_section` helper method, but it is still just a `Text`,
|
|
// so to update it, we are still updating the one and only section
|
|
text.sections[0].style.color = Color::Rgba {
|
|
red: (1.25 * seconds).sin() / 2.0 + 0.5,
|
|
green: (0.75 * seconds).sin() / 2.0 + 0.5,
|
|
blue: (0.50 * seconds).sin() / 2.0 + 0.5,
|
|
alpha: 1.0,
|
|
};
|
|
}
|
|
}
|