Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Примитивный АI, преследование главного героя (http://www.flasher.ru/forum/showthread.php?t=100121)

_Nickromant_ 20.08.2007 19:18

Примитивный АI, преследование главного героя
 
Есть главный герой, есть монстры (вид сверху), нужно сделать так что бы монстры постепенно шли к главному герою и были к нему всегда лицом. Вообщем вот как я это сделал:
Код на фрейме
Код:

//Вызываем функцию создания монстров.
this.onEnterFrame = function() {
        bot_create();
};
//Функция создает 20 монстров помещая их на карту в случайном месте.
var j = 0;
function bot_create() {
        for (j; j<20; j++) {
                num++;
                name = "bot"+num;
                this.attachMovie("bot", name, num);
                _root[name]._x = 1280*Math.random();
                _root[name]._y = 960*Math.random();
        }
}

Код в клипе монстра, во фрейме Move
Код:

stop();
this.onEnterFrame = function() {
//Смотрим как далеко монстр от героя
        if (Math.sqrt(Math.pow(this._x-_root.hero._x, 2)+Math.pow(this._y-_root.hero._y, 2))<50) {
//При приблежении монстра переходим на фрейм Attack
                this.gotoAndPlay("attack");
        } else {
//Если монстр далеко от героя
                this.gotoAndStop("move");
                bot_speed = 2;
//Разворачиваем монстра лицом к герою
                ang = Math.atan2(this._y-_root.hero._y,this._x-_root.hero._x)*180/Math.PI;
                this._rotation = ang;
//Заставляем его двигаться в нужном направлении
                this.xmov = bot_speed*Math.cos(ang);
                this.ymov = bot_speed*Math.sin(ang);
                this._x += this.xmov;
                this._y += this.ymov;
        }
};

Код в клипе монстра, во фрейме Attack
Код:

stop();
this.onEnterFrame = function() {
//Смотрим как далеко монстр от героя
        if (Math.sqrt(Math.pow(this._x-_root.hero._x, 2)+Math.pow(this._y-_root.hero._y, 2))>50) {
//Если далеко то переходим на движение
                this.gotoAndPlay("move");
        } else {
//Если близко то все время лицом к герою и отнимаем здоровье
                ang = Math.atan2(this._y-_root.hero._y, this._x-_root.hero._x)*180/Math.PI;
                this._rotation = ang;
                hero_health-=1
        }
};

Проблемы вот в чем:
1) Когда герой стоит на месте то монстры нормально двигаются к нему, когда герой начинает двигаться то монстры творят что-то странное, или начинают ходить кругами или дрыгаться в разных направлениях.
2) Если поставить высокую скорость монстрам то при прриближении к герою они дрыгаются, но ооканчательно (до атакующей позиции), приблизиться не могут
3) Если кол-во монстров на экране приблежается к 20 то игра начинает тормазить, при 100 монстрах пришлось жать CTRL+ALT+DEL
Вообщем что я не так сделал и как это исправить.

Mr. Fixit 20.08.2007 19:30

а покажи сам примерчик..

_Nickromant_ 21.08.2007 21:36

Полный исходник весит боллее 10мб, так что я вырезал весь код о котором речи не идет и заменил картинки схематичными кружечками. Вот

udaaff 21.08.2007 21:43

"Вложение не указана(о) или не существует. Если вы уверены, что использовали правильную ссылку, свяжитесь с администрацией"

_Nickromant_ 21.08.2007 22:01

Поправил, но через интерфейс форума выложить не получилось, так что качайте от сюда

Eric Gurt 21.08.2007 22:16

пользуйся

setInterval(anim, 10);

и

function anim()
{
}

это ускорит выполнение + храни весь код в одном кадре не муви клипа.

в блоке №2 у тебя анг в градусах, а sin и cos работают с радианами. Для удобства работай с радианами, а в градусы переводи только для поворота самого мувика.

Mr. Fixit 21.08.2007 23:59

ааа помню у меня тоже дергалось...
вроде, если не подводит память, округляй числа.. ;)

_Nickromant_ 22.08.2007 07:37

Цитата:

Сообщение от Eric Gurt
в блоке №2 у тебя анг в градусах, а sin и cos работают с радианами. Для удобства работай с радианами, а в градусы переводи только для поворота самого мувика.

Сделал так дергаться перестало, но когда монстров на экране за 20 уже тормозит, а мне хотелось бы что-бы кол-во монстров достигало хотя бы 100.
Попробывал
Цитата:

Сообщение от Mr. Fixit
округляй числа..

и
Цитата:

Сообщение от Eric Gurt
пользуйся

setInterval(anim, 10);

и

function anim()
{
}

это ускорит выполнение + храни весь код в одном кадре не муви клипа.

не помогло :(

udaaff 22.08.2007 09:20

Цитата:

но когда монстров на экране за 20 уже тормозит, а мне хотелось бы что-бы кол-во монстров достигало хотя бы 100.
Зачем столько монстров одновременно? :)
PS
Если ты их партиями собираешься выпускать, то тогда никаких проблем с количеством быть не должно.

_Nickromant_ 22.08.2007 09:31

Цитата:

Сообщение от udaaff
Зачем столько монстров одновременно? :)
должно.

Неважно, главный вопрос как это сделать, ведь как-то можно это точно, в том же Crimsonland'е или АленШуторе кол-во монстров на экране к 1000 приблежается и не чего не тормозит


Часовой пояс GMT +4, время: 16:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.