Меню Сайта
Главная
Чат
__________________
Naruto TV-1
Naruto TV-2 Shipudenn
Naruto MOVIE-3
Naruto MOVIE-4
Naruto Приколы-Online
____________________
Windows XP
Linux
Vista
_______________
Games
3D_Модели
Програмы нужные Для Создания ИГР
ГАЛЕРЕЯ СКРИНШОТОВ из УРОКОВ
_______________________
--Blitz3D для начинающих---
Первая комната Blitz3d---
--Основы Cоздания Cетевых Игр---
Создание чата---
--Спрайты и Tекстуры---
Моделирование---
--Создание Серьезных Уровней---
Создание Kосмической Aркады---
--Звук, музыка и Интерфейс---
Создание основ Pолевой Игры---
--Простейший First-Person Шутер---
--Пиктограмма exe-файла---
___________________
Обои для Рабочего Стола
_________________
Раздел Банеров
Друзья-Сайта
Аниация и кправление камерой---
Redact
 

ToP Sites http://mo3del.ru/ http://mir3d.3dn.ru/ http://sw-in.narod.ru/

--Звук, музыка и Интерфейс---

Урок 11. Звук, музыка и интерфейс

11.1.  Аудио возможности Blitz3D
    По мнению профессионалов игровой индустрии - игры без звука подобны бассейну без воды. Трудно с этим не согласиться! Звуковые эффекты и музыка - эта основа для передачи эмоциональной картины сцены. Музыкальные фрагменты и звук могут отразить чувство страха, переживания, волнения, неприязни, радости и других чувств в зависимости от текущего сюжета. Без звуков игра превращается лишь в последовательность анимационных картинок.
   
Разработчики Blitz3D, естественно не могли лишить пользователей своего продукта этой важной составляющей игростроения и в состав пакета входит приличный набор полезных функций для воспроизведения аудио.
    Что касается аудио-форматов, то
Blitz3D дает возможность для воспроизведения файлов: .raw, .wav, .mp3, .ogg
    Музыкальные возможности Blitz3D еще шире, он легко воспроизводит: .raw, .mod, .s3m, .xm, .it, .mid, .rmi, .wav, .mp2, .mp3, .ogg, .wma, .asf  файлы.
    Основная функция загрузки аудио-файла изучаемого нами языка - это
LoadSound(), в качестве аргумента которой передается имя файла, содержащего аудио-данные.
    Воспроизведение звукового файла можно смело поручить функции PlaySound(). Ее аргументом является идентификатор звуковых данных, который возвращает ране вызванная функция
LoadSound(). Для проигрывания звукового файла по-кругу можно указать на это программе при помощи функции LoopSound().  Сама по себе эта функция не проигрывает файл, она лишь дает указание функции PlaySound() каким способом производить это воспроизведение.
    Ниже приведенный фрагмент загружает и воспроизводит звук ветра. Звуковой файл прилагается: (
wind1.mp3)
 
Print "Wind ..."
wind=
LoadSound("wind1.mp3")
LoopSound wind
PlaySound(wind)
While KeyHit(1) <> True
Wend
FreeSound wind
End

Высвобождение ресурсов, связанных с аудио-файлами осуществляется функцией FreeSound().

   В процессе  воспроизведения может понадобится остановка звука, продолжение его проигрывания, изменения каких-либо характеристик, увеличение-уменьшение громкости и т.д. Давайте приведем небольшой пример, как это можно реализовать в Blitz3D. Подопытным файлом будет .mp3 файл с битрейтом 44 кГц. Скачайте его тут - (sound1.mp3) Алгоритм действий будет таков: начнем воспроизводить файл, приостановим воспроизведение, продолжим проигрыш, изменим частоту звучания, вернем исходную частоту и, напоследок, поочередно сместим воспроизведение для правого и левого динамика. Код для нашего алгоритма будет выглядеть так:

