第一章 高级碰撞检测
1.1 不规则形状对象的碰撞测试:
1.1.1 位图用于碰撞检测:
函数原型如下:
myBitmapData.hitTest(firstPoint : Point, firstAlphaThreshold : uint, secondObject : Object, secondPoint : Point, secondAlphaThreshold : uint)
测试两个位图:
if(bmpd1.hitTest(new Point(bmp1.x, bmp1.y), 255, bmpd2, new Point(bmp2.x, bmp2.y), 255))
{
//bitmap is touching bitmap
}
//测试位图与点,这里是位图与鼠标的碰撞检测:
if(myBitmapData.hitTest(new Point(myBitmapData.x, myBitmapData.y), 255, new Point(mouseX, mouseY)))
{
//mouse is touching bitmap
}
1.1.2 半透明形状的碰撞测试:改变函数原型中的AlphaThreshold参数可以设定达到多少透明度就判定为碰撞。
1.1.3 使用BitmapData.hitTest测试非位图对象:对于不是位图的比如:MoveClip、Sprite等只需创建相应的BitmapData然后不需要和Bitmap关联,也不需要加入到显示列表中。仅仅用来进行碰撞检测。
1.2 大量对象的碰撞测试:
1.2.1 实现基于网格的碰撞检测:将整个舞台划分为很多小区域,然后在小区域中进行碰撞检测,等小区域中检测完,再检测和邻近小区域之间是否有碰撞。
1.2.2 编写网格代码:
1.2.3 测试和调整网格:
1.2.4 建成一个可重用的类:
1.2.5 碰撞检测—并不只是碰撞:对于一定范围内的敌人进行攻击,也可以用网格方式实现。
第二章 转向行为
2.1 行为:这里要讨论的行为包括搜寻、逃避、到达、追捕、躲避、漫游、对象规避、路径追随、群落(这是一个复杂的复合行为,由3种简单行为组成:分离、内聚、排队)。
2.2 Vector2D类:详见Vector2D.as
2.3 Vehicle类:详见Vehicle.as TestVehicle.as是对该类的测试。
2.4 SteeredVehicle类:详见SteeredVehicle.as
2.4.1 搜寻行为:详见SteeredVehicle.as SeekTest.as是对该类测试。
2.4.2 逃避行为:详见SteeredVehicle.as FleeTest.as是对该类测试。对搜寻和逃避的综合利用SeekFleeTest2.as很有意思。
2.4.3 到达行为:详见SteeredVehicle.as ArriveTest.as是对该类测试。
2.4.4 追捕行为:详见SteeredVehicle.as PursueTest.as是对该类测试。
2.4.5 躲避行为:详见SteeredVehicle.as PursueEvadeTest.as是对该类测试。
2.4.6 漫游行为:详见SteeredVehicle.as WanderTest.as是对该类测试。
2.4.7 对象规避:详见SteeredVehicle.as AvoidTest.as是对该类测试。
2.4.8 路径追随:详见SteeredVehicle.as PathTest.as是对该类测试。
2.5 群落: 详见SteeredVehicle.as FlockTest.as是对该类测试。
第三章 等角投影
3.1 等角投影与二等角投影:真正的游戏中使用的是二等角投影。因为二等角投影的两个对角线的比例为2:1。
3.2 创建等角图形:
3.3 等角变换:
3.3.1 世界坐标变换为屏幕坐标:
3.3.2 屏幕坐标转换为世界坐标:
3.3.3 IsoUtils类:详见IsoUtils.as 和IsoTransformTest.as文件。
3.4 等角对象:详见IsoObject.as DrawnIsoTile.as DrawnIsoBox.as TileTest.as BoxTest.as DepthTest.as DepthTest2.as文件。
3.5 等角世界类:详见IsoWorld.as WorldTest.as 类。
3.6 3D中的移动:详见MotionTest.as MotionTest2.as类。
3.8 碰撞检测:详见CollisionTest.as类。
3.9 使用外部图形:详见GraphicTile.as GraphicTest.as类。
3.10 等角区块图:详见MapLoader.as MapTest.as类。
第四章 寻路
4.1 寻路基础:
4.2 A*:详见AStar.as类。算法描述如下:
(1).将起始节点添加到待查列表。
(2).主搜索循环:
(a).寻找待查列表中有最小代价的节点,设为当前节点。
(b).如果当前节点就是终止节点,则完成。转向步骤4。
(c).检查各个相邻节点(在一个矩形网格中,将有8个相邻节点)。对于每个相邻节点:
(i).如果该节点不可通过,或者已经在待查列表或已查列表中,则将其跳过,继续处理下一个相邻节点,否则继续;
(ii).计算代价;
(iii).将当前节点设置为其父节点;
(iv).把它添加到待查列表中。
(d).将当前节点添加到已查列表中。
(e).如果当前待查列表为空,则路径不通,直接返回。否则跳转到(a)。
(3).针对更新后的待查列表重复执行步骤2。
(4).已经到达终止节点。创建一个路径列表,并把终止节点添加到该列表。
(5).将终止节点的父节点添加到路径列表。
(6).将该节点的父节点添加到路径列表。重复这个过程直至到达起始节点。路径列表现在包含从起点到终点路径的所有节点。
4.3 实现AStar类:详见GridView.as PathFinding.as类。
4.4 在游戏中使用AStar:详见Game.as类。
4.5 高级地形:
第五章 其他输入方式:摄像头和麦克风
5.1 摄像头和麦克风:
5.2 声音作为输入:Microphone类是Flash中的麦克风输入类。
5.3 视频作为输入:
第六章 高级物理:数值积分
6.1 数值积分以及为什么欧拉积分“不好”:欧拉积分的做法是把误差忽略掉。
6.2 龙格-库塔积分:龙格-库塔积分虽然比欧拉积分更准确,但也只是模拟,并不精确。龙格-库塔积分这里简称为RK。RK主要有两种:龙格-库塔二阶积分(简称RK2)和龙格-库塔四阶积分(简称RK4),这里的数字表示中间采样的次数。
(1).RK2:其策略是计算物体在当前状态下的加速度、速度和位置(基本欧拉积分),然后计算应用了所计算加速度和速度之后的状态,对二者取平均,再应用该结果得到物体的状态。换句话说,欧拉积分的做法是试图根据一个点猜测出一段时间的全部速度,而RK2则是取这个时间段起点和终点的速度,对二者取平均值来估计这段时间的速度。
(1).RK4:根据时间段内的4个采样平均得出曲线的曲度。比RK2更加准确。
6.2.1 基于时间的运动:代码见Euler.as文件,这里是基于时间的欧拉积分的代码实现。
6.2.2 编写龙格-库塔二阶积分(RK2)代码:代码见RK2.as文件。
6.2.3 编写龙格-库塔四阶积分(RK4)代码:代码见RK4.as文件。
6.2.4 薄弱环节:上面实例中模仿的弹力是有问题。
6.2.5 龙格-库塔小结:
6.3 Verlet积分:Verlet积分的关键特性之一在于:它不会显式地存储一个对象的速度,实际上只会存储对象的上一个位置。这样一来,需要知道对象的速度时,只需将其当前位置减去上一个位置。因此,每次移动一个对象时,也就是在改变它的速度。只需改变对象的位置就可以影响速度。
6.3.1 Verlet点:详见VerletPoint.as VerletPointTest.as类文件。
6.3.2 Verlet线段:详见VerletStick.as VerletStickTest.as类文件。
6.3.3 Verlet结构:详见Triangle.as Square.as 类文件。
6.3.4 关节:详见Hinge.as 类文件。
6.3.5 进一步深入:
6.4 小结:
第七章 Flash 10中的3D
7.1 Flash 10 3D基础:详见Test3D.as类文件。
7.2 3D定位:详见Position3D.as类文件。
7.2.1 深度排序:详见DepthSort.as类文件。
7.2.2 3D容器:详见Container3D.as类文件。
7.3 3D旋转:详见RotateAndPosition.as Carousel.as类文件。
7.4 视场与焦距:详见Carousel.as类文件。
7.5 屏幕和3D坐标:详见LocalGlobal.as类文件。
7.6 指向:详见FollowMouse3D.as类文件。
第八章 Flash 10绘图API
8.1 路径:
8.1.1 一个简单的绘图程序:详见PathSketch.as类文件。
8.1.2 绘制曲线:详见CurveDrawing.as类文件。
8.1.3 Wide绘制命令和NO_OP:GraphicsPathCommand.WIDE_LINE_TO会跳过数据向量中的下一对数。GraphicsPathCommand.NO_OP命令什么也不做。
8.1.4 环绕:
8.2 三角形:
8.2.1 位图填充与三角形:详见BitmapTriangles.as BitmapTrianglesUV1.as BitmapTrianglesUV2.as BitmapTrianglesUV3.as类文件。
8.2.2 三角形与3D:详见ImageTube.as ImagePshere.as类文件。
8.3 图形数据:详见HistoryDraw.as 类文件。
第九章 Pixel Bender
9.1 什么是Pixel Bender:
9.2 编写一个Pixel Shader:
9.3 数据类型:
9.4 获得当前像素坐标:
9.5 参数:
9.6 输入图像采样:
9.7 Flash的旋转Shader:
9.8 在Flash中使用Pixel Bender Shader:
9.9 使用Shader作为滤镜:
9.10 使用Shader作为混合模式:
第十章 补间引擎
10.1 Flash Tween类:详见FlashTween.as类文件。
10.1.1 缓动函数:缓动类在fl.transitions.easing包中,每个类有三个函数easeIn、easeOut和easeInOut,有如下缓动函数:
(1).Back:到达目标后会在目标附近左右摆动。
(2).Bounce:到达目标后会反弹。
(3).Elastic:像弹簧一样启动,像弹簧一样停止。
(4).None:没有效果。
(5).Regular:普通效果。
(6).Strong:缓慢启动,缓慢停止。
10.1.2 结合补间:
(1).并行补间:同时发生的多个补间成为并行补间。详见FlashTween.as类文件。
(2).补间序列:一个接一个连续发生的补间称为补间序列。
10.2 Flex Tween类:
10.3 补间引擎:
10.4 Tweener:
10.5 TweenLite/TweenGroup:
10.6 KitchenSync:
10.7 gTween: