Untitled

 avatar
unknown
rust
2 years ago
8.0 kB
8
Indexable
use bevy::winit::WinitWindows;
use bevy::{
    input::common_conditions::input_toggle_active,
    prelude::*,
    window::{PresentMode, PrimaryWindow, WindowTheme},
};
use bevy_egui::{EguiContext, EguiPlugin};
use bevy_inspector_egui::{
    bevy_inspector::hierarchy::SelectedEntities, DefaultInspectorConfigPlugin,
};
use std::io::Cursor;
use winit::window::Icon;

mod app_setup;

#[derive(Component)]
struct MainCamera;

#[derive(Resource, Default)]
struct MyWorldCoords {
    x: f32,
    y: f32,
}

#[derive(Resource, Default)]
struct Money {
    amount: u32,
}

#[derive(Resource)]
struct ToggleBool {
    toggle_print: bool,
}

#[derive(Resource, Default)]
struct PrintsStruct {
    prints: Vec<String>,
    prints_number: usize,
}

impl PrintsStruct {
    fn add_print(&mut self, new_print: String) {
        // Add the new print at the beginning
        self.prints.insert(0, new_print);
        self.prints_number += 1;

        // Maintain a maximum of 5 prints
        if self.prints.len() > 7 {
            self.prints.truncate(7);
        }
    }
}

fn main () {
    App::new ()
        .add_plugins ((DefaultPlugins.set(WindowPlugin {
            primary_window: Some(Window {
                title: "Clicker Game Version 1.0!".into(),
                position: WindowPosition::At(IVec2 { x: (360), y: (140) }), //Here you can change it
                resolution: (1200.0, 800.0).into(), // You can also do WindowPosition::Centered(Current) or
                present_mode: PresentMode::AutoVsync, // WindowPosition::Automatic
                fit_canvas_to_parent: true,
                prevent_default_event_handling: false,
                window_theme: Some(WindowTheme::Dark),
                ..default()
            }),
            ..default()
        }),))
        .add_plugins(EguiPlugin)
        .add_plugins(DefaultInspectorConfigPlugin)
        .add_systems(PostStartup, (post_startup,))
        .add_systems(Startup, (setup, set_window_icon))
        .add_systems(
            Update,
            (
                mouse_button_input,
                my_cursor_system,
                inspector_ui.run_if(input_toggle_active(true, KeyCode::Escape)),
            ),
        )
        .run();
}

fn inspector_ui (world: &mut World, mut selected_entities: Local<SelectedEntities>) {
    let mut egui_context = world
        .query_filtered::<&mut EguiContext, With<PrimaryWindow>>()
        .single(world)
        .clone();
    egui::SidePanel::left ("hierarchy")
        .default_width(200.0)
        .show(egui_context.get_mut(), |ui| {
            egui::ScrollArea::vertical().show(ui, |ui| {
                ui.heading("Hierarchy");

                bevy_inspector_egui::bevy_inspector::hierarchy::hierarchy_ui(
                    world,
                    ui,
                    &mut selected_entities,
                );

                ui.label("Press escape to toggle UI");
                ui.allocate_space(ui.available_size());
            });
        });

    egui::SidePanel::right ("inspector")
        .default_width(250.0)
        .show(egui_context.get_mut(), |ui| {
            egui::ScrollArea::vertical().show(ui, |ui| {
                ui.heading("Inspector");

                let mut toggle_resource = world.get_resource_mut::<ToggleBool>().unwrap();
                let mut toggle_print = toggle_resource.toggle_print;

                if ui.button("Toggle Print").clicked() {
                    toggle_print = !toggle_print;
                    toggle_resource.toggle_print = toggle_print;
                    println!("Toggle Print: {}", toggle_print);
                    
                }

                match selected_entities.as_slice() {
                    &[entity] => {
                        bevy_inspector_egui::bevy_inspector::ui_for_entity(world, entity, ui);
                    }
                    entities => {
                        bevy_inspector_egui::bevy_inspector::ui_for_entities_shared_components(
                            world, entities, ui,
                        );
                    }
                }

                ui.allocate_space(ui.available_size());
            });
    });
    egui::TopBottomPanel::bottom ("prints")
    .default_height(150.0)
    .show(egui_context.get_mut(), |ui| {
        egui::ScrollArea::vertical().show(ui, |ui| {
            ui.heading("Prints");

            let print_resource = world.get_resource::<PrintsStruct>().unwrap();
            let prints_vec = &print_resource.prints;
            let prints_nums = print_resource.prints_number;

            for (index, print_text) in prints_vec.iter().enumerate().rev() {
                let print_number = prints_nums - index;// Calculate the correct print number
                ui.label(format!("print ({}): {}", print_number, print_text));
            }

            ui.allocate_space(ui.available_size());
        });
    });
}