sound=LoadSound("sound1.mp3")
LoopSound sound

channel=
PlaySound(sound)

Print "Playing sound for 2 seconds ..."
Delay 2000

Print "Pausing sound for 2 seconds ..."
PauseChannel channel
Delay 2000

Print "Restarting sound ..."
ResumeChannel channel
Delay 2000

Print "Changing frequency of sound ..."
ChannelPitch channel, 22000
Delay 2000

Print "Restore previous frequency of sound ..."
ChannelPitch channel, 44000
Delay 2000

Print "Left speaker only"
ChannelPan channel,-1
Delay 2000

Print "Right speaker only"
ChannelPan channel,1
Delay 2000

Print
"All Tests complete!"
StopChannel channel

11.2. Каналы и регулировка громкости

    Как вы поняли из предыдущего пункта урока, дальнейшая манипуляция звуками и музыкой после загрузки и начала воспроизведения основывается на методике каналов: (
CHANNEL ). Следовательно при вызове функции PlaySound() вы должны назначить возвращаемое значение непременной символизирующей канал таким образом:

chnWave = PlaySound( mySound )

Все последующие функции работы со звуком, используют впоследствии эту переменную, а не переменную, возвращаемую функцией LoadSound(). Это такие функции как: StopChannel(), PauseChannel(), ResumeChannel(), ChannelPitch(), ChannelVolume(), ChannelPan(), and ChannelPlaying(). В качестве первого аргумента всех этих функций как раз и выступает переменная chnWave (в нашем случае). Естественно, что благодаря этому вы можете воспроизводить параллельно несколько звуков, проигрывать музыкальный трек и по ходу дела менять параметры воспроизводимых эффектов - громкость, частоту и т.д.
Давайте сделаем маленькую программу, меняющую громкость звуков и музыки при нажатии клавиш. Стрелки "вправо - влево" - будут менять звуки речи, а "вперед - назад" - музыкальный "бэкграунд" (в качестве которого будем использовать звук ветра из первого пункта текущего урока)

Print "Press arrows to change the Volume"
sound1=
LoadSound("sound1.mp3")
LoopSound sound1
sound2=
LoadSound("wind1.mp3")
LoopSound sound2


channel1=
PlaySound(sound1)
channel2=
PlaySound(sound2)

iSpeechVolume# = 0.2
iWindVolume# = 0.4

ChannelVolume channel1, iSpeechVolume
ChannelVolume channel2, iWindVolume


While KeyDown(1) <> True

If KeyHit(203) = True
  If iSpeechVolume > 0
    iSpeechVolume = iSpeechVolume - 0.1
  EndIf
  ChannelVolume channel1, iSpeechVolume
EndIf

If KeyHit(205) = True
  If iSpeechVolume < 1
    iSpeechVolume = iSpeechVolume + 0.1
  EndIf
 
ChannelVolume channel1, iSpeechVolume
EndIf

If KeyHit(208) = True
  If iWindVolume > 0
    iWindVolume = iWindVolume - 0.1
  EndIf
 
ChannelVolume channel2, iWindVolume
EndIf

If KeyHit(200) = True
  If iWindVolume < 1
    iWindVolume = iWindVolume + 0.1
  EndIf
 
ChannelVolume channel2, iWindVolume
EndIf

Wend

End

Выполните программу и нажимайте стрелки "вправо-влево", "вперед-назад" для изменения громкости ветра и речи. Изменения происходят в диапазоне от 0 до 1.

Помимо функции
LoadSound() Blitz3D поддерживает функцию PlayMusic() для множества музыкальных форматов, перечисленных выше. В отличии от функции LoadSound()  она сама загружает и начинает проигрывать музыкальный файл. PlayMusic() возвращает переменную канала, которая обрабатывается уже известными Вам способами.
Внимание: для проигрывания
.mid (MIDI файлов) нужно обновить Blitz3D до версии 1.88 иначе на некоторых компьютерах воспроизведение данного формата музыкальных файлов может не происходить!

