如何在actionscript中实现视线限制?

我正在编程的游戏有问题。 我正在做一些安全游戏,我想有一些视觉上的视线。 问题是我不能限制我的视线,所以我的警察不能看穿墙壁。 下面你会发现他们可以通过窗户看到的devise,而不是墙壁。 在下面进一步您可以find我的问题是完全的例证。

设计

这就是现在的样子。 正如你所看到的,警察可以看穿墙壁。

在这里输入图像描述

这是我想用来限制视线的地图。

视觉地图

所以我现在编程视线的方式就是通过计算一些点并相应地绘制视线,如下所示。 请注意,我也检查使用bitmapdata命中检查是否我的球员已经被任何警察发现。

private function setSight(e:Event=null):Boolean { g = copCanvas.graphics; g.clear(); for each(var cop:Cop in copCanvas.getChildren()) { var _angle:Number = cop.angle; var _radians:Number = (_angle * Math.PI) / 180; var _radius:Number = 50; var _x1:Number = cop.x + (cop.width/2); var _y1:Number = cop.y + (cop.height/2); var _baseX:Number = _x1 + (Math.cos(_radians) * _radius); var _baseY:Number = _y1 - (Math.sin(_radians) * _radius); var _x2:Number = _baseX + (25 * Math.sin(_radians)); var _y2:Number = _baseY + (25 * Math.cos(_radians)); var _x3:Number = _baseX - (25 * Math.sin(_radians)); var _y3:Number = _baseY - (25 * Math.cos(_radians)); g.beginFill(0xff0000, 0.3); g.moveTo(_x1, _y1); g.lineTo(_x2, _y2); g.lineTo(_x3, _y3); g.endFill(); } var _cops:BitmapData = new BitmapData(width, height, true, 0); _cops.draw(copCanvas); var _bmpd:BitmapData = new BitmapData(10, 10, true, 0); _bmpd.draw(me); if(_cops.hitTest(new Point(0, 0), 10, _bmpd, new Point(me.x, me.y), 255)) { gameover.alpha = 1; setTimeout(function():void{ gameover.alpha = 0; }, 5000); stop(); return true; } return false; } 

所以现在我的问题是:有没有人知道如何限制视线,使警察不能看穿墙壁? 非常感谢。

ps:我已经看过emanuele feronato的这个教程,但是我不能用代码限制视线。

由于您已经检查过玩家是否在警察的观看区域内,您可以通过视线检查进行跟踪。

看起来像你使用基于位图的方法为你的整个世界。 所以我建议你做以下几点:

  • 检查玩家是否在警察的观看区域内
  • 如果是,则使用Bresenham线algorithm来采样从警察位置到玩家位置的墙地图的像素。 如果您碰到一个黑色的像素,那么这个视图会被一堵墙挡住。

虽然这不是很准确(玩家可以隐藏在一个小物体后面,如果从警察到玩家的路线都穿过这个物体),它会非常快,对于你的游戏应该足够准确。

更新:为了改善这一点,你可以做两个视线testing,从警察的位置到玩家最左边的点,然后到最右边的点,如下图所示:

视线范例


编辑

看起来你想dynamic地绘制每个警察的实际观看区域,而不是一个三角形。 要做到这一点的一个方法是查看2D阴影 。 我曾经做过基于位图图像的2D阴影的快速实验。 我把你的墙地图整合到我的代码中。 以下是交互式结果 ,下面是您可以自由使用的源代码作为您自己实现的起点。

2D阴影示例

在左上方,您会看到合成图像,右上角显示原始地图图像。 左下角显示计算出的光线像素,右下角显示使用的距离图。 您可以使用鼠标拖动灯光并使用箭头键(左/右)增加/减less光线半径。 而不是渲染一个圆圈,你只会渲染你的三角形为“活跃”。

为了快速计算光半径内的每个单个像素,我使用了一个距离图来查找从任何给定像素可以行进多less距离,而不会碰到障碍物。 距离图在初始化时计算,因此flash文件需要一段时间才能初始化(因为距离图的计算相当繁重)。 为了避免这种情况,你也可以预先计算你的距离图,并将它们存储为单个文件。

请注意,距离地图不会移动障碍。