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

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

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

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

Всем привет!
Мы сделали аквариум и в него запустили рыбку, заставили ее плавать. НО она сейчас немного "психованая" потому что я не могу заставить ее правильно делать разворот и, наверное, отступ от стен аквариума.

Помогите, пожалуйста, придумать, как бы заставить нашу рыбку совершать подходящий разворот, что бы она не "залипала" у стенки аквариума.

Превьюшка в аттача.

А вот код:
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class FishScript extends Sprite
	{
		private var speed:Number;
		private var clipRotation:Number;
		private var angle:Number;
		private var xMove:Number;
		private var yMove:Number;
		private var radius:Number;
		private var fish:Sprite;
 
		public function FishScript():void
		{
			trace ("FishScript loaded");
 
			fish = aquarium_mc.fish_mc;
			fish.addEventListener(Event.ENTER_FRAME, moveMyFish);
 
			randomValue();
			fish.rotation = clipRotation;
		}
 
		private function randomValue():void
		{ 
			clipRotation = Math.floor(Math.random() * 360);
			speed = Math.floor(Math.random() * 5 + 1);
			angle = clipRotation * Math.PI / 180;
			xMove = speed * Math.cos(angle);
			yMove = speed * Math.sin(angle);
		}
 
		private function moveMyFish(evt:Event):void
		{
			radius = 190 - evt.target.width/2; // "190" – это радиус аквариума, а "evt.target.width/2" – радиус рыбки
 
			if((evt.target.x * evt.target.x) + (evt.target.y * evt.target.y) > radius * radius)
			{
				randomValue();
				evt.target.rotation = clipRotation;
			}
 
			evt.target.x += xMove;
			evt.target.y += yMove;
		}
	}
}
Вложения
Тип файла: swf aquarium.swf (3.4 Кб, 157 просмотров)


Последний раз редактировалось Dr_Bra; 08.09.2010 в 13:40.
Старый 08.09.2010, 14:40
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 2  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
думаю тут проблема в том, что условие
Код AS3:
if((evt.target.x * evt.target.x) + (evt.target.y * evt.target.y) > radius * radius)
выполняется несколько раз подряд

вобще наверное немного неверный подход использован,

во первых, рыбка не плавает вот так:


но это скорее всего обычная недоработка, суть в алгоритме:

рыбка не плавает от края к краю, значит нам нужно просто узнать следующее положение рыбки и двигать ее туда:

мы имеем круглый аквариум, и знаем текущее положение рыбки, довольно просто вычислить следующее положение - например так: нужно взять случайный угол между 0 и 360 град. и от центра аквариума взять случайное расстояние по этому направлению, но не меньше какого-то значения.. скажем r/4, и не больше r (r-радиус аквариума)



далее я бы просто использовал бы Tweener и двигал рыбку с неким easeInOutSine до этой точки, после достижения ее, выбираем следущую точку, да и еще нужно исключить точки выше зеленой линии, так как там воды нет



p.s. вобще надо посмотреть видео реальных аквариумов, как там плавают рыбки, то есть врятли у них все время одинаковая скорость, + угол подъема наверно не больше 30-40 градусов (в нормальных условиях), + они имеют свойство просто "стоять" на месте, вобщем алгоритм на самом деле не такой простой если нужно добиться хоть какого-то реализма
__________________
low +

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

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

Старый 13.09.2010, 18:31
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 4  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
там в параметрах есть аргумент onComplete:someFunc, someFunc - ф-я, которая вызовется после завершения анимации

http://hosted.zeh.com.br/tweener/docs/en-us/
__________________
low +

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

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
если в матмоделе соударения двух шариков рандомно пробежаться и позаменять знаки + на -, и рандомно к некоторым углам добавить 90 градусов, то получается типичное поведение рыбок. красиво смотрится когда их много -- часть иногда плавает парами, часть друг за другом гоняется, некоторые иногда встречая стенку плывут вдоль нее, а встречая вблизи друг друга они подплывают близко и потом начинают один за другим гоняться.

где именно менять знаки не скажу -- там творческий процесс. %)

Старый 19.09.2010, 18:10
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 6  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
Если нужно по проще, то после условия выхода за пределы аквариума нужно возвращать рыбку обратно в аквариум.

Например так:
Код AS3:
var p:Point = new Point(evt.target.x, evt.target.y);
p.normalize(radius-1);
evt.target.x = p.x;
evt.target.y = p.y;
И желательно вычислять направление не совсем рандомное, а направленное во внутрь аквариума.

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

Теги
аквариум , анимация , разворот , рыбки
Опции темы
Опции просмотра

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

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


 


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


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