11.3. Объемный звук

     Каким бы качественным не был звук в игре, он не может создать полноты ощущения присутствия без применения
объемного звука. Blitz3D обладает набором функций для эмуляции трехмерного звучания. Так, например, звук может быть связан с каким-то объектом, а слушателем звука, будет наш игрок (или связанная с ним камера). Тогда при изменении взаимного положения этих объектов, мы почувствуем изменение направления источника звука, а также уменьшении или увеличение его громкости при удалении или приближении к этому источнику.
      Функций для работы с объемным звуком всего три:
     
Load3DSound()
      CreateListener()
      EmitSound()

      Функция Load3DSound(filename$)  - загружает звуковой файл и возвращает его идентификатор для работы функции EmitSound()
 
      Что касается функции CreateListener(), то в ее обязанности входит установка объекта, который будет улавливать звук. В большинстве случаев в качестве такого объекта выступает камера. Также функция CreateListener() принимает три опциональных параметра:
      
rolloff_factor#   - коэффициент, по которому звук уменьшается на расстоянии (1 по      
                               умолчанию.)
      
doppler_scale#  - соответствие закону эффекта допплера. (1 по умолчанию.)
       distance_scale# - масштаб расстояний между объектами (1 по умолчанию.)

      И последняя функция:
EmitSound() - собственно воспроизводит объемный звук, в в зависимости от текущего положения объектов источника и приемника звука. Этой функции можно передавать два аргумента:
     
sound - идентификатор звука, загруженного ранее функцией Load3DSound()
     
entity - объект - источник звука.

      Располагая этими тремя функциями
, звуковым файлом (boat.wav), известной уже моделью кораблика (ship1t.md2 с его текстурой ship.jpg) и анимированной текстурой воды (wateranim.jpg)
создадим небольшой пример для демонстрации объемного звука. Задание для примера: загрузить модель корабля, звук, связать объект приемника звука с камерой, а источник с кораблем. Все это решается следующим кодом:

Graphics3D 640, 480,16,2
SetBuffer BackBuffer()

Global Ship

player=
CreateSphere()
PositionEntity player, -12, 1, -5
cam=
CreateCamera(player)
TurnEntity player, 0,0,0

TurnEntity player,0,-30,0

light=
CreateLight(2)
PositionEntity light,0,60,30

; Load the animation strip for the water texture
watertext=
LoadAnimTexture("wateranim.jpg",256,124,124,0,25)
water=
CreatePlane()
PositionEntity water,0,0,0
ScaleTexture watertext, 20,20

PlaceShip()

listener=
CreateListener(cam,1,1,1)
shipsound=
Load3DSound("boat.wav") ; Load 3D sound
LoopSound shipsound

EmitSound(shipsound, ship)


While KeyHit(1) <> True

wd=wd+1
If wd=4
  EntityTexture water,watertext,frame,1
  frame=frame+1
  If frame=22 Then frame=0
  wd=0
EndIf

MoveEntity ship, 0,0,-0.01
If KeyDown(200) MoveEntity player,0,0,0.1
If KeyDown(208) MoveEntity player,0,0,-0.1
If KeyDown(203) TurnEntity player,0,2,0
If KeyDown(205) TurnEntity player,0,-2,0

UpdateWorld()
RenderWorld()
Flip

Wend

End

;=====================
Function PlaceShip()
shiptex =
LoadTexture("ship.jpg")
Ship =
LoadMD2("ship1t.md2")
ScaleEntity Ship, 0.1, 0.1, 0.1
EntityTexture Ship, shiptex
PositionEntity ship, 0,0,0
End Function

Как видно из приведенного фрагмента - вся работа со звуком укладывается в четыре строчки:

