Update to Bevy 0.12

This commit is contained in:
2024-02-18 12:48:34 +01:00
parent d12e53472d
commit 202db0be70
10 changed files with 981 additions and 731 deletions

1629
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,15 +4,15 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
itertools = "0.11.0" itertools = "0.12.1"
rand = "0.8.5" rand = "0.8.5"
bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls" } bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls" }
bevy_tweening = "0.8.0" bevy_tweening = "0.9.0"
leafwing-input-manager = "0.10.0" leafwing-input-manager = "0.11.2"
bevy_asset_loader = "0.17.0" bevy_asset_loader = "0.19.0"
[dependencies.bevy] [dependencies.bevy]
version = "0.11" version = "0.12"
features = ["wayland", "wav"] features = ["wayland", "wav"]
# [profile.dev.package."*"] # [profile.dev.package."*"]

View File

@@ -3,7 +3,7 @@ mod tile_light;
use crate::grid; use crate::grid;
use bevy::{ use bevy::{
prelude::*, prelude::*,
reflect::{TypeUuid, TypePath}, reflect::{TypePath, TypeUuid},
render::{ render::{
render_resource::{encase, AsBindGroup, OwnedBindingResource, ShaderRef, ShaderType}, render_resource::{encase, AsBindGroup, OwnedBindingResource, ShaderRef, ShaderType},
renderer::RenderQueue, renderer::RenderQueue,
@@ -30,7 +30,7 @@ impl Plugin for CanvasPlugin {
const CANVAS_COLOR: Color = Color::rgb(0.05, 0.05, 0.05); const CANVAS_COLOR: Color = Color::rgb(0.05, 0.05, 0.05);
#[derive(AsBindGroup, TypeUuid, TypePath, Clone)] #[derive(AsBindGroup, TypeUuid, TypePath, Asset, Clone)]
#[uuid = "24f83f6e-e52d-41a6-bf1d-0e46e57a4995"] #[uuid = "24f83f6e-e52d-41a6-bf1d-0e46e57a4995"]
struct CanvasMaterial { struct CanvasMaterial {
#[uniform(0)] #[uniform(0)]
@@ -74,9 +74,9 @@ fn prepare_canvas_material(
let tile_lights_uniform = TileLightsUniform::from_lights(&tile_lights); let tile_lights_uniform = TileLightsUniform::from_lights(&tile_lights);
for handle in canvas_query.iter() { for handle in canvas_query.iter() {
if let Some(material) = materials.get(handle) { if let Some(material) = materials.get(&handle.id()) {
let binding = &material.bindings[0]; let binding = &material.bindings[0];
if let OwnedBindingResource::Buffer(cur_buffer) = binding { if let (_, OwnedBindingResource::Buffer(cur_buffer)) = binding {
let mut buffer = encase::UniformBuffer::new(Vec::new()); let mut buffer = encase::UniformBuffer::new(Vec::new());
buffer buffer
.write(&CanvasMaterialUniform { .write(&CanvasMaterialUniform {

View File

@@ -31,7 +31,7 @@ pub struct EatenEvent(Option<Entity>);
pub struct Fruit; pub struct Fruit;
pub fn eaten_event_sent(mut eaten_event_reader: EventReader<EatenEvent>) -> bool { pub fn eaten_event_sent(mut eaten_event_reader: EventReader<EatenEvent>) -> bool {
eaten_event_reader.iter().count() != 0 eaten_event_reader.read().count() != 0
} }
fn spawn_fruit_system(mut commands: Commands, coordinate_query: Query<&grid::Coordinate>) { fn spawn_fruit_system(mut commands: Commands, coordinate_query: Query<&grid::Coordinate>) {
@@ -86,7 +86,7 @@ fn eat_fruit_system(
} }
fn despawn_fruit_system(mut commands: Commands, mut event_reader: EventReader<EatenEvent>) { fn despawn_fruit_system(mut commands: Commands, mut event_reader: EventReader<EatenEvent>) {
for &EatenEvent(fruit) in event_reader.iter() { for &EatenEvent(fruit) in event_reader.read() {
if let Some(fruit) = fruit { if let Some(fruit) = fruit {
commands.entity(fruit).despawn(); commands.entity(fruit).despawn();
} }

View File

@@ -1,7 +1,6 @@
use bevy::prelude::*; use bevy::prelude::*;
// #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)] #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)]
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default)]
pub enum LevelState { pub enum LevelState {
#[default] #[default]
Begin, Begin,
@@ -10,12 +9,12 @@ pub enum LevelState {
} }
#[derive(Resource)] #[derive(Resource)]
struct Level(u32); pub struct Level(pub u32);
pub(super) struct LevelPlugin; pub(super) struct LevelPlugin;
impl Plugin for LevelPlugin { impl Plugin for LevelPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
// app.add_state::<LevelState>(); app.insert_resource(Level(1));
} }
} }

View File

@@ -27,12 +27,22 @@ const WINDOW_WIDTH: f32 = WINDOW_HEIGHT * ASPECT_RATIO;
const WINDOW_HEIGHT: f32 = 720.; const WINDOW_HEIGHT: f32 = 720.;
const TICK_PERIOD: Duration = Duration::from_millis(125); const TICK_PERIOD: Duration = Duration::from_millis(125);
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, States)]
enum AppState { enum AppState {
MainMenu, MainMenu,
InGame(LevelState), InGame(LevelState),
} }
impl Default for AppState {
fn default() -> Self {
if cfg!(debug_assertions) {
Self::InGame(LevelState::Begin)
} else {
Self::MainMenu
}
}
}
#[derive(Default)] #[derive(Default)]
struct AppStateIter { struct AppStateIter {
current: Option<AppState>, current: Option<AppState>,
@@ -60,37 +70,15 @@ impl Iterator for AppStateIter {
} }
} }
impl Default for AppState {
fn default() -> Self {
if cfg!(debug_assertions) {
Self::InGame(LevelState::Begin)
} else {
Self::MainMenu
}
}
}
impl States for AppState {
type Iter = AppStateIter;
fn variants() -> Self::Iter {
AppStateIter::default()
}
}
#[derive(Resource)] #[derive(Resource)]
struct Score(u32); struct Score(u32);
#[derive(Resource)]
struct Level(u32);
fn main() { fn main() {
let mut app = App::new(); let mut app = App::new();
app.insert_resource(ClearColor(Color::BLACK)) app.insert_resource(ClearColor(Color::BLACK))
.insert_resource(FixedTime::new(TICK_PERIOD)) .insert_resource(Time::<Fixed>::from_duration(TICK_PERIOD))
.insert_resource(Score(0)) .insert_resource(Score(0))
.insert_resource(Level(0))
.add_plugins(DefaultPlugins.set(WindowPlugin { .add_plugins(DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window { primary_window: Some(Window {
title: "Bevy-Snake".into(), title: "Bevy-Snake".into(),
@@ -140,10 +128,10 @@ fn setup_camera_system(mut commands: Commands) {
} }
fn update_score_system(mut score: ResMut<Score>, mut eaten_event: EventReader<fruit::EatenEvent>) { fn update_score_system(mut score: ResMut<Score>, mut eaten_event: EventReader<fruit::EatenEvent>) {
score.0 += eaten_event.iter().count() as u32; score.0 += eaten_event.read().count() as u32;
} }
fn pause_system(keypress: Res<Input<KeyCode>>, mut time: ResMut<Time>) { fn pause_system(keypress: Res<Input<KeyCode>>, mut time: ResMut<Time<Virtual>>) {
if keypress.just_pressed(KeyCode::P) { if keypress.just_pressed(KeyCode::P) {
if time.is_paused() { if time.is_paused() {
time.unpause() time.unpause()

View File

@@ -20,7 +20,7 @@ pub struct SnakePlugin;
impl Plugin for SnakePlugin { impl Plugin for SnakePlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.configure_set( app.configure_sets(
Update, Update,
SystemSet::Movement.after(SystemSet::CollisionDetection), SystemSet::Movement.after(SystemSet::CollisionDetection),
); );
@@ -176,7 +176,7 @@ fn eaten_event_system(
mut tail_event_writer: EventWriter<AddTailEvent>, mut tail_event_writer: EventWriter<AddTailEvent>,
) { ) {
eaten_event_reader eaten_event_reader
.iter() .read()
.for_each(|_| tail_event_writer.send(AddTailEvent)); .for_each(|_| tail_event_writer.send(AddTailEvent));
} }
@@ -185,7 +185,7 @@ fn add_tail_system(
mut snake_query: Query<(Entity, &mut Segments), With<Snake>>, mut snake_query: Query<(Entity, &mut Segments), With<Snake>>,
mut tail_event_reader: EventReader<AddTailEvent>, mut tail_event_reader: EventReader<AddTailEvent>,
) { ) {
for _ in tail_event_reader.iter() { for _ in tail_event_reader.read() {
let (snake_entity, mut segments) = snake_query.single_mut(); let (snake_entity, mut segments) = snake_query.single_mut();
let segment = create_snake_segment( let segment = create_snake_segment(
@@ -277,7 +277,7 @@ fn blip_sound_system(
audio_assets: Res<audio::Assets>, audio_assets: Res<audio::Assets>,
mut eaten_event_reader: EventReader<fruit::EatenEvent>, mut eaten_event_reader: EventReader<fruit::EatenEvent>,
) { ) {
for _ in eaten_event_reader.iter() { for _ in eaten_event_reader.read() {
commands.spawn(AudioBundle { commands.spawn(AudioBundle {
source: audio_assets.blip.clone(), source: audio_assets.blip.clone(),
..Default::default() ..Default::default()

View File

@@ -22,7 +22,7 @@ pub(super) fn add_bulge_system(
mut tail_event_reader: EventReader<AddTailEvent>, mut tail_event_reader: EventReader<AddTailEvent>,
query: Query<Entity, With<SnakeHead>>, query: Query<Entity, With<SnakeHead>>,
) { ) {
for _ in tail_event_reader.iter() { for _ in tail_event_reader.read() {
let snake_head_entity = query.single(); let snake_head_entity = query.single();
commands.entity(snake_head_entity).insert(BulgeMarker); commands.entity(snake_head_entity).insert(BulgeMarker);
} }

View File

@@ -3,7 +3,7 @@ use crate::{audio, level::LevelState, AppState};
use bevy::prelude::*; use bevy::prelude::*;
use leafwing_input_manager::prelude::*; use leafwing_input_manager::prelude::*;
#[derive(Actionlike, Reflect, Component, Copy, Clone, Debug, PartialEq, Eq)] #[derive(Actionlike, Reflect, Component, Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub(super) enum Direction { pub(super) enum Direction {
Up, Up,
Down, Down,

View File

@@ -1,4 +1,4 @@
use crate::{Level, Score}; use crate::{level::Level, Score};
use bevy::prelude::*; use bevy::prelude::*;
#[derive(Component)] #[derive(Component)]