Форум 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 приблежается и не чего не тормозит

udaaff 22.08.2007 09:46

Crimsonland и АленШутор -- это игры на flash?

Eric Gurt 22.08.2007 10:49

Поставь 30 кадров в секунду у мувика ! :D

Optimist 22.08.2007 22:20

Не знаю поможет тебе это или нет, но я сейчас занимался падающими цветами. Примитивная по сути флешка: дублируем мув и задаем ему движение. Но когда количество цветочков переваливает за 150 весь комп начинает жутко тормозить, загрузка ЦП чуть ли на максимуме а флеш съедает 200 метров оперативки... Так вот по ходу тут все от компа зависит. Я уверен, что если твою флеху на гиге+ оперативки, 3 ГГц и 512 видяхе протестить то ничего дергаться не будет...

И кстати, Eric, fps здесь не при чем...

Если кто нить посоветует что делать было б очень здорово...

udaaff 22.08.2007 22:39

Цитата:

И кстати, Eric, fps здесь не при чем...
Почему это?

aQuestion 23.08.2007 03:11

замени
Код:

                this.xmov = bot_speed*Math.cos(ang);
                this.ymov = bot_speed*Math.sin(ang);
                this._x += this.xmov;
                this._y += this.ymov;

на
Код:

                this.xmov = bot_speed*Math.cos(ang*Math.PI/180);
                this.ymov = bot_speed*Math.sin(ang*Math.PI/180);
                this._x -= this.xmov;
                this._y -= this.ymov;

:bye:

Optimist 23.08.2007 16:11

Цитата:

Сообщение от udaaff
Цитата:

Сообщение от Optimist
И кстати, Eric, fps здесь не прич ем...

Почему это?

Неправильно выразился.... Менял я фпс от минимума до 50, кажется, и везде почти один и тот же результат... Минимум не снимает глюков, образованных, судя по всему, кодом...

_Nickromant_ 23.08.2007 17:32

Цитата:

Сообщение от udaaff
Crimsonland и АленШутор -- это игры на flash?

Вопрос не в этом, вопрос в том можно ли как-нибудь увеличить кол-во монстров до мин до 100 избежав тормозов. :(

Цитата:

Сообщение от Eric Gurt
Поставь 30 кадров в секунду у мувика !

По-моему тоже, тут это не причем, если бы тормозило, хоть при 1, хоть при 50 монстрах, тогда можно было думать на fps, а так нет :o

Цитата:

Сообщение от Optimist
Если кто нить посоветует что делать было б очень здорово...

+1 !!!!!!!!!!!!!!!!!!!!!!!!!!! Очень хочется!!!!!!
Цитата:

Сообщение от Optimist
Так вот по ходу тут все от компа зависит. Я уверен, что если твою флеху на гиге+ оперативки, 3 ГГц и 512 видяхе протестить то ничего дергаться не будет...

У меня 1 гиг оперативы, видео -256мб, проц. АтлонXP 3000+, и все равно виснет. Я почти уверен, что видел флеху, где врагов куча и не чего не тормозит, как найду, выложу.
Цитата:

Сообщение от aQuestion
замени
Код:
this.xmov = bot_speed*Math.cos(ang);
this.ymov = bot_speed*Math.sin(ang);
this._x += this.xmov;
this._y += this.ymov;
на
Код:
this.xmov = bot_speed*Math.cos(ang*Math.PI/180);
this.ymov = bot_speed*Math.sin(ang*Math.PI/180);
this._x -= this.xmov;
this._y -= this.ymov;

Спасибо, я с этим уже разобрался ( на первой странице подсказали), но это исправляет только дергание монстров.
Профи, подумайте, давайте решим проблему!!!

goarcade 23.08.2007 20:33

Посмотрел я твой исходник - не тормозит, даже когда ставишь 100 монстров.
Попробуй мой код. Если не будет тормозить - юзай:)
Код:

//массив для 100 монстров
var monsterList:Array = new Array(100);
function onEnterFrame() {
        // координаты игрока
        var playerX = _xmouse;
        var playerY = _ymouse;
        for (var i:Number = 0; i<monsterList.length; i++) {
                var monster:MovieClip = monsterList[i];
                var dx:Number = playerX-monster._x;
                var dy:Number = playerY-monster._y;
                var angle:Number = Math.atan2(dy, dx);
                monster._rotation = angle*180/Math.PI;
                //свойство: a>b == a*a>b*b
                if (dx*dx+dy*dy>50*50) {
                        monster._x += monster.speed*Math.cos(angle);
                        monster._y += monster.speed*Math.sin(angle);
                }
        }
}
//создаем монстров
for (var i:Number = 0; i<monsterList.length; i++) {
        var monster:MovieClip = createMonster("monster"+i, i);
        monsterList[i] = monster;
        monster._x = Math.random()*Stage.width;
        monster._y = Math.random()*Stage.height;
        var maxSpeed:Number = 2;
        var minSpeed:Number = 0.5;
        monster.speed = minSpeed+Math.random()*(maxSpeed-minSpeed);
}
function createMonster(name:String, depth:Number):MovieClip {
        var mc:MovieClip = _root.createEmptyMovieClip(name, depth);
        mc.lineStyle(1);
        mc.beginFill(Math.random()*0xcccccc,100);
        var r:Number = 10;
        mc.moveTo(-r,-r);
        mc.lineTo(r,0);
        mc.lineTo(-r,r);
        mc.endFill();
        return mc;
}


_Nickromant_ 23.08.2007 21:19

Цитата:

Сообщение от goarcade
Посмотрел я твой исходник - не тормозит, даже когда ставишь 100 монстров.
Попробуй мой код. Если не будет тормозить - юзай:)
Код:

//массив для 100 монстров
var monsterList:Array = new Array(100);
function onEnterFrame() {
        // координаты игрока
        var playerX = _xmouse;
        var playerY = _ymouse;
        for (var i:Number = 0; i<monsterList.length; i++) {
                var monster:MovieClip = monsterList[i];
                var dx:Number = playerX-monster._x;
                var dy:Number = playerY-monster._y;
                var angle:Number = Math.atan2(dy, dx);
                monster._rotation = angle*180/Math.PI;
                //свойство: a>b == a*a>b*b
                if (dx*dx+dy*dy>50*50) {
                        monster._x += monster.speed*Math.cos(angle);
                        monster._y += monster.speed*Math.sin(angle);
                }
        }
}
//создаем монстров
for (var i:Number = 0; i<monsterList.length; i++) {
        var monster:MovieClip = createMonster("monster"+i, i);
        monsterList[i] = monster;
        monster._x = Math.random()*Stage.width;
        monster._y = Math.random()*Stage.height;
        var maxSpeed:Number = 2;
        var minSpeed:Number = 0.5;
        monster.speed = minSpeed+Math.random()*(maxSpeed-minSpeed);
}
function createMonster(name:String, depth:Number):MovieClip {
        var mc:MovieClip = _root.createEmptyMovieClip(name, depth);
        mc.lineStyle(1);
        mc.beginFill(Math.random()*0xcccccc,100);
        var r:Number = 10;
        mc.moveTo(-r,-r);
        mc.lineTo(r,0);
        mc.lineTo(-r,r);
        mc.endFill();
        return mc;
}