listener=CreateListener(cam,1,1,1)
shipsound=
Load3DSound("boat.wav") ; Load 3D sound
LoopSound shipsound
EmitSound(shipsound, ship)

    Первая строчка назначает камеру в качестве приемника звука, затем грузится звук. Известная по предыдущим примерам функция LoopSound() указывает на необходимость повторения звука в цикле и последняя строка посылает команду на воспроизведение с назначением объекта корабль в качестве источника звука.

11.4. Проигрывание CD
   
     Очень часто игры, выпускающиеся на дисках имеют несколько музыкальных дорожек вместе с другими данными (графикой, библиотеками и исполняемыми модулями).
Blitz3D имеет в своем составе функцию для проигрывания треков с CD под названием PlayCDTrack()
Этой функции нужно передать два следующих параметра:
track - номер дорожки для воспроизведения
mode - режим воспроизведения: 1 - проиграть трек 1 раз, 2 - проигрывать трек по кругу, 3 - проиграть трек и далее играть до конца диска.
     Наша тестовая программа для проигрывания какого-либо музыкального диска будет выглядеть весьма просто:

; Play CD

; Number  ot track to play first
track=1

; Play the track, assign a channel - "play once" mode
chnCD=
PlayCDTrack(track,1)

; Initialize timer
oldTime=
MilliSecs()
; Play until the channel is over or ESC
While ChannelPlaying(chnCD) And (Not KeyHit(1))
; clear and print the time elapsed
Cls
Locate 0,0
Print "Time Elapsed (sec):" + ((MilliSecs()-oldTime)/1000)

If KeyHit(205) = True
  oldTime=
MilliSecs()
  track = track + 1
  chnCD=
PlayCDTrack(track,1)
EndIf

If KeyHit(203) = True
  If track > 1
     oldTime=
MilliSecs()
     track = track - 1
     chnCD=
PlayCDTrack(track,1)
  EndIf
EndIf

Wend

; Stop the channel
StopChannel chnCD
End

Программа начинает с проигрывания трека № 1 и запоминает время начала проигрывания, выводя время воспроизведения трека. Клавиши влево вправо используются для переключения между треками. Окончание воспроизведения выясняется при помощи функции ChannelPlaying(),
По заявлению разработчиков, эта функция может не работать с функцией PlayCDTrack() на разных CD приводах, но просто незаменима для определения окончания воспроизведения различных музыкальных фрагментов для фоновой музыки игры и в других подобных случаях.

11.5. Видеовставки в игре

    Очень часто в игровом процессе возникает необходимость проиграть какую-то заставку при достижении сюжетной линии какого-либо ключевого события. Как правило, разработчики создают заставки либо на движке самой игры (так называемые скриптовые сцены) либо 3D аниматоры создают ролики в специализированных пакетах (таких как 3D studio, Maya и прочих)
    Blitz3D предоставляет возможность просматривать видео-ролики во время игры непосредственно в окне приложения либо использую какой-либо текстурированный объект.
    Открыть ролик можно при помощи функции OpenMovie() в качестве аргумента которой передается имя видео-файла. Само воспроизведение осуществляется при помощи функции
DrawMovie()

   Давайте сделаем небольшую тестовую программку, которая будет отображать несколько секунд ролика на гранях созданного куба. Вначале запасемся маленьким видео-файлом -
video.avi и любой текстурой для пола на котором будет располагаться наш куб.  Текст программы приведен ниже:

Graphics3D 640,480,16,2
camera=
CreateCamera()
light=
CreateLight()

player=
CreateSphere()
PositionEntity player, 2, 0, 0
cam=
CreateCamera(player)
TurnEntity player, 0,30,0

watertext=
LoadTexture("floor.jpg")
water=
CreatePlane()
PositionEntity water,0,-2,0
ScaleTexture watertext, 1,1
EntityTexture water,watertext

;create texture for the movie & 3d entity
movietex =
CreateTexture(256,256,256+48)
cube =
CreateCube()
EntityPickMode cube, 2
EntityTexture cube,movietex
MoveEntity cube,0,0,2

