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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.08.2010, 17:38
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 11  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Почему бы не обрисовать более мелкими фигурами (например квадратами) границу аквариума (вернее границу розовой части, что на верхнем рисунке)?
Пусть это и не самый точный способ, но он гибок и прост. Нарисованые квадраты потом добавить в массив (через тот же getChildAt()) и уже в нем проверять hitTest для каждого элемента, и если хоть один true, то рыбка пересекается с границей. Если ни с одним не пересеклась - значит плавает в "дырке".


Последний раз редактировалось i.o.; 23.08.2010 в 17:42.
Старый 23.08.2010, 17:49
Dr_Bra вне форума Посмотреть профиль Отправить личное сообщение для Dr_Bra Посетить домашнюю страницу Dr_Bra Найти все сообщения от Dr_Bra
  № 12  
Ответить с цитированием
Dr_Bra
 
Аватар для Dr_Bra

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
а перед тем как пользоваться
Код AS3:
Math.sqrt
нужно импортировать что-нибудь в класс?

Добавлено через 4 минуты
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Script extends Sprite
	{
		private var fish;
		private var aqurium;
		private var x1:Number;
		private var y1:Number;
		private var x2:Number;
		private var y2:Number;
		private var d:Number;
 
 
		public function Script():void
		{
			trace("Script loaded")
 
			x1 = 0;
			y1 = 0;
 
			fish = aqurium_mc.fish_mc;
			aqurium = aqurium_mc;
 
			fish.addEventListener(Event.ENTER_FRAME, moveFish);
		}
 
		private function moveFish(evt:Event)
		{
			x2 = fish.x;
			y2 = fish.y;
 
			d = Math.sqrt((x1-x2)^2+(y1-y2)^2);
 
			trace (d);// NaN
		}
	}
}

Старый 23.08.2010, 17:58
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 13  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
^ - это XOR, лол =)))
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 23.08.2010, 18:20
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 14  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Я вот все гадаю, чем не угодил ответ #8, который решает вопрос в полторы строки?
__________________
Поймай яблоко 2!

Старый 23.08.2010, 18:51
Dr_Bra вне форума Посмотреть профиль Отправить личное сообщение для Dr_Bra Посетить домашнюю страницу Dr_Bra Найти все сообщения от Dr_Bra
  № 15  
Ответить с цитированием
Dr_Bra
 
Аватар для Dr_Bra

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
На самом деле я просто не разобрался с ним. Не понял, как бы.


Последний раз редактировалось Dr_Bra; 23.08.2010 в 18:54.
Старый 23.08.2010, 19:03
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 16  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Еще раз:
Код AS3:
function keepItInside( Xfish : Number, Yfish : Number, Rfish : Number, Raquarium : Number ) : void
{
    var R : Number = Raquarium - Rfish;
    if ( Xfish*Xfish + Yfish*Yfish > R*R)
    {
        // разворачиваем рыбку
    }
}
По картинке видно, что d не должно быть больше Raquarium - Rfish. Но так как вычислять d более затратно (надо от произведения Xfish*Xfish + Yfish*Yfish еще взять корень), то мы наоборот — оставляем квадрат d и сравниваем с квадратом же R (который в свою очередь равен нашему Raquarium - Rfish).
Изображения
 
__________________
Поймай яблоко 2!

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

Регистрация: Nov 2007
Сообщений: 1,724
Цитата:
d = Math.sqrt((x1-x2)^2+(y1-y2)^2);
Ну неужели вы не знали, что оператор ^ не возводит в квадрат? Для того, чтобы возвести в степень нужно воспользоваться методом pow все того же класса Math. А чтобы возвести в квадрат нужно просто умножить одно число на само себя.
Цитата:
Почему бы не обрисовать более мелкими фигурами (например квадратами) границу аквариума (вернее границу розовой части, что на верхнем рисунке)?
Потому что способ с математикой будет быстрее и даже гибче, и, я думаю, способ зебестова будет быстрее моего.


Последний раз редактировалось Zik.; 23.08.2010 в 20:38.
Старый 23.08.2010, 20:35
Dr_Bra вне форума Посмотреть профиль Отправить личное сообщение для Dr_Bra Посетить домашнюю страницу Dr_Bra Найти все сообщения от Dr_Bra
  № 18  
Ответить с цитированием
Dr_Bra
 
Аватар для Dr_Bra

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
Супер, спасибо всем за помощь, все получилось! Теперь буду знать как возводить в квадрат в нашем любимом as. А вот оператор ^ есть, он выполняет операцию побитового исключающего или, но мне до этого далеко еще.

Добавлено через 21 час 24 минуты
Рано обрадовался, сделал простой пример, пытаюсь добиться положительного результата, но все кувырком, в прямом смысле слова.

Добавлено через 21 час 24 минуты
вот мой код
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class RandomAnimat extends Sprite
	{
 
		private var obj;
		private var oval;
		private var speed:Number;
		private var clipRotation:Number;
		private var angle:Number;
		private var xMove:Number;
		private var yMove:Number;
		private var r:Number
 
		public function RandomAnimat():void
		{
			trace ("RandomAnimat loaded")
 
			oval = new Oval();
			stage.addChild(oval);
			oval.x = stage.stageWidth/2;
			oval.y = stage.stageHeight/2;
 
			obj = new Obj1();
			stage.addChild(obj);
			obj.x = stage.stageWidth/2;
			obj.y = stage.stageHeight/2;
 
			obj.addEventListener(Event.ENTER_FRAME, moveMyObj);
 
			randomValue();
		}
 
		private function randomValue()
		{ 
			clipRotation = Math.random() * 360;
			angle = clipRotation * Math.PI / 180;
			speed = Math.random() * 5;
			xMove = speed * Math.cos(angle);
			yMove = speed * Math.sin(angle);
 
			obj.rotation = clipRotation;
		}
 
		private function moveMyObj(evt:Event):void
		{
			r = 200 - evt.target.width/2;
			trace (r)
 
			if(evt.target.x * evt.target.x + evt.target.y * evt.target.y > r * r)// что-то не то с этм условием, треугольник просто "колбасит"
			{
				randomValue();
				//evt.target.x += xMove;//здесь рыба должна, по идее, отодвинуться от края аквариума на половину своей длинны
				//evt.target.y += yMove;//что бы не кружиться около бортика..
				//evt.target.rotation = clipRotation;
			}
 
			evt.target.x += xMove;
			evt.target.y += yMove; 
		}
	}
}
Добавлено через 21 час 26 минут
Если нужно, могу положить в айфолдр исходник, но там как бы все просто. В .fla файле, в библиотеке, треугольник – это наш obj и овыл – это наш oval, внутри которо происходит сэйшн.

Добавлено через 38 часов 54 минуты
вот здесь лежат файлы, посмотрите, пожалуйста


Последний раз редактировалось Dr_Bra; 24.08.2010 в 18:06.
Создать новую тему Ответ Часовой пояс GMT +4, время: 07:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
hittestobject , область , проверка

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

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


 


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


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