diff options
| author | 1992414357@qq.com <1992414357@qq.com> | 2025-06-09 10:27:37 +0800 |
|---|---|---|
| committer | 1992414357@qq.com <1992414357@qq.com> | 2025-06-09 10:27:37 +0800 |
| commit | a75ee4f12e78b880f6d008a5e72d70b0c7f997b4 (patch) | |
| tree | 8cbbeea48999c603174163add22d2f3b71a9c421 /client | |
| parent | 9f8823ca9c9b9e7696eca56fab4b7765357c2730 (diff) | |
重写客户端代码
Diffstat (limited to 'client')
| -rw-r--r-- | client/Cargo.toml | 4 | ||||
| -rw-r--r-- | client/src/main.rs | 3 | ||||
| -rw-r--r-- | client/src/plugin_client.rs | 121 |
3 files changed, 65 insertions, 63 deletions
diff --git a/client/Cargo.toml b/client/Cargo.toml index 182f647..ba6cb01 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -4,8 +4,10 @@ edition = "2024" version.workspace = true [dependencies] +nogamepads = { path = "../../NoGamepads" } nogamepads-core = { path = "../core" } bevy-tokio-tasks = "0.16.0" tokio = { version = "1.45.0", features = ["full"] } -bevy = "0.16.0"
\ No newline at end of file +bevy = "0.16.0" + diff --git a/client/src/main.rs b/client/src/main.rs index 39d3dba..31fb406 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -9,7 +9,6 @@ use tokio::runtime::Builder; fn main() { let mut app = App::new(); - // 插件 app.add_plugins(DefaultPlugins); app.add_plugins(TokioTasksPlugin { make_runtime: Box::new(|| { @@ -18,9 +17,7 @@ fn main() { ..TokioTasksPlugin::default() }); - // 自定义插件 app.add_plugins(PadClientPlugin); - // 启动 app.run(); } diff --git a/client/src/plugin_client.rs b/client/src/plugin_client.rs index 2449f3a..481f52a 100644 --- a/client/src/plugin_client.rs +++ b/client/src/plugin_client.rs @@ -1,66 +1,69 @@ +use std::sync::{Arc, Mutex}; +use bevy::input::common_conditions::input_just_pressed; +use bevy::log::info; +use bevy::prelude::{App, Commands, Component, IntoScheduleConfigs, KeyCode, Plugin, PreStartup, Query, ResMut, Startup, Update}; +use bevy_tokio_tasks::TokioTasksRuntime; +use nogamepads::entry_mutex; +use nogamepads_core::data::controller::runtime::structs::ControllerRuntime; +use nogamepads_core::data::controller::structs::ControllerData; +use nogamepads_core::data::player::structs::Player; +use nogamepads_core::service::tcp_network::pad_client::structs::PadClientNetwork; - -// #[derive(Component)] -// struct ClientComponent { -// pad_client: Arc<PadClient>, -// } - -use bevy::prelude::{App, Plugin}; +#[derive(Component)] +struct ClientComponent { + pad_client: Arc<Mutex<ControllerRuntime>>, +} pub struct PadClientPlugin; impl Plugin for PadClientPlugin { fn build(&self, app: &mut App) { - // app.add_systems(PreStartup, client_init); - // app.add_systems(Startup, client_start); - // app.add_systems(Update, client_exit.run_if(input_just_pressed(KeyCode::Escape))); + app.add_systems(PreStartup, client_init); + app.add_systems(Startup, client_start); + app.add_systems(Update, client_exit.run_if(input_just_pressed(KeyCode::Escape))); } } -// -// fn client_init( -// mut commands: Commands -// ) { -// // 构建玩家信息 -// let mut player_info = PlayerInfo::new(); -// player_info.setup_account_info( -// env!("TEST_PLAYER_ACCOUNT"), -// env!("TEST_PLAYER_PASSWORD")); -// player_info.set_nickname(env!("TEST_PLAYER_NICKNAME")); -// player_info.set_customize_color_hsv(320, 0.5, 1.0); // PINK -// -// // 构建客户端 -// let mut pad_client = PadClient::default(); -// pad_client.bind_player(player_info); -// pad_client.quiet(); -// -// // 将客户端放入实体 -// commands.spawn( -// ClientComponent { -// pad_client: pad_client.build(), -// } -// ); -// } -// -// fn client_start( -// client_components: Query<&mut ClientComponent>, -// runtime: ResMut<TokioTasksRuntime> -// ) { -// for client_component in client_components.iter() { -// let pad_client = Arc::clone(&client_component.pad_client); -// -// // 启动服务器 -// runtime.spawn_background_task(|_ctx|async move { -// let entry = pad_client.get_connect_entry(); -// block_on(entry); -// info!("Finished"); -// }); -// } -// } -// -// fn client_exit( -// client_components: Query<&mut ClientComponent> -// ){ -// for client_component in client_components.iter() { -// let pad_client = Arc::clone(&client_component.pad_client); -// pad_client.request_disconnect(); -// } -// }
\ No newline at end of file + +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(); + }) + } +}
\ No newline at end of file |