;load movie
movie =
OpenMovie("video.avi")

While Not KeyHit(1)
   If (MouseHit(1)=True)
      ent = CameraPick(cam,MouseX(),MouseY())
      If ent
        If MoviePlaying(movie)=0
           movie = OpenMovie("video.avi")
        EndIf
      EndIf
   EndIf

If KeyDown(200) MoveEntity player,0,0,0.2
If KeyDown(208) MoveEntity player,0,0,-0.2
If KeyDown(203) TurnEntity player,0,2,0
If KeyDown(205) TurnEntity player,0,-2,0

DrawMovie(movie)
CopyRect 0,0,256,256,0,0,BackBuffer(),TextureBuffer(movietex)

RenderWorld
Flip
Wend
End

Как видно из текста программы, текстура для обтягивания куба создается динамически при помощи функции CreateTexture() Проигрывание каждого кадра ролика осуществляется в дублирующем буфере и затем он копируется в буфер созданной нами текстуры, которая уже обтягивает наш куб. Таким образом осуществляется эффект визуализации видеофрагмента на гранях любого объекта типа mesh.

11.6.  Создание интерфейсов.

Для взаимодействия с пользователем в процессе игры, настройки некоторых параметров игры и т.д. создаются игровые интерфейсы.
Для
программ созданных с помощью Blitz3D сделано уже немало интерфейсов (GUI) и мы остановимся на рассмотрении одного из них - XLNT версии 2. Все файлы интерфейсной библиотеки поставляются в виде исходных текстов на языке Blitz3D.
Мы научимся подключать эту библиотеку к нашим программам и использовать ее оконные функции наряду с другими элементами интерфейса.
Распакуйте архив
xlnt2.zip в папку с каким-либо проектом на Blitz3D. Например, можно воспользоваться проектом из урока 3 - room2.bb. В папке с проектом также должен находиться подключаемій файл XStart.bb - он нужен для инициализации всех модулей библиотеки, чтоб компилятор и компоновщик языка Blitz3D включил все ее функции в исполняемый модуль нашего проекта.
Таким образом необходимо во все программы, где Вы планируете использовать библиотеку XLNT включать следующую строку:

Include "XStart.bb"

Давайте сделаем так, чтоб по нажатию клавиши Enter в нашем проекте возникало окно и кнопка для его закрытия и возвращения в нормальный режим функционирования программы.
Для инициализации оконного интерфейса библиотеки XLNT служит функция GUI_GFXSETUP().
После ее вызова в теле вашей программы можно вызывать другие функции оконного интерфейса. Для нашего примера актуальны функции создания окна и кнопки. Продемонстрируем как это выглядит:

MyWIN=GUI_Window(100,200,300,100,"My First Window")
Quit=
GUI_Button(MyWin,10,50,100,"Quit")

Рассмотри первую строку. Функция GUI_Window - создает окно (не отображая его) и возвращает его идентификатор. Полный перечень параметров этой функции следующий:

GUI_WINDOW(X,Y,W,H,TITLE$,[ICON$],[FLAG],[MOD],[WIN_COL0],[BAR_COL0],[TITLE_COL],[WIN_COL1],[BAR_COL1])

В квадратных скобках указаны аргументы, которые можно опустить.
X,Y - координаты верхнего угла окна в пикселях

W,H -
вісота и ширина окна в пикселях
TITLE$ -
Заголовок окна

ICON$ : Имя иконки окна
FLAG : Флаг окна (см. ниже)
MOD
: Режим окна (Normal - по умолчанию)
WIN_COL0 : Цвет окна
BAR_COL0 : Цвет панели окна
TITLE_COL : Цвет заголовка окна
WIN_COL1
: Опциональный второй цвет окна
BAR_COL1 : Опциональный второй цвет заголовка окна

Функция возвращает значение целого типа (идентификатор окна)

