用box重写了一遍外框

This commit is contained in:
shenjack-5600u 2024-05-26 11:25:33 +08:00
parent 160ad716c2
commit 5fa04bd47c
Signed by: shenjack
GPG Key ID: FDF9864E11C7E79F

View File

@ -16,7 +16,7 @@ from pyglet.math import Mat4
from pyglet.text import Label from pyglet.text import Label
from pyglet.sprite import Sprite from pyglet.sprite import Sprite
from pyglet.graphics import Batch, Group from pyglet.graphics import Batch, Group
from pyglet.shapes import Line, Rectangle from pyglet.shapes import Line, Box
from . import DR_mod_runtime from . import DR_mod_runtime
from .types import SR1Textures, SR1Rotation from .types import SR1Textures, SR1Rotation
@ -121,8 +121,8 @@ class SR1ShipRender(BaseScreen):
self.render_d_label = Label( self.render_d_label = Label(
"debug label NODATA", "debug label NODATA",
font_name=Fonts.微软等宽无线, font_name=Fonts.微软等宽无线,
x=main_window.width / 2, x=main_window.width // 2,
y=main_window.height / 2, y=main_window.height // 2,
) )
self.render_d_label.visible = self.status.draw_d_pos self.render_d_label.visible = self.status.draw_d_pos
@ -133,8 +133,7 @@ class SR1ShipRender(BaseScreen):
self.ship_name: Optional[str] = None self.ship_name: Optional[str] = None
# List/Dict data # List/Dict data
self.part_sprites: Dict[int, List[Sprite]] = {} self.part_sprites: Dict[int, Tuple[Sprite, Box]] = {}
self.part_box_dict: Dict[int, Rectangle] = {}
self.part_outlines: Dict[int, List[Line]] = {} self.part_outlines: Dict[int, List[Line]] = {}
self.connection_lines: List[Line] = [] self.connection_lines: List[Line] = []
@ -196,7 +195,7 @@ class SR1ShipRender(BaseScreen):
part_group: Group, part_group: Group,
line_group: Group, line_group: Group,
batch: Batch, batch: Batch,
) -> Tuple[Sprite, List[Line]]: ) -> Tuple[Sprite, Box]:
""" """
还是重写一下渲染逻辑 还是重写一下渲染逻辑
把渲染单个部件的逻辑提取出来放到这里 把渲染单个部件的逻辑提取出来放到这里
@ -219,58 +218,20 @@ class SR1ShipRender(BaseScreen):
random.randrange(0, 255), random.randrange(0, 255),
200, 200,
) )
part_line_box = []
width = 4 width = 4
(x, y), (x2, y2) = part_data.get_part_box_by_type(part_type) (x, y), (x2, y2) = part_data.get_part_box_by_type(part_type)
part_line_box.append( box = Box(
Line( x=x * 30,
x=x * 30, y=y * 30,
y=y * 30, width=part_type.width * 30,
x2=x * 30, height=part_type.height * 30,
y2=y2 * 30, thickness=width,
batch=batch, color=line_colors,
width=width, batch=batch,
color=line_colors, group=line_group,
group=line_group,
)
) )
part_line_box.append( box.rotation = part_data.angle_r
Line( return part_sprite, box
x=x * 30,
y=y2 * 30,
x2=x2 * 30,
y2=y2 * 30,
batch=batch,
width=width,
color=line_colors,
group=line_group,
)
)
part_line_box.append(
Line(
x=x2 * 30,
y=y2 * 30,
x2=x2 * 30,
y2=y * 30,
batch=batch,
width=width,
color=line_colors,
group=line_group,
)
)
part_line_box.append(
Line(
x=x2 * 30,
y=y * 30,
x2=x * 30,
y2=y * 30,
batch=batch,
width=width,
color=line_colors,
group=line_group,
)
)
return part_sprite, part_line_box
def sprite_batch(self, draw_batch: int = 100) -> Generator: def sprite_batch(self, draw_batch: int = 100) -> Generator:
""" """
@ -283,6 +244,7 @@ class SR1ShipRender(BaseScreen):
self.status.draw_done = False self.status.draw_done = False
# rust 渲染 # rust 渲染
if DR_mod_runtime.use_DR_rust: if DR_mod_runtime.use_DR_rust:
self.rust_ship: SR1Ship_rs
# 2 先渲染 # 2 先渲染
# 6 后渲染 # 6 后渲染
# 保证部件不会遮盖住连接线 # 保证部件不会遮盖住连接线
@ -292,13 +254,11 @@ class SR1ShipRender(BaseScreen):
# 渲染连接的部件 # 渲染连接的部件
for part_type, part_data in self.rust_ship.as_list(): for part_type, part_data in self.rust_ship.as_list():
# 渲染部件 # 渲染部件
part_sprite, part_line_box = self.part_render_init( part_sprite, part_box = self.part_render_init(
part_data, part_type, part_group, line_group, self.main_batch part_data, part_type, part_group, line_group, self.main_batch
) )
for line in part_line_box: part_box.opacity = 100
line.opacity = 100 self.part_sprites[part_data.id] = (part_sprite, part_box)
self.part_sprites[part_data.id] = part_sprite
self.part_outlines[part_data.id] = part_line_box
# TODO: 连接线渲染 # TODO: 连接线渲染
count += 2 count += 2
if count >= draw_batch: if count >= draw_batch:
@ -306,19 +266,17 @@ class SR1ShipRender(BaseScreen):
count = 0 count = 0
# 渲染未连接的部件 # 渲染未连接的部件
for part_group, part_connections in self.rust_ship.disconnected_parts(): for part_groups, part_connections in self.rust_ship.disconnected_parts():
for part_type, part_data in part_group[0]: for part_type, part_data in part_groups[0]:
# 未连接的需要同时把连接线也给渲染了 # 未连接的需要同时把连接线也给渲染了
# TODO: 连接线渲染 # TODO: 连接线渲染
part_sprite, part_line_box = self.part_render_init( part_sprite, part_box = self.part_render_init(
part_data, part_type, part_group, line_group, self.main_batch part_data, part_type, part_group, line_group, self.main_batch
) )
for line in part_line_box: part_box.opacity = 100
line.opacity = 100
# 未连接的部件透明度降低 # 未连接的部件透明度降低
part_sprite.opacity = 100 part_sprite.opacity = 100
self.part_sprites[part_data.id] = part_sprite self.part_sprites[part_data.id] = (part_sprite, part_box)
self.part_outlines[part_data.id] = part_line_box
count += 2 count += 2
if count >= draw_batch: if count >= draw_batch:
yield count yield count
@ -361,8 +319,7 @@ class SR1ShipRender(BaseScreen):
self.status.draw_done = False self.status.draw_done = False
logger.info(sr_tr().sr1.ship.ship.load().format(self.ship_name), tag="ship") logger.info(sr_tr().sr1.ship.ship.load().format(self.ship_name), tag="ship")
start_time = time.perf_counter_ns() start_time = time.perf_counter_ns()
self.part_sprites: Dict[int, Sprite] = {} self.part_sprites = {}
self.part_outlines: Dict[int, List[Line]] = {}
self.connection_lines: List[Line] = [] self.connection_lines: List[Line] = []
self.group_camera.reset() self.group_camera.reset()
# 调用生成器 减少卡顿 # 调用生成器 减少卡顿