diff --git a/mods/dr_game/Difficult_Rocket_rs/__init__.py b/mods/dr_game/Difficult_Rocket_rs/__init__.py index 5413d29..5600df5 100644 --- a/mods/dr_game/Difficult_Rocket_rs/__init__.py +++ b/mods/dr_game/Difficult_Rocket_rs/__init__.py @@ -121,6 +121,7 @@ if TYPE_CHECKING: @property def img_pos(self) -> Tuple[int, int, int, int]: ... """ -x -y +x +y 左下右上 """ + def get_part_box(self, part_id: int) -> Optional[Tuple[Tuple[int, int], Tuple[int, int]]]: ... class Console_rs: def __init__(self) -> None: ... diff --git a/mods/dr_game/Difficult_Rocket_rs/src/src/lib.rs b/mods/dr_game/Difficult_Rocket_rs/src/src/lib.rs index bae2582..428f63f 100644 --- a/mods/dr_game/Difficult_Rocket_rs/src/src/lib.rs +++ b/mods/dr_game/Difficult_Rocket_rs/src/src/lib.rs @@ -42,7 +42,6 @@ fn test_call(py_obj: &PyAny) -> PyResult { fn module_init(_py: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(get_version_str, m)?)?; m.add_function(wrap_pyfunction!(test_call, m)?)?; - m.add_function(wrap_pyfunction!(simulator::simulation, m)?)?; m.add_function(wrap_pyfunction!(sr1_data::part_list::read_part_list_py, m)?)?; m.add_function(wrap_pyfunction!(sr1_data::ship::py_raw_ship_from_file, m)?)?; m.add_class::()?; diff --git a/mods/dr_game/Difficult_Rocket_rs/src/src/plugin.rs b/mods/dr_game/Difficult_Rocket_rs/src/src/plugin.rs index 9796efe..849cc6c 100644 --- a/mods/dr_game/Difficult_Rocket_rs/src/src/plugin.rs +++ b/mods/dr_game/Difficult_Rocket_rs/src/src/plugin.rs @@ -12,6 +12,7 @@ /// 插件加载 /// +#[allow(unused)] pub mod plugin_trait { pub struct ModInfo { pub name: String, diff --git a/mods/dr_game/Difficult_Rocket_rs/src/src/python.rs b/mods/dr_game/Difficult_Rocket_rs/src/src/python.rs index 487d791..34f320f 100644 --- a/mods/dr_game/Difficult_Rocket_rs/src/src/python.rs +++ b/mods/dr_game/Difficult_Rocket_rs/src/src/python.rs @@ -12,6 +12,7 @@ pub mod data { use pyo3::prelude::*; use crate::sr1_data::part_list::RawPartList; + use crate::types::math::{Point2D, Rotatable}; use crate::types::sr1::{get_max_box, SR1PartData, SR1PartListTrait}; use crate::types::sr1::{SR1PartList, SR1PartType, SR1Ship}; @@ -142,6 +143,25 @@ pub mod data { } parts } + + fn get_part_box(&self, part_id: i64) -> Option<((f64, f64), (f64, f64))> { + let part_data = self.ship.parts.iter().find(|&x| x.id == part_id); + if let Some(part_data) = part_data { + let part_type = self.part_list.get_part_type(part_data.part_type_id.clone()).unwrap(); + // rotate + let radius = part_data.angle; + let ((x1, y1), (x2, y2)) = part_type.get_box(); + let mut p1 = Point2D::new(x1, y1); + let mut p2 = Point2D::new(x2, y2); + p1.rotate_radius_mut(radius); + p2.rotate_radius_mut(radius); + // transform + p1.add_mut(part_data.x * 2.0, part_data.y * 2.0); + p2.add_mut(part_data.x * 2.0, part_data.y * 2.0); + return Some(((p1.x, p1.y), (p2.x, p2.y))); + } + None + } } } @@ -206,30 +226,6 @@ pub mod translate { } } -pub mod physics { - use pyo3::prelude::*; - - use crate::simulator::interface::PhysicsSpace; - - #[pyclass] - #[pyo3(name = "PhysicsSpace_rs")] - pub struct PyPhysicsSpace { - pub space: PhysicsSpace, - } - - #[pymethods] - impl PyPhysicsSpace { - #[new] - fn new(gravity: (f64, f64)) -> Self { - Self { - space: PhysicsSpace::new(gravity), - } - } - - fn tick_space(&mut self) { self.space.tick_space() } - } -} - pub mod console { use pyo3::prelude::*; diff --git a/mods/dr_game/Difficult_Rocket_rs/src/src/simulator.rs b/mods/dr_game/Difficult_Rocket_rs/src/src/simulator.rs index b03435e..67f4737 100644 --- a/mods/dr_game/Difficult_Rocket_rs/src/src/simulator.rs +++ b/mods/dr_game/Difficult_Rocket_rs/src/src/simulator.rs @@ -9,6 +9,7 @@ use pyo3::prelude::*; use rapier2d_f64::prelude::*; +#[allow(unused)] #[pyfunction] #[pyo3(name = "simulation")] pub fn simulation() -> () { @@ -63,75 +64,8 @@ pub fn simulation() -> () { } } -pub mod interface { +#[allow(unused)] +pub mod python { + use pyo3::prelude::*; use rapier2d_f64::prelude::*; - - pub struct PhysicsSpace { - pub rigid_body_set: RigidBodySet, - pub collider_set: ColliderSet, - pub gravity: Vector, - pub integration_parameters: IntegrationParameters, - pub physics_pipeline: PhysicsPipeline, - pub island_manager: IslandManager, - pub broad_phase: BroadPhase, - pub narrow_phase: NarrowPhase, - pub impulse_joint_set: ImpulseJointSet, - pub multibody_joint_set: MultibodyJointSet, - pub ccd_solver: CCDSolver, - pub physics_hooks: (), - pub event_handler: (), - } - - impl PhysicsSpace { - pub fn new(gravity: (f64, f64)) -> Self { - let rigid_body_set = RigidBodySet::new(); - let collider_set = ColliderSet::new(); - let gravity = vector![gravity.0, gravity.1]; - let integration_parameters = IntegrationParameters::default(); - let physics_pipeline = PhysicsPipeline::new(); - let island_manager = IslandManager::new(); - let broad_phase = BroadPhase::new(); - let narrow_phase = NarrowPhase::new(); - let impulse_joint_set = ImpulseJointSet::new(); - let multibody_joint_set = MultibodyJointSet::new(); - let ccd_solver = CCDSolver::new(); - let physics_hooks = (); - let event_handler = (); - Self { - rigid_body_set, - collider_set, - gravity, - integration_parameters, - physics_pipeline, - island_manager, - broad_phase, - narrow_phase, - impulse_joint_set, - multibody_joint_set, - ccd_solver, - physics_hooks, - event_handler, - } - } - - pub fn tick_space(&mut self) { - self.physics_pipeline.step( - &self.gravity, - &self.integration_parameters, - &mut self.island_manager, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut self.rigid_body_set, - &mut self.collider_set, - &mut self.impulse_joint_set, - &mut self.multibody_joint_set, - &mut self.ccd_solver, - None, - &self.physics_hooks, - &self.event_handler, - ); - } - - - } } diff --git a/mods/dr_game/Difficult_Rocket_rs/src/src/types.rs b/mods/dr_game/Difficult_Rocket_rs/src/src/types.rs index ca77063..63b739a 100644 --- a/mods/dr_game/Difficult_Rocket_rs/src/src/types.rs +++ b/mods/dr_game/Difficult_Rocket_rs/src/src/types.rs @@ -197,9 +197,13 @@ pub mod sr1 { } impl SR1PartType { - pub fn get_box(&self) -> (f64, f64, f64, f64) { - let x = self.width as f64 / 2.0; - (-x, 0.0, x, self.height as f64) + pub fn get_box(&self) -> ((f64, f64), (f64, f64)) { + // -x, -y, x, y + // 居中 + ( + (-(self.width as f64 / 2.0), -(self.height as f64 / 2.0)), + (self.width as f64 / 2.0, self.height as f64 / 2.0), + ) } } @@ -777,14 +781,14 @@ pub mod sr1 { let mut max_box = (0_f64, 0_f64, 0_f64, 0_f64); for part in parts.iter() { let part_type = part_list.get_part_type(part.part_type_id.clone()).unwrap(); - let (x1, y1, x2, y2) = part_type.get_box(); + let ((x1, y1), (x2, y2)) = part_type.get_box(); // rotate let mut p1 = Point2D::new(x1, y1); let mut p2 = Point2D::new(x2, y2); p1.rotate_radius_mut(part.angle); p2.rotate_radius_mut(part.angle); - let p1 = p1.add(part.x, part.y); - let p2 = p2.add(part.x, part.y); + let p1 = p1.add(part.x * 2.0, part.y * 2.0); + let p2 = p2.add(part.x * 2.0, part.y * 2.0); let (x1, y1, x2, y2) = (p1.x, p1.y, p2.x, p2.y); // get max box max_box.0 = max_box.0.min(x1).min(part.x); @@ -835,6 +839,12 @@ pub mod math { #[inline] pub fn add(&self, x: f64, y: f64) -> Self { Point2D::new(self.x + x, self.y + y) } + + #[inline] + pub fn add_mut(&mut self, x: f64, y: f64) -> () { + self.x += x; + self.y += y; + } } impl Rotatable for Point2D {