Исходник который выложил я и у меня не тормозит, но стоит кружки заменить на боллее сложный и красивый обьект, как все тормозить начинает.
Твой код, хоть аккуратние и красивей моего, но результат то же заменил рисование треугольников подгрузкой клипа монстра из библиотеки и все опять начало тупить (((((, не ужели компилятор flash'a, такой не совершенный !?!?!

goarcade 23.08.2007 22:22

А ты попробуй использовать растровые картинки. Может они будут быстрее отображаться, чем твои сложные и красивые объекты:)

Optimist 23.08.2007 22:29

Да не в скрипте и не в картинках дело, имхо. Есть флешка - падение снега. Скрипт довольно простой, но как только мы делаем 100+ снежинок (нарисованы тоже элементарно) и водим курсором по флехе все жутко тормозит... чем больше объектов тем больше лагов. Пока я думаю, что это бреш флеша. Видимо он не идеален и не может обрабатывать такое количество объектов без тормозов... Но это только предположения. Хотелось бы найти подтверждение или опровержение моего предположения. Если хотите могу выложить скрипт, исходник или свф или все вместе...

_Nickromant_ 23.08.2007 23:16

Цитата:

Сообщение от goarcade
А ты попробуй использовать растровые картинки. Может они будут быстрее отображаться, чем твои сложные и красивые объекты:)

Я не спорю что они быстрее будут отображаться, но смысл то тогда теряется. О ужас полчища треугольничков и кружков хотят убить главного героя!!! :-))

_Nickromant_ 23.08.2007 23:17

Optimist, +1, ждем может какой мего мозг додумается!! 6-)

goarcade 23.08.2007 23:45

Вложений: 1
Цитата:

Сообщение от _Nickromant_
Я не спорю что они быстрее будут отображаться, но смысл то тогда теряется. О ужас полчища треугольничков и кружков хотят убить главного героя!!! :-))

Почему теряется?

А по поводу, что они будут быстрее отображаться, я тут сделал небольшой тест. См. присоединенный архив! Там две флешки и их исходник. Эти флешки абсолютно одинаковые, за исключением того, что в одной из них монстры растровые, а в другой - векторные. Так вот:
В версии с растровыми монстрами у меня fps показывает 30 кадров, а с векторными только 9 (quality->high)! Результат на лицо:)

goarcade 24.08.2007 00:05

Цитата:

Сообщение от Optimist
Да не в скрипте и не в картинках дело, имхо. Есть флешка - падение снега. Скрипт довольно простой, но как только мы делаем 100+ снежинок (нарисованы тоже элементарно) и водим курсором по флехе все жутко тормозит... чем больше объектов тем больше лагов. Пока я думаю, что это бреш флеша. Видимо он не идеален и не может обрабатывать такое количество объектов без тормозов... Но это только предположения. Хотелось бы найти подтверждение или опровержение моего предположения. Если хотите могу выложить скрипт, исходник или свф или все вместе...

Чем больше, объектов - тем больше и тормозов. И это нормально:) Флеш не использует какую либо аппаратную поддержку, в отличии от современных компьютерных игр, даже двухмерных! Все отображение на экран ложится на плечи процессора

_Nickromant_ 24.08.2007 18:00

Цитата:

Сообщение от goarcade
А по поводу, что они будут быстрее отображаться, я тут сделал небольшой тест. См. присоединенный архив! Там две флешки и их исходник. Эти флешки абсолютно одинаковые, за исключением того, что в одной из них монстры растровые, а в другой - векторные. Так вот:
В версии с растровыми монстрами у меня fps показывает 30 кадров, а с векторными только 9 (quality->high)! Результат на лицо:)

Вау!! Заинтриговал!! можешь посоветовать какуюнибудь литературу (или ссылку) по растровой графике и как ее применять во flash. Я просто оказывется не так понимал само понятие растровой графики ( думал что с помощью нее не нарисовать, более менее сложных обьектов). И еще выложи исходник с растовым вариантом, а то у меня сами примеры работаю, а исходник нет. Заранее благодарю!!!

goarcade 24.08.2007 20:27

Вложений: 1
как применять - вставляешь в мувик gif или png картинки (они поддерживают прозрачность) и все!

_Nickromant_ 24.08.2007 20:31

Ясно, спасибо буду пробовать.


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

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