Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diplonote_v1.3 RC 6.doc
Скачиваний:
3
Добавлен:
27.10.2018
Размер:
12.94 Mб
Скачать

5.2.4 Обработка команд пользователя

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

В зависимости от того, выведен ли на экран блок с информацией может быть отключен или включен контроллер камеры. После чего вызывается метод проверки позиции наблюдателя для выгрузки и загрузки объектов аудиторий, где находится пользователь. Код представлен в листинге 5.21.

Листинг 5.21 – Проверка на загрузку/выгрузку объектов

if(logoVisible)   controller.disable(). else   controller.enable().

checkMyPosition().

После чего происходит обсчет позиции наблюдателя относительно соседних объектов для вычисления столкновений пользователя с объектами. Для этого на месте контроллера камеры создается невидимая сфера, столкновение которой с окружающими объектами и будет определять поведение контроллера камеры.

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

Листинг 5.22 – Определение столкновений

var beginCameraVec:Vector3D = new Vector3D(camera.x, camera.y, camera.z).   controller.update().   var endCameraVec:Vector3D = new Vector3D(camera.x, camera.y, camera.z).       // вектор перемещения  var displacement:Vector3D = new Vector3D().  displacement.x = endCameraVec.x – beginCameraVec.x.  displacement.y = endCameraVec.y – beginCameraVec.y.        // Проверка препятствий  var collisionPoint:Vector3D = new Vector3D().  var collisionPlane:Vector3D = new Vector3D().    var onCollision:Boolean = collider.getCollision(beginCameraVec, displacement, collisionPoint, collisionPlane, rootContainer).  if (!onCollision){    camera.x = endCameraVec.x. 

  camera.y = endCameraVec.y.    }  else {    var endVector:Vector3D = collider.calculateDestination(beginCameraVec, displacement, rootContainer).    camera.x = endVector.x.    camera.y = endVector.y.  } 

После вычисления новой позиции с учетом столкновения, контроллер перемещается в эту точку и следующий кадр будет отрисован с этой точки.

При нажатии кнопок, запускаются их функции-обработчики.

Для выведения текста отрисовывается его интерфейсный контейнер, а текст динамически загружается из текстового файла. Код представлен в

листинге 5.23.

Листинг 5.23 – Вывод текста

private function showAudInfo(e:MouseEvent):void{          audInfo.visible = true.   audInfoBack.visible = true.   closeInfoButton.visible = true.   scrollBar.visible = true.   if(aud802loaded){     AudInfoFromFile("802").   } } private function AudInfoFromFile(url:String):void{

 var request:URLRequest = new URLRequest(url + ".txt").      loader = new URLLoader().      try {     loader.load(request).   }   catch (error:SecurityError)   {     audInfo.text = "A SecurityError has occurred.".   }   loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler).   loader.addEventListener(Event.COMPLETE, loaderCompleteHandler). } function loaderCompleteHandler(event:Event):void {   audInfo.htmlText = loader.data.    logoVisible = true.   scrollBar.scrollTarget = audInfo.  }

Для выведения видео создается объект специально написанного класса, который воспроизводит нужное поточное видео и покадрово возвращает bmp-картинку, которая используется как текстура и накладывается на виртуальный экран в 3D-мире. Код представлен в листинге 5.24.

Листинг 5.24 – Создание текстуры из видео

public function VideoMaterial (flvUrl:String) {   url = flvUrl.   super (null). connection = new NetConnection. connection.addEventListener (NetStatusEvent.NET_STATUS, onConnected).

     connection.connect (null). } protected function onConnected (e:NetStatusEvent):void {   stream = new NetStream (connection).   stream.checkPolicyFile = true.   stream.addEventListener (AsyncErrorEvent.ASYNC_ERROR, onError).   stream.addEventListener (NetStatusEvent.NET_STATUS, loopVideo).   stream.client = {     onMetaData: function (info:Object):void {}   }   video = new Video.   video.attachNetStream (stream).   video.addEventListener (Event.ENTER_FRAME, updateTexture).   texture = new BitmapData (video.width, video.height, true, 0x00FFFFFF).   loopVideo (). } protected function loopVideo (e:NetStatusEvent = null):void {   if ((e == null) || (e.info.code == "NetStream.Play.Stop")) {     played = false.   } } public function playVideo():void{   stream.play (url).   played = true. }

Продолжение листинга 5.24 protected function updateTexture (e:Event = null):void {   if(played)     texture.draw (video). }

Код отображения текстуры на объекте представлен в листинге 5.25.

Листинг 5.25 – Отображение текстуры на объекте

private var videoPlane:Plane = new Plane(200, 150). videoPlane.x = -200. videoPlane.y = -1350. videoPlane.z = 180. videoPlane.rotationX = 90*Math.PI/180. videoPlane.rotationZ = 135*Math.PI/180.       rootContainer.addChild(videoPlane).   videoPlane.visible = true. videoPlane.setMaterialToAllFaces (videoTexture). videoTexture.playVideo().

После чего видео проигрывается на висящем в пространстве экране.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]