aboutsummaryrefslogtreecommitdiff
path: root/client/src/bevy_plugins/plugin_client_app.rs
diff options
context:
space:
mode:
author1992414357@qq.com <1992414357@qq.com>2025-06-13 16:25:22 +0800
committer1992414357@qq.com <1992414357@qq.com>2025-06-13 16:25:22 +0800
commit98dad6afa316b9a44ff76b305520339ddc44c789 (patch)
tree9a6d0b566b23f0bab270b68e4766a60349abf18b /client/src/bevy_plugins/plugin_client_app.rs
parent9e48af01ae56fe813869ada24de291ab98b361e2 (diff)
.
Diffstat (limited to 'client/src/bevy_plugins/plugin_client_app.rs')
-rw-r--r--client/src/bevy_plugins/plugin_client_app.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/client/src/bevy_plugins/plugin_client_app.rs b/client/src/bevy_plugins/plugin_client_app.rs
new file mode 100644
index 0000000..e7d60d2
--- /dev/null
+++ b/client/src/bevy_plugins/plugin_client_app.rs
@@ -0,0 +1,80 @@
+use std::sync::{Arc, Mutex};
+use bevy::app::FixedLast;
+use bevy::input::common_conditions::input_just_pressed;
+use bevy::log::info;
+use bevy::log::tracing::Instrument;
+use bevy::prelude::{App, AppExit, Commands, Component, EventReader, IntoScheduleConfigs, KeyCode, NextState, OnEnter, OnExit, Plugin, PreStartup, Query, ResMut, Startup, State, States, Update};
+use bevy_tokio_tasks::TokioTasksRuntime;
+use nogamepads::entry_mutex;
+use nogamepads_core::data::controller::controller_data::ControllerData;
+use nogamepads_core::data::controller::controller_runtime::ControllerRuntime;
+use nogamepads_core::data::player::player_data::Player;
+use nogamepads_core::service::tcp_network::pad_client::pad_client_service::PadClientNetwork;
+use crate::bevy_plugins::plugin_client_app::GameState::Exiting;
+
+#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)]
+enum GameState {
+ #[default]
+ Waiting,
+ Playing,
+ Exiting
+}
+
+#[derive(Component)]
+struct ClientComponent {
+ pad_client: Arc<Mutex<ControllerRuntime>>,
+}
+
+pub struct ClientAppPlugins;
+impl Plugin for ClientAppPlugins {
+ fn build(&self, app: &mut App) {
+ app.add_systems(PreStartup, client_init);
+ app.add_systems(Startup, client_start);
+ app.add_systems(OnEnter(Exiting), client_exit);
+ }
+}
+
+fn client_init(
+ mut commands: Commands
+) {
+ let mut controller_data = ControllerData::default();
+ controller_data.bind_player(
+ Player::register(
+ env!("TEST_PLAYER_ACCOUNT").to_string(),
+ env!("TEST_PLAYER_PASSWORD").to_string())
+ );
+
+ let runtime = controller_data.runtime();
+
+ commands.spawn(
+ ClientComponent {
+ pad_client: Arc::clone(&runtime),
+ }
+ );
+}
+
+fn client_start(
+ client_components: Query<&mut ClientComponent>,
+ runtime: ResMut<TokioTasksRuntime>
+) {
+ for client_component in client_components.iter() {
+ let client_runtime = Arc::clone(&client_component.pad_client);
+ let network = PadClientNetwork::build(client_runtime);
+ let entry = network.build_entry();
+
+ runtime.spawn_background_task(|_ctx| async move {
+ entry.await;
+ info!("Client finished.")
+ });
+ }
+}
+
+fn client_exit(
+ client_components: Query<&mut ClientComponent>
+) {
+ for client_component in client_components.iter() {
+ entry_mutex!(client_component.pad_client, |guard| {
+ guard.close();
+ })
+ };
+}