![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2011
Сообщений: 21
|
Здравствуйте.
Появилось у меня задание сделать простенькую игру с использованием 3д движка на во флеше. В качестве движка был выбран Away3D. Игра это копия игры Osmos на мобильных платформах, то есть есть некие объекты которые свободно двигаются и большие объекты поглощают меньшие и вырастают в размерах. Еще есть собственно игрок который играет одним из таких вот объектов. Для передвижения игрока нужно в любом месте экрана кликнуть мышей и объект игрока должен переместиться на определенное расстояние по вектору проходящему от точки клика мышей до точки цента объекта. Собственно проблема в том, что я никак не могу понять как же мне правильно взять точку клика мышей ![]() |
|
|||||
|
Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
|
http://away3d.com/forum/viewthread/4079/
Получение точки в 2д координатах. Получение точки на общей сцене, а точка находиться в контейнер/контейнер/ до 5 штук /** * Приводит точку до низа * @param object3d контейнер в котором есть точка3д ObjectContainer3D //Mesh * @param veCmaxX сама точка * @param sah сколько контейнеров назад до 5 */ static public function poiskNewPoint3D(object3d:ObjectContainer3D, veCmaxX:Vector3D, sah:int=5):Vector3D { var vertor:Vector3D = new Vector3D(veCmaxX.x,veCmaxX.y,veCmaxX.z); var sss:int = 0; if(object3d.parent!=null){ vertor = object3d.transform.deltaTransformVector(vertor); vertor.x += object3d.x; vertor.y += object3d.y; vertor.z += object3d.z; sss++; if (object3d.parent.parent != null&&sss<=sah) { vertor = object3d.parent.transform.deltaTransformVector(vertor); vertor.x += object3d.parent.x; vertor.y += object3d.parent.y; vertor.z += object3d.parent.z; sss++; if (object3d.parent.parent.parent != null&&sss<=sah) { vertor = object3d.parent.parent.transform.deltaTransformVector(vertor); vertor.x += object3d.parent.parent.x; vertor.y += object3d.parent.parent.y; vertor.z += object3d.parent.parent.z; sss++; if (object3d.parent.parent.parent.parent != null&&sss<=sah) { vertor = object3d.parent.parent.parent.transform.deltaTransformVector(vertor); vertor.x += object3d.parent.parent.parent.x; vertor.y += object3d.parent.parent.parent.y; vertor.z += object3d.parent.parent.parent.z; sss++; if (object3d.parent.parent.parent.parent.parent != null&&sss<=sah) { vertor = object3d.parent.parent.parent.parent.transform.deltaTransformVector(vertor); vertor.x += object3d.parent.parent.parent.parent.x; vertor.y += object3d.parent.parent.parent.parent.y; vertor.z += object3d.parent.parent.parent.parent.z; sss++; if (object3d.parent.parent.parent.parent.parent.parent != null&&sss<=sah) { vertor = object3d.parent.parent.parent.parent.parent.transform.deltaTransformVector(vertor); vertor.x += object3d.parent.parent.parent.parent.parent.x; vertor.y += object3d.parent.parent.parent.parent.parent.y; vertor.z += object3d.parent.parent.parent.parent.parent.z; } } } } } } return vertor; } |
|
|||||
|
Регистрация: Jul 2008
Сообщений: 912
|
|
|
|||||
|
Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
|
Почему, код рабочий, выдают то что мне нужно, то что не красиво, ну я как ни бить переживу ))
А как бы Вы поступили в данном коде???????. |
|
|||||
|
Регистрация: Jul 2008
Сообщений: 912
|
Ты переживёшь, а компьютеры укакиваться будут переваривать это за доли секунды. С таким подходом тормозов в программе не избежать.
Много вложенных if - плохо, обращение к методу или переменной класса глубже, чем на один этаж очень плохо - не правильная архитектура, то-есть myClass.myFunc.myFunc; уже считается плохо, а такой поезд .parent.parent.parent.parent.parent.parent это совсем не годится. Но ещё хуже, что обращения идут от ребёнка к родителю, это запрещено в ООП. |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
А если задача изменится, и контейнеров станет не 5 а 20 ?
Дело не в некрасивости и том что ООП что-то там запрещает, а в том что решение недостаточно гибкое. Последний раз редактировалось AlexLucas; 26.03.2013 в 21:09. |
|
|||||
|
Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
|
//GBee Что такое рекурсия?
//AlexLucas в рамках моей задачи у меня не может быть больше пяти, по этому это не моя проблема))) можно конечно замкнуть функции на себе, типа static public function poiskNewPoint3D(object3d:ObjectContainer3D, veCmaxX:Vector3D, sah:int=5):Vector3D { var vertor:Vector3D = new Vector3D(veCmaxX.x,veCmaxX.y,veCmaxX.z); var sss:int = 0; if(object3d.parent!=null){ vertor = object3d.transform.deltaTransformVector(vertor); vertor.x += object3d.x; vertor.y += object3d.y; vertor.z += object3d.z; sss++; if (object3d.parent.parent != null && sss <= sah) { poiskNewPoint3D(object3d.parent, vertor); }else { return vertor; } } return vertor; } } //Sintesis Еще раз повторю свой вопрос, как бы Вы реализовали, задачу: Есть в 3д сена.обьект.обьект...точка3д ко всем объектам возможно применины трансформации, как получить сена.точка3д. ///////////////////////////////// а такой поезд .parent.parent.parent.parent.parent.parent это совсем не годится. Но ещё хуже, что обращения идут от ребёнка к родителю, ////////////////////////////////// Если вы сможете реализовать это без parent меньшим количеством if С меня пиво, когда буду в Запорожье))))) ///это запрещено в ООП. ////Пофиг, оно работает)))) |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
Где-то прочитал, что приложение cтоит разрабатывать учитывая то что те люди которые его будут после вас поддерживать, являются психами которые в приступе гнева способны убить, и которые знают где вы живёте.
В таком случае, я думаю у вас шанс выжыть был бы минимален ![]() |
|
|||||
|
Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
|
))))))))))))))))))))))))))))))))) Да я прекрасно понимаю чувства того, кто ни будет знать что их можно делать только меньше 5, я бы и сам захотел бы узнать свой адрес))))))))))))))))))))))
|
![]() |
![]() |
Часовой пояс GMT +4, время: 17:29. |
|
|
« Предыдущая тема | Следующая тема » |
|
|