超极本以其轻薄、长续航和高性能而著称。它们还配备了许多独特的传感器,这些传感器不仅可以用于传统的用途,还可以用于创造更加智能和生动的应用程序。UltraHello正是利用了超极本的这些特性,允许用户通过这些新的感知能力与虚拟世界中的对象/环境进行互动。
UltraHello是一款使用C#和XAML开发的WinRT应用程序。
本文将展示UltraHello的完整概念,包括屏幕截图。请注意,这些截图并不代表最终设计,因为它们可能会为了更好的效果而进行更改。在最终提交之前,还将添加新功能和级别。
UltraHello利用多点触控功能,允许用户使用手指与世界中的对象进行交互。该世界使用Farseer物理引擎模拟物理效果,使得破坏、投掷和碰撞对象非常逼真。用户可以使用多达四根手指划动对象,这比使用鼠标更加有趣。
用户还可以通过同时在多达4个点上触摸来产生烟花,这在笔记本电脑/台式机上是不可能的。
UltraHello将允许使用加速度计和陀螺仪操纵世界重力。只需改变设备的物理方向,就可以看到世界以完全不同的方式行为!可以反转重力或使其变得混乱!
通常的指南针应用程序是通过使用两个值来编码的,一个是目前的指南针读数,另一个是尝试达到最终读数。这提供了平滑且逼真的指南针视图。创建旋转很容易,只需为跟随变量提供加速度而不是恒定速度。下面的刻度盘上的每个环将具有不同的初始角速度,水平旋转设备将根据指南针读数美观地操纵它们。
UltraHello会自动分析用户的天气和位置,并相应地设置世界主题。例如,如果下雨,就会出现一个下雨的背景,这在美学上是令人愉悦的。UltraHello还可以检测动物园和丛林等常见地点,如果在那里运行UltraHello,它将自动设置一个合适的主题。这个功能使这个应用程序更加生动,更加了解位置/环境。
超极本为每个主题提供了两种变体:浅色和深色,利用环境光感应技术,UltraHello会在黑暗环境中设置浅色主题,在明亮环境中设置深色主题。这再次使它更加了解环境。
Windows 8为提供了用户使用两根手指旋转对象时的旋转数据。UltraHello利用这个手势,允许执行诸如模拟从一个玻璃杯到另一个玻璃杯的水流等操作。这在仅使用鼠标的情况下是不可能的!
现在让看看如何在本文中提到的一些事项。使用的farseer包装器是Physics Helper XAML(可在CodePlex上获得)。它非常整洁,适用于WP7和WinRT。
从以下网址获取:
http://physicshelperxaml.codeplex.com/
右键单击解决方案,然后选择“添加现有项目”。浏览到Physics Helper XAML ZIP下载中的\PhysicsHelperXaml\Farseer Physics Engine Metro\Farseer Physics Engine Metro.csproj。
从主项目中,向Farseer Physics Engine Metro和Spritehand.PhysicsHelper.Metro项目添加引用。
在XAML页面顶部添加此命名空间。
xmlns:FarseerHelper="using:Spritehand.FarseerHelper"
现在创建一个物理画布,所有启用物理的精灵都将是这个画布的子项。
MousePickEnabled
帮助用户通过触摸/鼠标操纵对象。
<FarseerHelper:PhysicsCanvas Height="768" Width="1366" MousePickEnabled="True">
现在可以以以下方式在画布内创建精灵:
<FarseerHelper:PhysicsCanvas Height="768" Width="1366" MousePickEnabled="True">
<FarseerHelper:PhysicsSprite Height="100" Width="100" Canvas.Left="311" Canvas.Top="540">
<Rectangle Fill="#FFAC809A" Height="100" Stroke="Black" Width="100" />
</FarseerHelper:PhysicsSprite>
</FarseerHelper:PhysicsCanvas>
Canvas具有其他属性,如GravityHorizontal和GravityVertical,这些属性可以帮助做一些令人惊奇的事情。将精灵设置为Static使其不可移动,这种技术应该用于制作世界边界。
关节,顾名思义,连接两个物理精灵。现在这个关节可以是焊接的,即非常僵硬的,也可以是弹性的。观察以下语法:
<FarseerHelper:PhysicsJoint Height="8" Width="8" Canvas.Left="1086" Canvas.Top="441" BodyOne="_5" BodyTwo="_6" AngleSpringConstant="0.2" />
这是一个在(1086, 441)处的关节,连接身体_5和身体_6(精灵),并且具有0.2的弹性常数。
那些蓝色的点肯定不像流体,但将告诉如何使它们变得如此。稍后会提供完整的源代码。
在WinRT中使用传感器非常容易,大多数传感器都使用相同的编码风格:
让使用加速度计,添加以下命名空间到C#代码中:
using Windows.Devices.Sensors;
Accelerometer accelerometer;
accelerometer = Accelerometer.GetDefault();
accelerometer.ReadingChanged += accelerometer_ReadingChanged;
accelerometer.ReportInterval = accelerometer.MinimumReportInterval;
假设playerBlock是PhysicsSprite,希望使用加速度计移动它,请执行以下操作(请尝试值!):
void accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
{
playerBlock.Position = new Vector2() { X = (float)(playerBlock.Position.X + args.Reading.AccelerationX), Y = (float)(playerBlock.Position.Y - args.Reading.AccelerationY) };
playerBlock.Update();
}
请注意上面的playerBlock.Update(),这是必需的,以保持引擎内的精灵与在屏幕上看到的精灵同步。不要忘记这一点!
超极本确实是令人惊叹的设备 - 它们首次为Windows PC带来了审美愉悦,同时还具备感知能力。WinRT还使充分利用这些系统的新功能变得非常容易。超极本+Windows 8绝对是值得期待的技术!
最后,希望所有使用Farseer的人都关注“Neat Trick”。
流体模拟代码
使用加速度计操纵重力