Flag: флаг для установки внешних значений окна. Можно использовать суммирование для установки нескольких флагов.
1 : Menu : Окно содержит меню
2 : Quit : окно содержит кнопку закрытия (должна присутствовать панель для ее размещения)
4 : Min : Окно содержит кнопку минимизации
8 : Back : Окно содежит кнопку Push-Back
16 : Drag : Окно можно перетаскивать мышью по экрану
32 : Scale : Окно разрешается масштабировать.
64 : зарезервировано.
128 : Gradient : Окно поддерживает градиентную заливку.

Например : Flag=51 [1+2+16+32] У окна есть панель для меню[1], Кнопка закрытия[2], возможность перетаскивания[16], и масштабирования[32].
По умолчанию : Меню+Выход+Минимизация+Push-Back+перетаскивание+масштабирование

Modal : Это значение определяет поведение окна в то время как оно активно..
0 : Normal : Окно может перекрываться другими окнами [значение по умолчанию]
1 : OnTop : Окно всегда остается наверху, но пользователь может взаимодействовать с другими окнами.
2 : Locked : Окно поверх всех окон и пользователь может взаимодействовать только с ним.


Функция GUI_Button - создает кнопку в окне. Полный перечень параметров этой функции следующий:

GUI_BUTTON(WIN,X,Y,W,TXT$,[ICON$],[TAB],[ACT],[HELP$],[COL0],[COL1],[TCOL])
В квадратных скобках указаны аргументы, которые можно опустить.
WIN : родительское окно кнопки
X,Y,W,H : размещение в окне и размеры
ICON$ : иконка для кнопки [по умолчанию""]
TAB : Закладка для кнопки [по умолчанию 0]
ACT : кнопка активна [True] или неактивна [False] [по умолчанию True]
HELP$ : всплывающая подсказка для кнопки [Default ""]
COL0 : первичный цвет кнопки
COL1 : вторичный цвет кнопки
TCOL : цвет текста на кнопке [по умолчанию Black - черный]

Теперь в главном цикле поместим код для отображения нашего окна и размещенной на нем кнопки:

If KeyHit(28)
  GUI_OpenWin(Mywin)
 
While Finish=False
    
RenderWorld
     UpdateWorld


     GUI()

    
;Check if we clicked the QUIT Button
    
If EV_Gad_Release(Quit)
          Finish=
True
    
EndIf

   
 ;And check if we clicked MyWin Close button
    
If EV_Win_Close(MyWin)
         Finish=
True
    
EndIf
    
Flip
 
Wend
EndIf

Итак, как мы видим, по нажатию клавиши Enter (скан код 28) вызывается функция GUI_OpenWin
которой в качестве аргумента передается идентификатор окна, созданного ранее. Кнопка отображается атоматически, так как она уже создана как дочерний объект окна видимого в этот момент на экране. Функция
GUI() отвечает за визуализацию всех объектов библиотеки XLNT и потому ее нужно обязательно вызывать в программе.
EV_Gad_Release - это функция события отпускания кнопки. Если мы нажмем и отпустим кнопку мыши на кнопке - происходит событие, которое можно отработать. В нашем случае переменной Finish присваивается значение True и цикл завершается. В качестве аргумента этой функции передается дескриптор самой кнопки Quit. Тоже самое происходит при нажатии на кнопку Close (с крестиком) в правом верхнем углу окна. За обработку этого события отвечает функция - EV_Win_Close. В качестве аргумента, ей передается идентификатор окна MyWin.
В окне нашего приложения єто віглядит так:



Полный исходный код можно увидеть здесь - (room3.bb)
В качестве легкого упражнения можете сделать, чтоб по нажатию на кнопку
Quit завершалась ваша программа.

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

