Форум 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=165433)

GrafMine 23.08.2011 00:42

Слежение за спрайтом
 
Не могу придумать альтернативное решение .
В кратце клацаю на поле появляется башня с дулом, если в радиусе 100 есть враг, башня должна дулом смотреть на цель .

Код AS3:

                private function thisClick(e:MouseEvent):void {// кликаю по полю
                        var xv:int = (e.target as Sprite).x;
                        var yv:int = (e.target as Sprite).y;
                        makeTurret(xv, yv);
                        (e.target as Sprite).removeEventListener(MouseEvent.CLICK, thisClick);
                }
 
                private function makeTurret(xValue:int,yValue:int):void{// ставится башня
                        var turret = new Sprite();
                        turret.graphics.beginFill(0x999999);
                        turret.graphics.drawCircle(0,0,12.5);
                        turret.graphics.endFill();
                        turret.graphics.beginFill(0xFFFFFF);
                        turret.graphics.drawRect(-2.5, 0, 5, 20);
                        turret.graphics.endFill();
                        turret.x = xValue + 12.5;
                        turret.y = yValue + 12.5;
                        addChild(turret);
                        turret.addEventListener(Event.ENTER_FRAME, eFrameEvents);
 
                }
 
                private function eFrameEvents(e:Event):void{
                        var distance:Number = range;
                        enTarget = null;
                        for(var i:int=enemyHolder.numChildren-1;i>=0;i--){
                                var cEnemy =enemyHolder.getChildAt(i);
                                if (Math.sqrt(Math.pow(cEnemy.y - y, 2) + Math.pow(cEnemy.x - x, 2)) < 100) {// <--- вот в этой строчке нужна помощь
                                            // тут место "y" и "x"  должно быть что-то вроде такого: "turret.х" и "turret.y" , но естественно так не получится
                                            // нужно альтернативное решение :\
                                        trace(turrent2.y,turrent2.x);
                                        enTarget = cEnemy;
                                }
                        }
                        if(enTarget != null){
                                (e.target as Sprite).rotation = Math.atan2((enTarget.y-y), enTarget.x-x)/Math.PI*180 - 90;
                        }
                }


ChuwY 23.08.2011 04:38

Вы можете попробовать сохранять ваши туррели в массив, когда их создаете.
А в обработчике энтерфрейма наводить каждую туррель на ближайшего врага.
Например, в энтерфрейме пробегаемся по массиву туррелей и для каждой выполняем функцию типа навестиТуррель(туррель);
В которой уже пробегаемся по всем врагам и выбираем ближайшего.
Для этого их тоже стоит хранить в массиве, а не дергать каждый раз из контейнера. Будет быстрее.
Выбрать ближайшего можно, передав в метод sort массива функцию сортировки.
В качестве функции сортировки можно использовать вложенную фунцию сравнения(хотя тут все будут ругаться, наверное, но самое короткое решение. потом найдете более хорошее), в которой зафиксирована туррель.
Мне даже интересно стало. Сейчас попробую привести код, если не засну :)

Romanson 23.08.2011 04:41

перевести всё в localToGlobal

ChuwY 23.08.2011 06:05

Вложений: 1
Ну вот как-то так, например.
Ну и замечания Romanson не забывайте. В моем примере один контейнер и одна система координат.
Но если у вас разные, то можете в функции сравнения, например, приводить их к одной.

GrafMine 23.08.2011 12:51

Цитата:

Сообщение от ChuwY (Сообщение 1024671)
Ну вот как-то так, например.
Ну и замечания Romanson не забывайте. В моем примере один контейнер и одна система координат.
Но если у вас разные, то можете в функции сравнения, например, приводить их к одной.

Спасибо что так взялся за мою проблему :), ну для меня не выход башню переместить в другой класс...

Добавлено через 2 минуты
Цитата:

Сообщение от Romanson (Сообщение 1024668)
перевести всё в localToGlobal

