Как реализовать ограничение прямой видимости в ActionScript? - PullRequest
4 голосов
/ 22 июня 2011

У меня проблема с игрой, которую я программирую.Я делаю какую-то игру по безопасности, и я хотел бы иметь некоторую визуальную линию обзора.Проблема в том, что я не могу ограничить линию обзора, чтобы мои копы не могли видеть сквозь стены.Ниже вы найдете дизайн, в котором они могут смотреть через окна, но не через стены.Ниже вы найдете иллюстрацию того, в чем конкретно состоит моя проблема.

design

Вот как это выглядит сейчас.Как видите, копы видят сквозь стены.

enter image description here

Это карта, которую я хотел бы использовать для ограничения линии обзора.

visual map

Итак, теперь я программирую линию визирования, просто вычисляя некоторые точки и рисуя прицел соответственно, как показано ниже.Обратите внимание, что я также проверяю на предмет попадания, используя битовые данные, чтобы проверить, был ли мой игрок замечен каким-либо из полицейских.

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, но я не могу использовать код, чтобы ограничить визуальную линию обзора.

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

На очень высоком уровне, когда у вас есть обнаружение, попробуйте выстрелить лучом из полицейского, который сделал обнаружение, и игрока.Если вы можете стрелять лучом, не влияя ни на один из уровней, у вас есть действительное обнаружение.Вы можете реализовать это различными способами, но это стандартный подход.

1 голос
/ 22 июня 2011

Ну, во-первых, независимо от того, что вы делаете с конусами видимости, я бы посоветовал использовать код прямой видимости Феронато, чтобы видимость для игрока работала правильно, независимо от того, как нарисованы конусы. он столкнется с большими сложными математическими вычислениями и, вероятно, будет слишком загружен процессором в реальном времени.

В этот момент вы, возможно, захотите просто сказать: «Ну, как бы, это работает», потому что обрезание конусов на стенах будет большой работой и, возможно, не обязательным. Вы должны играть в игры, чтобы увидеть, если игроки запутались.

Тем не менее, самый простой способ обрезать конусы у стен состоит в том, чтобы пол каждой комнаты представлял собой отдельный графический объект, который можно поднять над конусом в стеке дисплея. Проверьте, видит ли охранник комнату, чтобы определить, нужно ли вам поднять пол, чтобы покрыть конус, или опустить его, чтобы отобразить конус.

Вероятно, вы могли бы автоматизировать создание этих объектов этажа (т. Е. Все настраивается магически при загрузке уровня), но для первого прохода я, вероятно, просто вставлю их вручную при рисовании уровня.

* Между прочим, как предположил alxx, вы, вероятно, захотите выполнить точную проверку только после первой грубой проверки расстояния. Выполнение точной проверки может потребовать больших затрат.

0 голосов
/ 23 июня 2011

Я нашел способ сделать это. Ответ был дан на gamedev.stackexchange-fourm:)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...