Приведем пример еще одной интересной возможности библиотеки интерфейса  XLNT , а именно возможность встраивать в окно еще один экран рендеринга. К примеру, у вас экран отображает какой-то момент вашей игры - антураж комнаты или ландшафт и вы хотите посмотреть характеристики вашего персонажа. Очень эффектно, если персонаж будет отображаться как трехмерная модель в окне настроек его характеристик.
В нашем примере для простоты мы воспользуемся приемом создания второй камеры, которая отобразит дракончика (входит в поставку
Blitz3D) прямо в нашем интерфейсном окне.
Дракончика и его текстуру можно взять здесь - (
dragon.md2, texture.bmp)
Используем тот же проект с комнатой из урока 3 -
room2.bb.
Добавим несколько глобальных переменных:

;////////////////////
; 3D Port
;////////////////////
Global TownWin
Global TownPORT
Global Quit
Global dragon
Global anispeed# = 0.15
Global newcam=CreateCamera()
PositionEntity newcam,-2,0,-2

Как вы заметили, мы создали еще одну камеру и расположили ее за нашей комнатой.
Создадим окно интерфейса с кнопкой,
3DPort в окне для отображения модели и загрузим модель дракончика:

Function CreateDialog()
  dragon=
LoadMD2( "dragon.md2" )
  ScaleEntity dragon, .07,.07,.07
  tex_dragon=Load
Texture( "texture.bmp" )
  EntityTexture dragon,tex_dragon
  PositionEntity dragon,3,0,-3
  RotateEntity dragon, 0,90,0
  AnimateMD2 dragon,1,anispeed#,0,40
  CreateLight()
  PointEntity newcam, dragon
  TownWin=GUI_WINDOW(-1,-1,300,220,
"Town Hall of Erathia")
  TownPORT=GUI_3DPORT(TownWIN,10,50,170,160,
"Week of Blue Dragon",newcam)
  Quit=GUI_BUTTON(TownWin,180,50,100,
"Quit")
  GUI_OPENWIN(TownWin)
  GUI_WINHIDE(TownWin)
End Function

Функция библиотеки XLNT  GUI_3DPORT - создает 3D viewport в окне.
Перечень аргументов этой функции:
GUI_3DPORT(WIN,X,Y,W,H,TEXT$,[CAM],[WIRE],[TAB])

TEXT$ : строка текста в созданном окне
CAM : камера (опционально)
WIRE : режим сетки без текстур и полигонов (по умолчанию отключен)

Returns : возвращает дескриптор созданного окна (целое число)
Остальные параметры и так понятны.
Привязка новой камеры к модели осуществляется функцией
PointEntity.


Теперь напишем функцию, которая будет вызваться по нажатию клавиши Enter и отображать наше интерфейсное окно вместе с viewport-ом .

Win)
;=========================
; Dialog
;=========================

Function ShowDialog()
  lFINISH =
False
  GUI_WINSHOW(TownWin)
  While Not lFINISH
     SetBuffer BackBuffer():Cls
     CameraProjMode cam,0
     CameraProjMode newcam,1
     GUI_RENDER3D(TownPORT)
     CameraProjMode newcam,0
     CameraProjMode cam,1
     UpdateWorld()
     RenderWorld()
     GUI()
     If MouseHit(2)
        lFINISH=
True
     EndIf
     If EV_WIN_CLOSE(TownWIN)
        lFINISH=
True
    
EndIf
     If EV_Gad_Release(Quit)
        lFinish=
True
     EndIf
    
Flip
  Wend
GUI_WINHIDE(TownWin)
End Function

Как нетрудно заметить, перед вызовом функции GUI_RENDER3D(TownPORT) мы переключаемся на вторую камеру при помощи команды CameraProjMode. Выход из оконного интерфейса осуществляется нажатием на кнопку Quit, кнопку Close окна или просто щелчком правой кнопки мыши.




 
 
 

уже 16007 посетителей!
 
Часы
 
Этот сайт был создан бесплатно с помощью homepage-konstruktor.ru. Хотите тоже свой сайт?
Зарегистрироваться бесплатно