fn setup (mut commands: Commands, asset_server: Res<AssetServer>) {
    let texture = asset_server.load("Clicker.png");
    commands.spawn((Camera2dBundle { ..default() }, MainCamera));

    commands.spawn((SpriteBundle {
        texture,
        ..default()
    },));

    commands.init_resource::<MyWorldCoords>();
    commands.insert_resource::<Money>(Money { amount: 0 });
    commands.init_resource::<PrintsStruct>();
    commands.insert_resource::<ToggleBool>(ToggleBool {
        toggle_print: false,
    });
}

fn post_startup (mut print: ResMut<PrintsStruct>) {
    println!("\n\n Game Starts, Have Fun!\n");
    print.add_print("Game Starts, Have Fun!".to_string());
}

fn set_window_icon (
    windows: NonSend<WinitWindows>,
    primary_window: Query<Entity, With<PrimaryWindow>>,
) {
    let primary_entity = primary_window.single();
    let primary = windows.get_window(primary_entity).unwrap();
    let icon_buf = Cursor::new(include_bytes!("../Assets/icon_256x256.png"));
    if let Ok(image) = image::load(icon_buf, image::ImageFormat::Png) {
        let image = image.into_rgba8();
        let (width, height) = image.dimensions();
        let rgba = image.into_raw();
        let icon = Icon::from_rgba(rgba, width, height).unwrap();
        primary.set_window_icon(Some(icon));
    };
}

fn mouse_button_input (
    buttons: Res<Input<MouseButton>>,
    mycoords: Res<MyWorldCoords>,
    toggle_bool: Res<ToggleBool>,
    mut money: ResMut<Money>,
    mut print: ResMut<PrintsStruct>,
) {
    if buttons.just_pressed (MouseButton::Left) {
        println!("MouseButtonWasPressed");
        if cursor_in_clicker(&mycoords, &toggle_bool) {
            money.amount += 10;
            let money_string = format!("Money: {}", money.amount);
            print.add_print(money_string);
            println!("Money: {}", money.amount);
        }
    }
}

fn cursor_in_clicker (mycoords: &MyWorldCoords, toggle_bool: &ToggleBool) -> bool {
    if toggle_bool.toggle_print {
        eprintln!("Cursor X: {}\nCursor Y: {}", mycoords.x, mycoords.y);

    }
    (mycoords.x <= 100.0 && mycoords.x >= -100.0) && (mycoords.y <= 100.0 && mycoords.y >= -100.0)
}

fn my_cursor_system (
    mut mycoords: ResMut<MyWorldCoords>,
    q_window: Query<&Window, With<PrimaryWindow>>,
    q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
) {
    let (camera, camera_transform) = q_camera.single();
    let window = q_window.single();

    if let Some(world_position) = window
        .cursor_position()
        .and_then(|cursor| camera.viewport_to_world(camera_transform, cursor))
        .map(|ray| ray.origin.truncate())
    {
        mycoords.x = world_position.x;
        mycoords.y = world_position.y;
        //eprintln!("World coords: {}/{}", world_position.x, world_position.y);
    }
}
Editor is loading...
Leave a Comment