Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.08.2011, 00:42
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 1  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Attention Слежение за спрайтом

Не могу придумать альтернативное решение .
В кратце клацаю на поле появляется башня с дулом, если в радиусе 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;
			}
		}

Старый 23.08.2011, 04:38
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 2  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Вы можете попробовать сохранять ваши туррели в массив, когда их создаете.
А в обработчике энтерфрейма наводить каждую туррель на ближайшего врага.
Например, в энтерфрейме пробегаемся по массиву туррелей и для каждой выполняем функцию типа навестиТуррель(туррель);
В которой уже пробегаемся по всем врагам и выбираем ближайшего.
Для этого их тоже стоит хранить в массиве, а не дергать каждый раз из контейнера. Будет быстрее.
Выбрать ближайшего можно, передав в метод sort массива функцию сортировки.
В качестве функции сортировки можно использовать вложенную фунцию сравнения(хотя тут все будут ругаться, наверное, но самое короткое решение. потом найдете более хорошее), в которой зафиксирована туррель.
Мне даже интересно стало. Сейчас попробую привести код, если не засну
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 23.08.2011, 04:41
Romanson вне форума Посмотреть профиль Отправить личное сообщение для Romanson Посетить домашнюю страницу Romanson Найти все сообщения от Romanson
  № 3  
Ответить с цитированием
Romanson
 
Аватар для Romanson

Регистрация: Apr 2008
Адрес: Мозг на высоте 178 см
Сообщений: 167
Отправить сообщение для Romanson с помощью Skype™
перевести всё в localToGlobal
__________________
онлайн игры на раздевание http://startcamgames.com

Старый 23.08.2011, 06:05
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 4  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Ну вот как-то так, например.
Ну и замечания Romanson не забывайте. В моем примере один контейнер и одна система координат.
Но если у вас разные, то можете в функции сравнения, например, приводить их к одной.
Вложения
Тип файла: rar SimpleGame.rar (35.0 Кб, 27 просмотров)
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 23.08.2011, 12:51
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 5  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от ChuwY Посмотреть сообщение
Ну вот как-то так, например.
Ну и замечания Romanson не забывайте. В моем примере один контейнер и одна система координат.
Но если у вас разные, то можете в функции сравнения, например, приводить их к одной.
Спасибо что так взялся за мою проблему , ну для меня не выход башню переместить в другой класс...

Добавлено через 2 минуты
Цитата:
Сообщение от Romanson Посмотреть сообщение
перевести всё в 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; 
    }
Но и она почему-то не работает :\

Старый 23.08.2011, 13:43
Gogan вне форума Посмотреть профиль Отправить личное сообщение для Gogan Найти все сообщения от Gogan
  № 6  
Ответить с цитированием
Gogan

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

Цитата:
Сообщение от ChuwY Посмотреть сообщение
одна система координат.

Старый 23.08.2011, 15:17
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 7  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

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

Вот что я сделал под этот метод , но все равно в другой функции не видит "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);
 
		}


Последний раз редактировалось GrafMine; 23.08.2011 в 15:26.
Старый 23.08.2011, 19:01
Gogan вне форума Посмотреть профиль Отправить личное сообщение для Gogan Найти все сообщения от Gogan
  № 8  
Ответить с цитированием
Gogan

Регистрация: Mar 2009
Сообщений: 65
Цитата:
Сообщение от GrafMine Посмотреть сообщение
Вот что я сделал под этот метод , но все равно в другой функции не видит "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;
   }
  }

Старый 23.08.2011, 20:24
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 9  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от Gogan Посмотреть сообщение
Стоп! Я так понимаю, что вы просто не знаете как в вашем методе eFrameEvents получить ссылку на "turret" ?
Вот как :
Код AS3:
var turrent2:DisplayObject = DisplayObject(e.target);
Огромное тебе спасибо работает ))

Создать новую тему Ответ Часовой пояс GMT +4, время: 04:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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