WEB开发网
开发学院软件开发C语言 C#开发WPF/Silverlight动画及游戏系列教程(Game C... 阅读

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十) 第一部分拓展小结篇

 2009-07-01 07:07:30 来源:WEB开发网   
核心提示: 传统的方法有两种: 第一种我且称之为坐标还原法:即时时记录精灵未碰撞障碍物时的坐标(Old_X,Old_Y),C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十) 第一部分拓展小结篇(2),在精灵移动时一旦检测到精灵此时站到了障碍物上,则将精灵此时

传统的方法有两种:

第一种我且称之为坐标还原法:即时时记录精灵未碰撞障碍物时的坐标(Old_X,Old_Y),在精灵移动时一旦检测到精灵此时站到了障碍物上,则将精灵此时的坐标进行还原(X=Old_X,Y= Old_Y),然后启动A*寻路。此方法的优点是使用简单,不需要复杂的判断逻辑;缺点是效果不好,在画面上将造成精灵一瞬间被弹开的情况,虽然那一刻非常的短暂且距离微小,但是对于精灵移动动画平滑性的影响是严重的,因此我们最好不要采用此方法。

第二种为启发式预测法:该方法的原理为时时对精灵前方的区域进行预测,一旦发现前方有障碍物,则即时启动A*寻路直到目的地。该方法可谓绝对皇室血统,一个字“正”,集所有优点之大成者;优点多相对的实现起来难度就大些。在WPF/Silverlight中如何实现之?先来看下图:

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十) 第一部分拓展小结篇

上图中已经给了很详细的说明,即在直线移动过程中,精灵时时判断此时朝向前方的单元格是否为障碍物,如果是则启动A*寻路饶过它。充分理解了原理后,我们可以通过如下方法来返回精灵是否将要遇到障碍物了:

//判断是否将要碰撞到障碍物(障碍物预测法)
private bool WillCollide() {
  switch ((int)Spirit.Direction) {
     case 0:
        return Matrix[(int)(Spirit.X / GridSize), (int)(Spirit.Y / GridSize) - 1] == 0 ? true : false;
     case 1:
        return Matrix[(int)(Spirit.X / GridSize) + 1, (int)(Spirit.Y / GridSize) - 1] == 0 ? true : false;
     case 2:
        return Matrix[(int)(Spirit.X / GridSize) + 1, (int)(Spirit.Y / GridSize)] == 0 ? true : false;
     case 3:
        return Matrix[(int)(Spirit.X / GridSize) + 1, (int)(Spirit.Y / GridSize) + 1] == 0 ? true : false;
     case 4:
        return Matrix[(int)(Spirit.X / GridSize), (int)(Spirit.Y / GridSize) + 1] == 0 ? true : false;
     case 5:
        return Matrix[(int)(Spirit.X / GridSize) - 1, (int)(Spirit.Y / GridSize) + 1] == 0 ? true : false;
     case 6:
        return Matrix[(int)(Spirit.X / GridSize) - 1, (int)(Spirit.Y / GridSize)] == 0 ? true : false;
     case 7:
        return Matrix[(int)(Spirit.X / GridSize) - 1, (int)(Spirit.Y / GridSize) - 1] == 0 ? true : false;
     default:
        return true;
   }
}

上一页  1 2 3 4 5 6 7  下一页

Tags:开发 WPF Silverlight

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接