当前位置: 首页 > news >正文

使用 Win2D 绘制带图片纹理的圆(或椭圆)

使用 Win2D 绘制图片和绘制椭圆都非常容易,可是如何使用 Win2D 绘制图片纹理的椭圆呢?


本文内容

      • 重力迷宫小球
      • Win2D 实现
      • 关于 CanvasCommandList

重力迷宫小球

重力迷宫
▲ 重力迷宫

你可以看到这个小球就像一个透明塑料小球一样,纹理会跟随背景而动。这显然不是 Win2D 中的游戏循环:CanvasAnimatedControl 一文中我用 DrawEllipse 画的那个灰色小球。

Win2D 实现

我们会使用到 Win2D 中的多种特效:

  • MorphologyEffect
    • 用于将背景那些红色的洞洞转换成较虚的形态,以便球看起来不是扁平的。
    • 不是必要的,只是为了好看而已。
  • CropEffect
    • 将背景区域裁剪成一个较小的区域。
    • 不是必要的。
  • AlphaMaskEffect
    • 使用透明度蒙版使得图片只露出椭圆部分。
    • 这是绘制椭圆必要的特效。
  • ShadowEffect
    • 做一个小球的阴影。
    • 不是必要的。

要画出图片纹理的椭圆,只需要这么一点代码即可:

using (var list = new CanvasCommandList(creator))
{
    using (var s = list.CreateDrawingSession())
    {
        s.FillEllipse(_xPosition, _yPosition, _radius, _radius, Colors.Black);
    }

    var mask = new AlphaMaskEffect
    {
        Source = bitmap,
        AlphaMask = list,
    };

    ds.DrawImage(mask);
}

带图片纹理的椭圆
▲ 带图片纹理的椭圆

现在,如果你希望获得本文一开始获得的那种奇妙的效果,可以添加更多的特效:

var bitmap = _game.Material.bitmap;
var morphology = new MorphologyEffect
{
    Source = bitmap,
    Mode = MorphologyEffectMode.Dilate,
    Width = 40,
    Height = 40,
};

var crop = new CropEffect
{
    Source = morphology,
    SourceRectangle = new Rect(
        _xPosition - _radius, _yPosition - _radius,
        _radius + _radius, _radius + _radius),
};

using (var list = new CanvasCommandList(creator))
{
    using (var s = list.CreateDrawingSession())
    {
        s.FillEllipse(_xPosition, _yPosition, _radius, _radius, Colors.Black);
    }

    var mask = new AlphaMaskEffect
    {
        Source = crop,
        AlphaMask = list,
    };

    var shadow = new ShadowEffect
    {
        Source = mask,
        BlurAmount = 4,
        ShadowColor = Color.FromArgb(0x40, 0x00, 0x00, 0x00),
    };

    ds.DrawImage(shadow);
    ds.DrawImage(mask);
}

关于 CanvasCommandList

上面的例子中,我们是用到了 CanvasCommandList。它可以帮助我们将绘制命令先绘制到一个缓存的上下文中,以便被其他绘制上下文进行统一的处理。

阅读林德熙的博客了解更多 CanvasCommandList 的资料:win2d CanvasCommandList 使用方法 - 林德熙。

相关文章:

  • Win2D 中的游戏循环:CanvasAnimatedControl
  • 使用 Windows 10 中的加速度计(Accelerometer,重力传感器)
  • 用 dotTrace 进行性能分析时,各种不同性能分析选项的含义和用途
  • 如何创建一个基于 .NET Core 3 的 WPF 项目
  • 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
  • 了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • 在有 UI 线程参与的同步锁(如 AutoResetEvent)内部使用 await 可能导致死锁
  • 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 LazyT 中导致死锁
  • 定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中什么样的类是可使用 await 异步等待的?
  • Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
  • 使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范
  • StyleCop 是什么,可以帮助团队带来什么价值?
  • Angular Elements 及其运作原理
  • Angular4 模板式表单用法以及验证
  • docker python 配置
  • IDEA常用插件整理
  • Linux Process Manage
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Protobuf3语言指南
  • Python学习之路13-记分
  • sublime配置文件
  • Windows Containers 大冒险: 容器网络
  • windows-nginx-https-本地配置
  • yii2中session跨域名的问题
  • 机器学习 vs. 深度学习
  • 将 Measurements 和 Units 应用到物理学
  • 思考 CSS 架构
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 消息队列系列二(IOT中消息队列的应用)
  • ​业务双活的数据切换思路设计(下)
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #mysql 8.0 踩坑日记
  • #NOIP 2014#Day.2 T3 解方程
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1)(1.13) SiK无线电高级配置(五)
  • (BFS)hdoj2377-Bus Pass
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (生成器)yield与(迭代器)generator
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Linq学习笔记
  • .htaccess 强制https 单独排除某个目录
  • .net Application的目录
  • .net core 连接数据库,通过数据库生成Modell
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