[Silverlight动画]转向行为 - 路径跟随
时间:2022-04-22
本文章向大家介绍[Silverlight动画]转向行为 - 路径跟随,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
路径跟随这名字一听就知道要干嘛了:机车会沿着一个预定的路线行驶。虽然在地图或者游戏中,路径是以图形的形式被表示的,而在转向行为中,其不过是一系列航点。 其策略真是简单到不行。只要从第一个航点开始挨个寻找下去即可。
private int _pathIndex = 0;
private double _pathThreshold = 20;
public void followPath(List<Vector2D> path,bool loop) {
if (path.Count==0)
{
return;
}
Vector2D wayPoint = path[_pathIndex];
if (wayPoint==null)
{
return;
}
if (_postion.dist(wayPoint)<_pathThreshold)
{
if (_pathIndex>=path.Count-1)
{
if (loop)
{
_pathIndex = 0;
}
}
else
{
_pathIndex++;
}
}
if (_pathIndex>=path.Count-1&&!loop)
{
arrive(wayPoint);
}
else
{
seek(wayPoint);
}
}
路径索引(pathIndex)相当于是数组索引,用于指向下一个航点。路径阈值(pathThreshold)相当于航点间距。
首先是取得当前航点,如果航点不是一个有效2D向量,就返回,这么作就是说,即使传递一个空数组也不会报错。接着是判断,到航点间的距离是否足以切换到下一个航点,然后根据循环再判断最后一个航点索引是否归零。写起来是很啰嗦,实际上画出航点后,按部就班的执行以上逻辑,就会发现是很直观的。
有了航点就能移动了,以此调用最后一行的寻找函数已经有了不俗表现,但为了更优美一点,假设是最后一个航点又不要循环的话,采用到达行为可以使机车慢慢的靠近终点,而不会在终点左右摇摆。
测试:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Steer" xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Class="Steer.PathTest"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<local:SteeredVehicle x:Name="myTarget" HorizontalAlignment="Left" Height="40" VerticalAlignment="Top" Width="40" RenderTransformOrigin="0.5,0.5">
<ed:RegularPolygon Fill="#FFFD00FF" Height="40" InnerRadius="1" PointCount="5" Stretch="Fill" Stroke="Black" StrokeThickness="0" UseLayoutRounding="False" Width="40"/>
</local:SteeredVehicle>
</Grid>
</UserControl>
public partial class PathTest : UserControl
{
private List<Vector2D> _path;
public PathTest()
{
InitializeComponent();
Loaded += new RoutedEventHandler(PathTest_Loaded);
}
void PathTest_Loaded(object sender, RoutedEventArgs e)
{
_path = new List<Vector2D>();
LayoutRoot.MouseLeftButtonUp += new MouseButtonEventHandler(LayoutRoot_MouseLeftButtonUp);
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
myTarget.followPath(_path, true);
myTarget.update();
}
void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
_path.Add(new Vector2D(e.GetPosition(null).X, e.GetPosition(null).Y));
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL 案例:init_connect 引发的 Lost connection
- PHP一个简单的无需刷新爬虫
- PHP实现函数内修改外部变量值的方法示例
- PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
- PHP命名空间简单用法示例
- PHP array_shift()用法实例分析
- PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
- 基于Python+QT的gui程序开发实现
- 使用tensorflow根据输入更改tensor shape
- 使用keras实现非线性回归(两种加激活函数的方式)
- Django Form设置文本框为readonly操作
- 浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
- keras和tensorflow使用fit_generator 批次训练操作
- php-fpm中max_children的配置
- python文件读取失败怎么处理