В моем случае со спрайтом в котором находится моя башня не помогает, нашел в инете функцию которая переделывает :
Код AS3:

private function getGlobalXY(sprite:DisplayObject):Point 
    { 
        var local:Point = new Point(sprite.x, sprite.y)
        trace("local is " + local.x + ", " + local.y)
        if(!sprite.stage) 
        {   
            trace("sprite is not on display list: gonna throw error");   
            throw(new Error("Cannot get global position of an object which is not on stage"))
        } 
        var global:Point = sprite.parent.localToGlobal(local)
        trace("global is " + global.x + ", " + global.y)
        return global;
    }

Но и она почему-то не работает :\

Gogan 23.08.2011 13:43

По моему все просто и ответ вам был дан четкий от двух человек.
Не знаю почему у вас не работает метод, который вы нашли. Но могу лишь предположить, что вы его применили только к одному объекту - турели к примеру. А нужно ко всем объектам вашего игрового мира.
Ключевая фраза здесь :

Цитата:

Сообщение от ChuwY (Сообщение 1024671)
одна система координат.


GrafMine 23.08.2011 15:17

Цитата:

Сообщение от Gogan (Сообщение 1024745)
По моему все просто и ответ вам был дан четкий от двух человек.
Не знаю почему у вас не работает метод, который вы нашли. Но могу лишь предположить, что вы его применили только к одному объекту - турели к примеру. А нужно ко всем объектам вашего игрового мира.
Ключевая фраза здесь :

Да только к турели, т.к. мне нужна только передача координат турели.

Вот что я сделал под этот метод , но все равно в другой функции не видит "turret" :
Код AS3:

private function makeTurret(xValue:int,yValue:int):void{
                        var turret = new Shape();
                        var turret2 = new Sprite();
                        addChild(turret2);
                        turret2.x = xValue + 12.5;
                        turret2.y = yValue + 12.5;
                        turret.graphics.beginFill(0x999999);
                        turret.graphics.drawCircle(0,0,12.5);
                        turret.graphics.endFill();
                        turret.graphics.beginFill(0xFFFFFF);
                        turret.graphics.drawRect(-2.5, 0, 5, 20);
                        turret.graphics.endFill();
                        turret2.addChild(turret);
                        getGlobalXY(turret);
                        getGlobalXY(turret2);
                        turret.addEventListener(Event.ENTER_FRAME, eFrameEvents);
 
                }


Gogan 23.08.2011 19:01

Цитата:

Сообщение от GrafMine (Сообщение 1024779)
Вот что я сделал под этот метод , но все равно в другой функции не видит "turret" :

Стоп! Я так понимаю, что вы просто не знаете как в вашем методе eFrameEvents получить ссылку на "turret" ?
Вот как :
Код AS3:

var turrent2:DisplayObject = DisplayObject(e.target);

Весь код:

Код AS3:

private function eFrameEvents(e:Event):void{
 
  var turrent2:DisplayObject = DisplayObject(e.target);//there is the reference on the turrent object!!!!!!!!!!!!!
 
  var distance:Number = range;
  enTarget = null;
  for(var i:int=enemyHolder.numChildren-1;i>=0;i--){
    var cEnemy =enemyHolder.getChildAt(i);
    if (Math.sqrt(Math.pow(cEnemy.y - y, 2) + Math.pow(cEnemy.x - x, 2)) < 100) {
    trace(turrent2.y,turrent2.x);
    enTarget = cEnemy;
    }
  }
  if(enTarget != null){
    (e.target as Sprite).rotation = Math.atan2((enTarget.y-y), enTarget.x-x)/Math.PI*180 - 90;
  }
  }


GrafMine 23.08.2011 20:24

Цитата:

Сообщение от Gogan (Сообщение 1024876)
Стоп! Я так понимаю, что вы просто не знаете как в вашем методе eFrameEvents получить ссылку на "turret" ?
Вот как :
Код AS3:

var turrent2:DisplayObject = DisplayObject(e.target);


Огромное тебе спасибо работает ))


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

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