|
|
|||||
Регистрация: Jan 2011
Сообщений: 247
|
Слежение за спрайтом
Не могу придумать альтернативное решение .
В кратце клацаю на поле появляется башня с дулом, если в радиусе 100 есть враг, башня должна дулом смотреть на цель . 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; } } |
|
|||||
Вы можете попробовать сохранять ваши туррели в массив, когда их создаете.
А в обработчике энтерфрейма наводить каждую туррель на ближайшего врага. Например, в энтерфрейме пробегаемся по массиву туррелей и для каждой выполняем функцию типа навестиТуррель(туррель); В которой уже пробегаемся по всем врагам и выбираем ближайшего. Для этого их тоже стоит хранить в массиве, а не дергать каждый раз из контейнера. Будет быстрее. Выбрать ближайшего можно, передав в метод sort массива функцию сортировки. В качестве функции сортировки можно использовать вложенную фунцию сравнения(хотя тут все будут ругаться, наверное, но самое короткое решение. потом найдете более хорошее), в которой зафиксирована туррель. Мне даже интересно стало. Сейчас попробую привести код, если не засну
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
перевести всё в localToGlobal
__________________
онлайн игры на раздевание http://startcamgames.com |
|
|||||
Ну вот как-то так, например.
Ну и замечания Romanson не забывайте. В моем примере один контейнер и одна система координат. Но если у вас разные, то можете в функции сравнения, например, приводить их к одной.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
Регистрация: Jan 2011
Сообщений: 247
|
Цитата:
Добавлено через 2 минуты В моем случае со спрайтом в котором находится моя башня не помогает, нашел в инете функцию которая переделывает : 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; } |
|
|||||
Регистрация: Mar 2009
Сообщений: 65
|
По моему все просто и ответ вам был дан четкий от двух человек.
Не знаю почему у вас не работает метод, который вы нашли. Но могу лишь предположить, что вы его применили только к одному объекту - турели к примеру. А нужно ко всем объектам вашего игрового мира. Ключевая фраза здесь : |
|
|||||
Регистрация: Jan 2011
Сообщений: 247
|
Цитата:
Вот что я сделал под этот метод , но все равно в другой функции не видит "turret" : 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); } Последний раз редактировалось GrafMine; 23.08.2011 в 15:26. |
|
|||||
Регистрация: Mar 2009
Сообщений: 65
|
Цитата:
Вот как : Весь код: 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; } } |
|
|||||
Регистрация: Jan 2011
Сообщений: 247
|
Огромное тебе спасибо работает ))
|
Часовой пояс GMT +4, время: 04:05. |
|
« Предыдущая тема | Следующая тема » |
|
|