![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Я к вам с очередным вопросом, коллеги.
Представьте себе следующую ситуацию: Есть некая круглая область (далее "арена"), внутри которой находится также круг много меньшего радиуса (далее "герой"). Мне удалось заставить героя бегать за курсором мыши в пределах арены (герой это в моем случае класс, а арена - просто мувик на сцене): Герой: package glar.main { import flash.display.MovieClip; public class Hero extends MovieClip { var step:Number = 6; var radius:Number = 80; public function Hero() { // } } } 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. |
|
|||||
|
1) рассчитать точку в которую хочет попасть персонаж
1.а) если курсор в круге - это позици курсора 1.б) если вне круга - это точка на прямой меожду куросром и центром круга 2) персонаж бежит к своей цели если, еще не находится там вот функция для рассчёта цели персонажа, когда курсор вне арены Добавлено через 8 минут // Returns the point on segment [A,B] which is ratio times the total distance // between A and B away from A public static function pointOnLine(a:Point, b:Point, ratio:Number):Point { return new Point(a.x + (b.x - a.x) * ratio, a.y + (b.y - a.y) * ratio); }
__________________
Хороший отдых - половина работы. Последний раз редактировалось artcraft; 22.11.2011 в 20:09. |
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Сейчас попробую.
Алгоритм мне очень нравится - настолько просто, что я удивляюсь, как сам не додумался... Добавлено через 1 час 17 минут Офигенно, все работает еще интеллектуальнее, чем я хотел этого изначально при минимуме циклов и исключающих проверок. Спасибо огромное еще раз. Добавлено через 1 час 20 минут Если не секрет, пункт 1б вы на ходу придумали за 5 минут - или это результат старых наработок? |
|
|||||
|
Цитата:
а вот функция для точки на прямой кочует из проекта в проект
__________________
Хороший отдых - половина работы. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|