#svg #bevy #graphics #vector-graphics #game-engine #gamedev

bevy_svg_map

将SVG加载到bevy的工具,基于样式添加属性

3个不稳定版本

0.2.0 2021年8月3日
0.1.1 2021年1月4日
0.1.0 2020年10月10日

#757 in 游戏开发

MIT许可证

225KB
398

Project logo

build Build Status

Bevy SVG map

用于将SVG文件直接加载到bevy的Crate。线条的属性(颜色、不透明度、填充等)可用于编程添加功能,为一个非常奇怪的 workflow 奠定基础:矢量图形作为bevy实体的编辑器!

如果您正在寻找一个加载SVG的插件,您可能想看看 bevy_svg

入门

将库添加到项目的 Cargo.toml(检查最新发布的版本,它与分支 crates.io上的稳定版本相对应)

[dependencies]
bevy_svg_map = "0.2"

如果您想要前沿技术(对应于 master

[dependencies]
bevy_svg_map = {git="https://github.com/carrascomj/bevy_svg_map.git"}

⚠️ master分支指向每个 bevy 的 master 分支。请谨慎使用!

该库提供了一个函数,可以在bevy的启动系统中使用。这里,我们在 assets/ 目录下加载了文件 ex.svg

use bevy_svg_map::load_svg_map;
use bevy::prelude::*;

// We need to provide a struct implementing the StyleStrategy
// leave it as default, we'll come back to this later
struct MyStrategy;

impl StyleStrategy for MyStrategy {}

fn main() {
    App::build()
          .add_default_plugins()
          .add_startup_system(setup.system())
          .run();
}

fn setup(mut com: Commands, mat: ResMut<Assets<ColorMaterial>>, mesh: ResMut<Assets<Mesh>>) {
    load_svg_map(com, mat, mesh, "assets/ex.svg", MyStrategy);
}

这应该会显示一些线条,如上图的图像所示。然而,它们是纯黑色的(StyleStrategy的默认值)。关于使用SVG路径的线条颜色怎么办?

// we're now also using SvgStyle
use bevy_svg_map::{load_svg_map, StyleStrategy, SvgStyle};
use bevy::prelude::*;

struct MyStrategy;

impl StyleStrategy for MyStrategy {
  // implement this trait method
  fn color_decider(&self, style: &SvgStyle) -> Color {
        match style.stroke() {
            Some(c) => c,
            // add red lines if the Color could not be parsed from the SVG
            _ => Color::RED,
        }
    }
}

好吧,这更有趣了。注意 SvgStyle 如何公开SVG路径的样式属性。对于这些路径中的每一个,都会应用 color_decider 函数来……好吧……决定它的颜色。

最后,为了提供一些真正有趣的功能,我们可以对从路径创建的每个组件应用任意函数。

// ... same as before
use bevy::ecs::system::EntityCommands;

// This Component will be added to each SpriteComponents created from a path
enum Collider {
    Scorable,
    Solid,
}

impl StyleStrategy for MyStrategy {
  // implement this trait method
  fn color_decider(&self, style: &SvgStyle) -> Color {
        // same as before
  }
  fn component_decider(&self, style: &SvgStyle, mut comp: EntityCommands) {
    // use the stroke opacity to decide the kind of Collider
      comp.insert(
          if style.stroke_opacity().unwrap() == 1.0 {
              Collider::Solid
          } else{
              Collider::Scorable
          }
      );
  }
}

在文档中查看更多可从 SvgStyle 提取的属性!

故障排除

  • 将文档属性(在Inkscape中为 Ctrl+Shift+D)设置为像素,以便获得正确的世界单位。
  • 查看有关设置SVG输出的 此评论

功能

  • 加载水平和垂直线条。
  • 加载其他类型的 svgtypes PathSegment
  • 提供策略 trait,用于使用样式添加组件和材质。
  • 基本形状。
  • 处理单位。

依赖

~17–26MB
~428K SLoC