Learn BEVY with Real Code Examples
Updated Nov 24, 2025
Code Sample Descriptions
1
Bevy Simple Counter Example
use bevy::prelude::*;
struct Counter(i32);
fn main() {
App::build()
.insert_resource(WindowDescriptor {
title: "Bevy Counter".to_string(),
width: 400.0,
height: 300.0,
..Default::default()
})
.insert_resource(Counter(0))
.add_plugins(DefaultPlugins)
.add_startup_system(setup.system())
.add_system(update_counter.system())
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn_bundle(UiCameraBundle::default());
commands.spawn_bundle(TextBundle {
text: Text::with_section(
"Count: 0",
TextStyle {
font: asset_server.load("fonts/FiraSans-Bold.ttf"),
font_size: 40.0,
color: Color::WHITE,
},
Default::default(),
),
..Default::default()
}).insert(Counter(0));
}
fn update_counter(
keyboard_input: Res<Input<KeyCode>>,
mut query: Query<(&mut Text, &mut Counter)>
) {
for (mut text, mut counter) in query.iter_mut() {
if keyboard_input.just_pressed(KeyCode::Up) {
counter.0 += 1;
}
if keyboard_input.just_pressed(KeyCode::Down) {
counter.0 -= 1;
}
text.sections[0].value = format!("Count: {}", counter.0);
}
}
A minimal Bevy app that displays a counter on screen and updates it with keyboard input.
2
Bevy Moving Sprite Example
use bevy::prelude::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_startup_system(setup.system())
.add_system(move_sprite.system())
.run();
}
struct Player;
fn setup(mut commands: Commands, asset_server: Res<AssetServer>, mut materials: ResMut<Assets<ColorMaterial>>) {
commands.spawn_bundle(OrthographicCameraBundle::new_2d());
commands.spawn_bundle(SpriteBundle {
material: materials.add(asset_server.load("player.png").into()),
..Default::default()
}).insert(Player);
}
fn move_sprite(keyboard_input: Res<Input<KeyCode>>, mut query: Query<&mut Transform, With<Player>>) {
for mut transform in query.iter_mut() {
if keyboard_input.pressed(KeyCode::Left) { transform.translation.x -= 2.0; }
if keyboard_input.pressed(KeyCode::Right) { transform.translation.x += 2.0; }
if keyboard_input.pressed(KeyCode::Up) { transform.translation.y += 2.0; }
if keyboard_input.pressed(KeyCode::Down) { transform.translation.y -= 2.0; }
}
}
Moves a sprite with arrow keys.
3
Bevy FPS Counter Example
use bevy::prelude::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_startup_system(setup.system())
.add_system(update_fps.system())
.run();
}
struct FpsText;
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn_bundle(UiCameraBundle::default());
commands.spawn_bundle(TextBundle {
text: Text::with_section(
"FPS: 0",
TextStyle {
font: asset_server.load("fonts/FiraSans-Bold.ttf"),
font_size: 30.0,
color: Color::WHITE,
},
Default::default(),
),
..Default::default()
}).insert(FpsText);
}
fn update_fps(time: Res<Time>, mut query: Query<&mut Text, With<FpsText>>) {
for mut text in query.iter_mut() {
text.sections[0].value = format!("FPS: {}", (1.0 / time.delta_seconds()) as i32);
}
}
Displays FPS on screen using Bevy UI.
4
Bevy Simple Timer Example
use bevy::prelude::*;
struct TimerEvent(Timer);
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.insert_resource(TimerEvent(Timer::from_seconds(1.0, true)))
.add_system(timer_system.system())
.run();
}
fn timer_system(time: Res<Time>, mut timer: ResMut<TimerEvent>) {
timer.0.tick(time.delta());
if timer.0.finished() {
println!("Timer triggered!");
}
}
Runs a repeating timer event in Bevy.
5
Bevy Mouse Position Example
use bevy::prelude::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_system(mouse_position.system())
.run();
}
fn mouse_position(windows: Res<Windows>) {
if let Some(window) = windows.get_primary() {
if let Some(pos) = window.cursor_position() {
println!("Mouse: x={}, y={}", pos.x, pos.y);
}
}
}
Prints mouse coordinates each frame.
6
Bevy Simple Animation Example
use bevy::prelude::*;
struct AnimationTimer(Timer);
struct SpriteSheet;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_startup_system(setup.system())
.add_system(animate_sprite.system())
.run();
}
fn setup(mut commands: Commands) {
commands.spawn_bundle(OrthographicCameraBundle::new_2d());
commands.spawn().insert(SpriteSheet).insert(AnimationTimer(Timer::from_seconds(0.1, true)));
}
fn animate_sprite(time: Res<Time>, mut query: Query<&mut AnimationTimer>) {
for mut timer in query.iter_mut() {
timer.0.tick(time.delta());
if timer.0.finished() {
println!("Frame advanced");
}
}
}
Plays frame-based sprite animation using a timer.
7
Bevy Keyboard Input Example
use bevy::prelude::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_system(keyboard_input.system())
.run();
}
fn keyboard_input(keyboard_input: Res<Input<KeyCode>>) {
if keyboard_input.just_pressed(KeyCode::Space) {
println!("Space pressed!");
}
if keyboard_input.just_pressed(KeyCode::Return) {
println!("Enter pressed!");
}
}
Detects keyboard presses and prints the key pressed.
8
Bevy Spawn Moving Entity Example
use bevy::prelude::*;
struct Mover;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_startup_system(setup.system())
.add_system(move_entity.system())
.run();
}
fn setup(mut commands: Commands) {
commands.spawn().insert(Mover).insert(Transform::default()).insert(GlobalTransform::default());
}
fn move_entity(time: Res<Time>, mut query: Query<&mut Transform, With<Mover>>) {
for mut transform in query.iter_mut() {
transform.translation.x += 50.0 * time.delta_seconds();
}
}
Spawns an entity and moves it automatically.
9
Bevy Click Detection Example
use bevy::prelude::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_system(mouse_click.system())
.run();
}
fn mouse_click(mouse_input: Res<Input<MouseButton>>) {
if mouse_input.just_pressed(MouseButton::Left) {
println!("Left click!");
}
if mouse_input.just_pressed(MouseButton::Right) {
println!("Right click!");
}
}
Detects mouse clicks in a Bevy window.
10
Bevy Random Movement Example
use bevy::prelude::*;
use rand::prelude::*;
struct Walker;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_startup_system(setup.system())
.add_system(random_move.system())
.run();
}
fn setup(mut commands: Commands) {
commands.spawn().insert(Walker).insert(Transform::default()).insert(GlobalTransform::default());
}
fn random_move(mut query: Query<&mut Transform, With<Walker>>) {
let mut rng = thread_rng();
for mut transform in query.iter_mut() {
transform.translation.x += rng.gen_range(-1.0..1.0);
transform.translation.y += rng.gen_range(-1.0..1.0);
}
}
Moves an entity randomly each frame.