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

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

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

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Tools Просьба о помощи с алгоритмом для игры (поведение героя в замкнутой области)

Я к вам с очередным вопросом, коллеги.
Представьте себе следующую ситуацию:
Есть некая круглая область (далее "арена"), внутри которой находится также круг много меньшего радиуса (далее "герой"). Мне удалось заставить героя бегать за курсором мыши в пределах арены (герой это в моем случае класс, а арена - просто мувик на сцене):
Герой:
Код AS3:
package glar.main
{
	import flash.display.MovieClip;
 
	public class Hero extends MovieClip
	{
		var step:Number = 6;
		var radius:Number = 80;
		public function Hero()
		{
			//
		}
	}
}
Основной класс:
Код AS3:
package glar.main
{
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.geom.Point;
 
	public class Main extends MovieClip
	{
		var hero:Hero = new Hero();
		public function Main()
		{
			super();
			addChild(hero);
			hero.x = stage.width/2;
			hero.y = stage.height/2;
			hero.addEventListener(Event.ENTER_FRAME, heroGo);
		}
		private function heroGo(event:Event):void {
			var dx:Number = mouseX - hero.x;
			var dy:Number = mouseY - hero.y;
			var angle:Number = Math.atan2(dy, dx);
			var dist:Number = Math.sqrt(dx*dx + dy*dy);
			if(dist > hero.step) {
				var tgtX:Number = hero.step * Math.cos(angle);
				var tgtY:Number = hero.step * Math.sin(angle);
				hero.rotation = angle*180/Math.PI;
				var heroPnt:Point = new Point(hero.x, hero.y);
				var arenaPnt:Point = new Point(arena.x, arena.y);
				if (Point.distance(arenaPnt, heroPnt) + hero.radius/2 < arena.height/2) {
					hero.x += tgtX;
					hero.y += tgtY;
				}
			}
		}
	}
}
И вот основные вопросы начинаются дальше, когда я хочу, чтобы была возможность вывести мышь за пределы арены, но герой за ее пределы не выбегал. В скрипте выше эта проблема решена, НО при возвращении мыши назад в зону арены - герой по прежнему стоит у стенки. Я понимаю, что по моему алгоритму герой и не должен "отлипать" от стены, но вот хочу спросить вашего совета - как лучше сделать это "отлипание" и по-новому заставить героя бежать за мышью.
И еще важный нюанс (к которому даже страшно приступиться) - хочется, чтобы при следующих условиях (мышь за пределами арены, герой коснулся стенки арены) герой не просто стоял у стенки, а двигался до тех пор по контуру арены, пока не достигнет своим центром линии, соединяющей 2 точки (центр арены и текущее положение курсора).


Последний раз редактировалось australian incognito; 22.11.2011 в 19:53.
Создать новую тему   Часовой пояс GMT +4, время: 02:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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