From e168fdb8fb5510c5913d4906206c634c0292b4d3 Mon Sep 17 00:00:00 2001 From: shenjack <3695888@qq.com> Date: Fri, 24 May 2024 00:16:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=BF=E9=98=B3=E9=97=B4=E7=9A=84=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF=E9=87=8D=E5=86=99=E4=BA=86=E4=B8=80=E9=81=8D=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/src/python/data.rs | 19 ++-- mods/dr_game/__init__.py | 2 +- mods/dr_game/sr1_ship.py | 104 +++++++++++------- 3 files changed, 79 insertions(+), 46 deletions(-) diff --git a/mods/dr_game/Difficult_Rocket_rs/src/src/python/data.rs b/mods/dr_game/Difficult_Rocket_rs/src/src/python/data.rs index f1ad562..8eabbf7 100644 --- a/mods/dr_game/Difficult_Rocket_rs/src/src/python/data.rs +++ b/mods/dr_game/Difficult_Rocket_rs/src/src/python/data.rs @@ -397,7 +397,7 @@ impl PySR1Ship { } /// 待会直接加一个在 SR1 PartData上获取的API得了,现在这样太费劲了 - /// + /// /// 加好了 fn get_part_box(&self, part_id: IdType) -> Option<((f64, f64), (f64, f64))> { let part_data = self.ship.parts.iter().find(|&x| x.id == part_id); @@ -420,20 +420,23 @@ impl PySR1Ship { } /// 通过 part_id 获取 part_data - /// + /// /// 当然, 支持重叠 ID - fn find_part_by_id(&self, part_id: IdType) -> Vec { + fn find_part_by_id(&self, part_id: IdType) -> Vec { // 先搜链接到的部件 // 这里的代码是 GitHub Copilot 帮我优化的 // 赞美 GitHub Copilot !() let unconnected = self.ship.disconnected.as_ref().map_or(vec![], |disconnected| { - disconnected.iter() - .flat_map(|(group, _)| group.iter()) - .filter(|part| part.id == part_id) - .collect() + disconnected.iter().flat_map(|(group, _)| group.iter()).filter(|part| part.id == part_id).collect() }); // 然后通过一个 chain 直接把他链接到这边 - self.ship.parts.iter().filter(|x| x.id == part_id).chain(unconnected).cloned().collect() + self.ship + .parts + .iter() + .filter(|x| x.id == part_id) + .chain(unconnected) + .map(|raw_data| PySR1PartData { data: raw_data.clone() }) + .collect() } fn save(&self, file_path: String, save_status: Option) -> PyResult<()> { diff --git a/mods/dr_game/__init__.py b/mods/dr_game/__init__.py index f60f98c..015d52d 100644 --- a/mods/dr_game/__init__.py +++ b/mods/dr_game/__init__.py @@ -16,7 +16,7 @@ from Difficult_Rocket.api.types import Options, Version from lib_not_dr import loggers -DR_rust_version = Version("0.3.5") # DR_mod 的 Rust 编写部分的兼容版本 +DR_rust_version = Version("0.3.6") # DR_mod 的 Rust 编写部分的兼容版本 logger = loggers.config.get_logger_from_old("client.dr_game", "client") diff --git a/mods/dr_game/sr1_ship.py b/mods/dr_game/sr1_ship.py index fd43ae5..9c40003 100644 --- a/mods/dr_game/sr1_ship.py +++ b/mods/dr_game/sr1_ship.py @@ -133,10 +133,10 @@ class SR1ShipRender(BaseScreen): self.ship_name: Optional[str] = None # List/Dict data - self.parts_sprite: Dict[int, List[Sprite]] = {} + self.part_sprites: Dict[int, List[Sprite]] = {} self.part_box_dict: Dict[int, Rectangle] = {} - self.part_line_box: Dict[int, List[Line]] = {} - self.part_line_list: List[Line] = [] + self.part_outlines: Dict[int, List[Line]] = {} + self.connection_lines: List[Line] = [] if DR_mod_runtime.use_DR_rust: self.rust_parts = None @@ -283,39 +283,69 @@ class SR1ShipRender(BaseScreen): self.status.draw_done = False # rust 渲染 if DR_mod_runtime.use_DR_rust: + # 2 先渲染 + # 6 后渲染 + # 保证部件不会遮盖住连接线 + part_group = Group(2, parent=self.part_group) + line_group = Group(6, parent=self.part_group) + # 渲染连接的部件 - part_group = Group(6, parent=self.part_group) - line_group = Group(5, parent=self.part_group) + for part_type, part_data in self.rust_ship.as_list(): + # 渲染部件 + part_sprite, part_line_box = self.part_render_init( + part_data, part_type, part_group, line_group, self.main_batch + ) + self.part_sprites[part_data.id] = part_sprite + self.part_outlines[part_data.id] = part_line_box + # TODO: 连接线渲染 + count += 2 + if count >= draw_batch: + yield count + count = 0 # 渲染未连接的部件 - - connect_line_group = Group(7, parent=self.part_group) - for connect in self.rust_ship.connections().get_raw_data(): - # 连接线 - # parent_part_data = cache[connect[2]][0][1] - # child_part_data = cache[connect[3]][0][1] - # color = ( - # random.randrange(100, 255), - # random.randrange(0, 255), - # random.randrange(0, 255), - # 255, - # ) - # self.part_line_list.append( - # Line( - # x=parent_part_data.x * 60, - # y=parent_part_data.y * 60, - # x2=child_part_data.x * 60, - # y2=child_part_data.y * 60, - # batch=self.main_batch, - # group=connect_line_group, - # width=1, - # color=color, - # ) - # ) - count += 1 - if count >= draw_batch * 3: - count = 0 + for part_group, part_connections in self.rust_ship.disconnected_parts(): + for part_type, part_data in part_group[0]: + # 未连接的需要同时把连接线也给渲染了 + # TODO: 连接线渲染 + part_sprite, part_line_box = self.part_render_init( + part_data, part_type, part_group, line_group, self.main_batch + ) + # 未连接的部件透明度降低 + part_sprite.opacity = 100 + self.part_sprites[part_data.id] = part_sprite + self.part_outlines[part_data.id] = part_line_box + count += 2 + if count >= draw_batch: yield count + count = 0 + + # for connect in self.rust_ship.connections().get_raw_data(): + # # 连接线 + # # parent_part_data = cache[connect[2]][0][1] + # # child_part_data = cache[connect[3]][0][1] + # # color = ( + # # random.randrange(100, 255), + # # random.randrange(0, 255), + # # random.randrange(0, 255), + # # 255, + # # ) + # # self.part_line_list.append( + # # Line( + # # x=parent_part_data.x * 60, + # # y=parent_part_data.y * 60, + # # x2=child_part_data.x * 60, + # # y2=child_part_data.y * 60, + # # batch=self.main_batch, + # # group=connect_line_group, + # # width=1, + # # color=color, + # # ) + # # ) + # count += 1 + # if count >= draw_batch * 3: + # count = 0 + # yield count self.status.draw_done = True raise GeneratorExit @@ -327,9 +357,9 @@ class SR1ShipRender(BaseScreen): self.status.draw_done = False logger.info(sr_tr().sr1.ship.ship.load().format(self.ship_name), tag="ship") start_time = time.perf_counter_ns() - self.parts_sprite: Dict[int, Sprite] = {} - self.part_line_box = {} - self.part_line_list = [] + self.part_sprites: Dict[int, Sprite] = {} + self.part_outlines: Dict[int, List[Line]] = {} + self.connection_lines: List[Line] = [] self.group_camera.reset() # 调用生成器 减少卡顿 try: @@ -467,7 +497,7 @@ class SR1ShipRender(BaseScreen): self.logger.info(f"sr1 mouse {self.status.draw_mouse_d_pos}") elif command.find("ship"): if self.status.draw_done: - for index, sprite in self.parts_sprite.items(): + for index, sprite in self.part_sprites.items(): sprite.visible = not sprite.visible elif command.find("get_buf"): @@ -510,7 +540,7 @@ class SR1ShipRender(BaseScreen): return img = Image.new("RGBA", img_size) part_data = self.rust_ship.as_dict() - for part, sprites in self.parts_sprite.items(): + for part, sprites in self.part_sprites.items(): for index, sprite in enumerate(sprites): sprite_img = sprite.image print(