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

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

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

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Как можно исключить добавление объекта на другой объект?

Здравствуйте.

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

Класс "Creation":
Код AS3:
package classes
{
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import classes.fond.Fields;
	import flash.display.Sprite;
 
	public class Creation
	{
		private var timerCreation:Timer = new Timer(Settings.CREATION);
		private var tempCreatedCrovel:int = 0;
 
		public function Creation()
		{
			timerCreation.addEventListener(TimerEvent.TIMER,creationCrovels);
			timerCreation.start();
		}
		private function creationCrovels(event:TimerEvent):void
		{
			trace("Создан Кровел");
			tempCreatedCrovel += 1;
			var crovel:Sprite = new Crovel(new Liquid());
 
			var randomX:Number = Math.random() * Settings.SWEEP;
			var randomY:Number = 50 + Math.random() * 500;
 
			var randomCoordinates:Array = setRandomCoordinates(crovel);
			randomX = randomCoordinates[0];
			randomY = randomCoordinates[1];
 
			crovel.x = randomX;
			crovel.y = randomY;
 
			Settings.crovels.push(crovel);
 
			if(tempCreatedCrovel == Settings.NUMBERCROVEL)
			{
				timerCreation.removeEventListener(TimerEvent.TIMER,creationCrovels);
				timerCreation.reset();
			}
		}
		const LIMIT:int = 500;
		private function setRandomCoordinates(ONECROVEL:Object,l:int = 1):Array
		{
			if(l >= LIMIT)
			{
				return [0,0];
			}
			var randomX:Number = Math.random() * Settings.SWEEP;
			var randomY:Number = 50 + Math.random() * 500;
 
			var areNewRandomCoordinates:Boolean = false;
			const DATAONECROVEL:Object = new Object();
			DATAONECROVEL.clip = ONECROVEL;
			DATAONECROVEL.x = randomX;
			DATAONECROVEL.y = randomY;
			DATAONECROVEL.radius = (DATAONECROVEL.clip.width / 2) - Settings.REDUCTION;
 
			for(var i:int = 0; i < Settings.crovels.length; i++)
			{
				const TWOCROVEL:Object = Settings.crovels[i];
				const DATATWOCROVEL:Object = new Object();
				DATATWOCROVEL.clip = TWOCROVEL;
				DATATWOCROVEL.x = TWOCROVEL.x;
				DATATWOCROVEL.y = TWOCROVEL.y;
				DATATWOCROVEL.radius = (DATATWOCROVEL.clip.width / 2) - Settings.REDUCTION;
 
				var are:Boolean = Collision.detectionCollision(DATAONECROVEL,DATATWOCROVEL);
				if(are)
				{
					randomX = Math.random() * Settings.SWEEP;
					randomY = 50 + Math.random() * 500;
					DATAONECROVEL.x = randomX;
					DATAONECROVEL.y = randomY;
				}
				else
				{
					areNewRandomCoordinates = true;
					break;
				}
			}
			if(!areNewRandomCoordinates)
			{
				return setRandomCoordinates(ONECROVEL,l+1);
			}
			return [randomX,randomY];
		}
	}
}
Статическая функция "detectionCollision":

Код AS3:
		public static function detectionCollision(crovelOne:Object,crovelTwo:Object):Boolean
		{
			var xDiff:Number = crovelOne.x - crovelTwo.x;
			var yDiff:Number = crovelOne.y - crovelTwo.y;
			var distance = Math.sqrt(xDiff*xDiff+yDiff*yDiff);
			if(distance <= crovelOne.radius + crovelTwo.radius)
			{
				return true;
			}
			return false;
		}
Но погрешность иногда всё равно есть:
crovels.swf   (120.0 Кб)
Вложения
Тип файла: swf crovels.swf (120.0 Кб, 50 просмотров)

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

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

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


 


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


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