فهرست منبع

:sparkles: store logo filename on Logo instead of reevaluating Res repeatedly

Felix Bytow 2 سال پیش
والد
کامیت
b9dc80eddd
1فایلهای تغییر یافته به همراه8 افزوده شده و 11 حذف شده
  1. 8 11
      src/game_state/logo.rs

+ 8 - 11
src/game_state/logo.rs

@@ -8,7 +8,9 @@ use crate::game_state::GameState;
 pub struct LogoFilename(pub String);
 
 #[derive(Component)]
-struct Logo;
+struct Logo {
+    path: String,
+}
 
 #[derive(Component)]
 struct LogoFader {
@@ -20,23 +22,19 @@ const LOGO_DURATION: f32 = 10.0;
 
 pub struct LogoPlugin;
 
-fn logo_filename(filename: Option<Res<LogoFilename>>) -> String {
-    filename.map_or_else(|| LOGO.to_string(), |res| res.0.clone())
-}
-
 fn setup_logo(
     mut commands: Commands,
     filename: Option<Res<LogoFilename>>,
     assert_server: Res<AssetServer>,
     windows: Res<Windows>,
 ) {
-    let path = logo_filename(filename);
+    let path = filename.map_or_else(|| LOGO.to_string(), |res| res.0.clone());
     let window = windows.primary();
     let (win_w, win_h) = (window.width(), window.height());
 
     commands
         .spawn()
-        .insert(Logo)
+        .insert(Logo { path: path.clone() })
         .insert_bundle(SpriteBundle {
             texture: assert_server.load(&path),
             transform: Transform {
@@ -64,17 +62,16 @@ fn setup_logo(
 }
 
 fn resize_logo(
-    mut query: Query<&mut Transform, With<Logo>>,
-    filename: Option<Res<LogoFilename>>,
+    mut query: Query<(&mut Transform, &Logo)>,
     windows: Res<Windows>,
     images: Res<Assets<Image>>,
 ) {
-    let mut logo_transform = query.single_mut();
+    let (mut logo_transform, logo) = query.single_mut();
     let window = windows.primary();
     let (win_w, win_h) = (window.width(), window.height());
     let win_aspect = win_w / win_h;
 
-    if let Some(logo_image) = images.get(logo_filename(filename)) {
+    if let Some(logo_image) = images.get(&logo.path) {
         let size = logo_image.size();
         let (logo_w, logo_h) = (size.x, size.y);
         let logo_aspect = logo_w / logo_h;