如何在动作中实现视线限制?

时间:2011-06-22 09:05:22

标签: flash actionscript-3

我正在编程的游戏有问题。我正在制作某种安全游戏,我希望有一些视觉视线。问题是我不能限制我的视线,所以我的警察无法透过墙壁看到。下面是设计,它们可以通过窗户看到,但不能看到墙壁。在下面你会看到我的问题的确切说明。

design

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

enter image description here

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

visual map

所以我现在编程视线的方式只是计算一些点并相应地绘制视线,如下所示。请注意,我还使用bitmapdata检查了一个hittest,以检查我的播放器是否被任何警察发现。

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的this教程,但我不能用代码来限制视线。

3 个答案:

答案 0 :(得分:2)

在非常高的水平上,当你有一个检测时,尝试从执行检测的警察射击射线和玩家。如果您可以在不影响任何级别的情况下拍摄光线,则可以进行有效检测。您可以通过多种方式实现此目的,但这是标准方法。

答案 1 :(得分:1)

首先,不管你对可视锥体的处理方式如何,我建议使用Feronato的视线代码,以便无论锥体是如何绘制的,都可以正确地看到播放器的可见性。*实际上切割锥体的位置它击中墙壁将涉及大量复杂的数学运算,并且可能对处理器而言实时性太强。

此时你可能只想说“好吧,它有效”,因为让锥形视觉效果在墙上切断将是很多工作,可能没有必要。你应该玩游戏,看看玩家是否感到困惑。

也就是说,在墙壁上切割锥体的最简单方法是将每个房间的地板作为一个单独的图形对象,您可以在显示器堆栈中的锥体上方抬起。检查护罩是否可以看到房间以确定是否需要抬高地板以覆盖锥体,或降低它以显示锥体。

你可以自动创建这些楼层对象(即,在加载关卡时神奇地设置所有东西)但是对于第一遍,我可能只是在绘制关卡时手动将它们放入。

*顺便提一下,正如alxx所建议的那样,您可能只想在首次进行粗略距离检查后进行准确检查。进行过多的准确检查可能会花费很多。

答案 2 :(得分:0)

我找到了一种方法。答案是在gamedev.stackexchange-fourm上给出的:)

https://gamedev.stackexchange.com/questions/14001/how-to-implement-line-of-sight-restriction-in-actionscript