Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Математика ... или как двигаться к центру (http://www.flasher.ru/forum/showthread.php?t=140399)

DenverZ 28.05.2010 06:25

Математика ... или как двигаться к центру
 
Здравствуйте

есть код:

Код AS3:

var dx:Number = enemy.x - hero.X;
var dy:Number = enemy.y - hero.Y;
 
if (dx > 0) enemy.x -= 1;
else enemy.x += 1;
 
if (dy > 0) enemy.y -= 1;
else enemy.y += 1;

сначала на сцене располагается клип hero по центру
и клипы врагов enemy по бокам

задача врагов, двигаться к герою в центр

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

как бы подкорректировать, что бы враги двигались именно к центру где бы они не находились, т.к. другими словами компенсировали свои координаты по X или по Y в зависимости как далеко находятся от центра по диагонали... что бы все ровно шло и красиво

вот как-то так, сорри если не точно объяснил, утро уже :-)

заранее спасибо

Добавлено через 8 минут
все нашел на одном сайте :-)
вот кому может пригодится

Код AS3:

var dx:Number = enemy.x - hero.X;
var dy:Number = enemy.y - hero.Y;       
 
var angle = Math.atan2(dy, dx);
var dist = Math.sqrt(dx * dx + dy * dy);
 
if (dist > enemy.enemySpeed)
{
    var tgtX:Number = enemy.x - enemy.enemySpeed * Math.cos(angle);
    var tgtY:Number = enemy.y - enemy.enemySpeed * Math.sin(angle);
 
    enemy.x = tgtX;
    enemy.y = tgtY;
}

если есть другие способы, буду рад увидеть их здесь =)

alexcon314 28.05.2010 08:36

DenverZ, то слово (и иже с ним), что я затер после слова математика в заголовке вашей темы, здесь употреблять запрещено.

КорДум 28.05.2010 08:45

Код AS1/AS2:

function Clip1MoveToClip2(){
        var dx = clip2._x - this._x;
        var dy = clip2._y - this._y;
        var angle = Math.atan2 (dy, dx);
        this.xmov = Math.cos(angle);
        this.ymov = Math.sin(angle);
        if (Math.sqrt(dx*dx + dy*dy) > 15){
                this._x += this.xmov;
                this._y += this.ymov;
        }
}

Старый добрый пример на ас1/ас2, переделать сможете? Смысл, как делать, должен быть понятен.

-De- 28.05.2010 09:04

тригонометрия тормозная и не нужна
Код AS3:

var dx:Number = enemy.x - hero.X;
var dy:Number = enemy.y - hero.Y;       
 
var dist = Math.sqrt(dx * dx + dy * dy);
var cos:Number = dx/dist;
var sin:Number = dy/dist;
 
if (dist > enemy.enemySpeed)
{
    enemy.x -= enemy.enemySpeed * cos;
    enemy.y -= enemy.enemySpeed * sin;
}


DenverZ 28.05.2010 14:59

2alexcon314 оки понял, извиняюсь :rolleyes:

Добавлено через 41 секунду
2КорДум и -De- спасибо буду пробывать :-)


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

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