Журнал о программированнии на языках Blitz3D, BlitzPlus, BlitzMax

Каталог:Blitz3D FAQ

Материал из Blitz Et Cetera

Перейти к: навигация, поиск


Содержание


 

Программная логика и общие вопросы

Как сделать в программе выбор из нескольких вариантов?

Удобнее всего пользоваться структурой Select:

Select переменная

                Case первое принимаемое значение
                        выполняемые действия
                ...
                Case N-ное принимаемое значение
                        выполняемые действия
                Default
                        действия, выполняемые по умолчанию

End Select

Как правильно проверять на совпадение несколько условий?

Воспользуйтесь AND'ом:

If условие1 And условие2 Then

Как быстро поменять значение переменной-флага?

m = Not m

Как задать бесконечный цикл и выйти из него?

Repeat

...
If условие_выхода Then Exit

Forever

Как изменить шаг в цикле?

Используйте команду Step:

For i = 0 To 10 Step 2

Как сделать, чтобы функция возвращала что-либо?

В функции: Return что_возвращать при вызове:

куда_возвращать = имя_функции()


Function имя_функции()
Return возвращаемое_значение

End Function

Как переместиться в определенную часть программы?

Ответ: удобнее всего воспользоваться метками и командой Goto:

.имя_метки

...

Goto имя_метки

Примечание: многие специалисты считают, что команда GOTO запутывает код и делает его сложным для понимания. Использовать ее не рекомендуется, она вполне заменяема циклами Repeat-Forever / While-Wend, условиями, функциями и другими структурами.

Чем отличается Gosub от Goto?

Gosub предполагает, что возможно будет возврат к предыдущей части программы с помощью команды Return

Как создать / удалить элемент типа?

Создать:

имя_элемента.имя_типа = New имя_типа

Удалить:

Delete имя_элемента

Не забудьте сначала удалить все объекты этого элемента командой FreeEntity.

Как создать массив типа и работать с ним?

1. Создаем тип стандартным способом.

Type имя_типа

... параметры типа

End Type

2. Создаем массив:

Dim имя_массива.имя_типа(кол-во_элементов)

3. Создаем элементы типа:

имя_массива(номер_элемента) = New имя_типа

4. Обращаемся так:

имя_массива(номер_элемента)\параметр_типа

параметр_типа - это то, что стоит после Field.

Как подключить какой-либо файл *.bb к программе?

Ответ: используй команду Include

Include "имя_файла.bb"

Как перевести число в целочисленный тип?

Int(число)

Генератор случайных чисел выдает одни и те же значения. Что делать?

Используй зависимость генерации от таймера, т. е. поставь в начале вот это:

SeedRnd Millisecs()

Как избежать ошибки при написании строковых значений в различных регистрах?

Ответ: используй команду Upper, она конвертирует все к верхнему регистру.

Upper$(строка)

Как выводить текст команды Print или Input в определенном месте?

Поставьте перед выводом команду:

Locate x,y

Что делать если мне надо в типе сделать массив, например для элемета patrons?

Для этого просто впишите следующую строку в тип :

Field patrons[100]

Теперь обращатся к этому массиву можно так:

указатель\patrons[13] = zaklinit_pistolet()

У меня есть переменная. Она у меня должна вызываться в разных функциях, но этого не происходит. В чем может быть проблема?

Раз у вас переменная вызывается в разных функциях, то ее нужно обзывать как глобальную, тогда она будет доступна в любой части кода. Обзывать ее можно перед главным циклом, сразу после инициализации графики (после строчки graphics....), вот так:

Global имя_переменной
 

Управление

Условие KeyHit() срабатывает раньше, чем надо. Почему?

Видимо, надо использовать "очистку" нажатий клавиш:

FlushKeys

Как узнать скан-коды клавиш клавиатуры?

Нужно нажать на кнопку ввиде домика на главной панели и вы попадете на главную страницу help'a , далее жмем Command Reference . Теперь на панели слева будут надписи Scancodes и Scancodes picker. Нажав на первую надпись вы попадете на страницу где будут записаны все сканкоды клавиш в виде "Key - scancode". Нажав на другой надписи, вы увидите изображение клавиатуры. Нажав на нужную вам клавишу в верхнем поле с надписью Scan Code, вы увидите число, которое и является сканкодом выбранной клавиши.

Как работать с колесиком мыши?

Используйте функции:

MouseZ
MouseZSpeed

Кнопка

Сначала грузим картинку и размещаем ее где-то на экране. Пусть ее координаты X;Y , а размер картинки ImageX и ImageY. Теперь в коде засекаем координаты курсора(мышки и т.п.). В общем это не так уж сложно.

Потом пишем код:

If CursorX>X-1 and CursorX<X-1+ImageX and CursorY>Y-1 and CursorY<Y-1+ImageY Then ;засекаем координаты курсора

   (...); Код например по смене (подсветку картинки) - если курсор просто подводится. Если засекается нажатие - делается действие.

EndIf
 

3D-графика

Как включить каркасный просмотр?

If KeyHit(wire_key) Then wLog=Not wLog: WireFrame wLog

Как создать равномерное освещение?

AmbientLight r,g,b

Как создать мерцающий свет (как от костра)?

flame = CreateLight(2)

PositionEntity flame,0,1,0
LightColor flame,255,150,150
LightRange flame,50
;в главном цикле:

LightRange flame,Rnd(30,50)

Как сделать простую воду?

примерно так:

water=CreatePlane()

EntityColor water,10,60,200

EntityAlpha water,0.6

Как сделать воду с волнами?

Это делается загрузкой меша или террайна:

;создаем тип

Type WaterVertices
        Field x#
        Field y#
        Field z#
End Type
;загружаем меш
Global water=LoadMesh("resurs\models\world\water.3ds")
Global Watersurf=GetSurface(water,1)
Dim WaterVertex.WaterVertices(CountVertices(Watersurf))
;функция создания воды
Function CreateWater()
EntityFX water,1
EntityAlpha water,0.6
;ScaleEntity water,,,
;PositionEntity water,,,
;wtex=LoadTexture("")
;ScaleTexture wtex,.05,.05
;EntityTexture water,wtex
For i=0 To CountVertices(Watersurf)-1
        WaterVertex(i) = New WaterVertices
        WaterVertex(i)\x#=VertexX#(Watersurf,i)
        WaterVertex(i)\y#=VertexY#(Watersurf,i)
        WaterVertex(i)\z#=VertexZ#(Watersurf,i)
Next
End Function
;обновляем воду в главном цикле
Function RefreshWater()
Watersurf=GetSurface(water,1)
WaterFreq#=MilliSecs()/4
For i=0 To CountVertices(Watersurf)-1
        WaterVertex(i)\y#=Sin(WaterFreq+WaterVertex(i)\x#*500+WaterVertex(i)\z#*300);*1.2
        VertexCoords Watersurf,i,WaterVertex(i)\x#,-WaterVertex(i)\y#,WaterVertex(i)\z#
Next
End Function

;все!

Как разделить экран на несколько частей?

Используте команду

CameraViewport

Как заставить спрайт не поворачиваться к камере?

SpriteViewMode имя_спрайта,2

Как создать эффект тумана?

Используйте команды работы с камерой:

camera = CreateCamera()

CameraFogMode camera,1
CameraFogRange camera,10,100

CameraFogColor camera,100,100,120

Как узнать сколько треугольников в текущем фрейме?

Для этого есть команда TrisRendered(), которая возвращает число треугольников, попавших в камеру. Посмотреть можно так:

Text 10,10,TrisRendered()

При использовании команды Animate объект начинает двигаться ни тогда, когда нажата клавиша, а когда она отпускается. Почему?

Когда вы пишете в главном цикле "If KeyDown(...) Animate ...", Блиц запускает эту команду постоянно, пока нажата клавиша, а надо ее запустить один раз. Используте KeyHit(), либо введите переменную-флаг. Примерно так:

If speed#=0 Then Animate меш,0
If KeyHit(17)=True Or KeyHit(31)=True Then Animate меш,1

Как загрузить спрайт, чтобы он не был полупрозрачным?

При загрузке спрайта нужно поставить флаг 4:

spr=LoadSprite("...",4)

Как задать порядок отображения объектов?

Используйте команду

EntityOrder

Что делает команда EntityFX?

Она отвечает за различные визуальные эффекты в основном связанные с освещением.

Как поворачивать спрайт?

Вот так:

RotateSprite спрайт, угол

Какая польза от удаления текстуры, нанесенной на объект?

Освобождение памяти. Когда текстура наносится на объект, создается (модифицируется) Brush с этой текстурой. Если не нужно больше совершать манипуляции с текстурой - ее нужно удалить. От этого действительно освобождается память.

Сделал проект, скомпилировал, попытался запустить на другом компьютере, а там ошибка: "Unable to create 3D scene". Ошибка точно не в несовместимости разрешениий - я сделал возможность смены разрешения.

Такое бывает если попытаться запустить 2 проги использующие 3Д-режим. Например, такое может быть, если запустить твою прогу всместе с 3ДМаксом. Так-же возможно разрешение не поддерживается монитором, это может относиться к WideScreen мониторам.

 

Видео и звук

Как загрузить *.Gif файл?

В качестве текстуры - никак, но можно его проиграть как видео-файл командой

DrawMovie

Как проиграть видеоролик?

Я пользуюсь такой вот функцией:

Function screen(name$,keylog,fs=1,x=0,y=0)

;name$ - имя файла
;keylog - доступно прекращение показа или нет (1,0)
;fs - на весь экран или нет (1-полный экран, 0-нет)
;x - x-координата левого верхнего угла
;y - y-координата левого верхнего угла
movie=OpenMovie(name$)
ed=0
Repeat
If keylog=1 Then If KeyHit(28) Or MouseHit(1) Then ed=1
If Not(MoviePlaying(movie)) Then ed=1
If fs=1 Then
        DrawMovie movie,0,0,GraphicsWidth(),GraphicsHeight()
Else
        DrawMovie movie,x,y,MovieWidth(movie),MovieHeight(movie)
EndIf
Flip
Until ed=1
CloseMovie(movie)

End Function

Как проиграть звуковой файл?

Можно так:

sndWave=LoadSound("имя_файла")
PlaySound(sndWave)

Как сделать, чтобы музыка играла постоянно?

Есть несколько способов:

;1 способ

        sndWave=LoadSound("имя_файла")
        LoopSound sndWave
        PlaySound sndWave
;2 способ
        ;сначала загружаете файл:
        sndWave=LoadSound("имя_файла")
        chnWave=PlaySound(sndWave)
        ...
        ;в своем главном цикле пишете:
        If ChannelPlaying(chnWave)=False Then
        chnWave=PlaySound(sndWave)

        EndIf

P.S. 2-й способ более гибкий, например, слегка изменив код, можно реализовать проигрывание нескольких мелодий и т. д.

 

Работа с файлами

Как сохранять в файл?

; открываем файл

fileout = WriteFile("имя_файла")
; записываем данные
WriteString( fileout, "строка" ); - символьные строки
WriteInt( fileout, целое_число ); - числа
WriteFloat( fileout, дробное_число ); - дробные числа
WriteLine( fileout, строка\число ); - запись с новой строки
; закрываем файл

CloseFile( fileout )

Как прочитать файл?

; открываем файл

filein = ReadFile("имя_файла")
; считываем данные
переменная$ = ReadString$( filein ); - символьные строки
переменная% = ReadInt( filein ); - числа
переменная# = ReadFloat( filein ); - дробные числа
переменная = ReadLine( filein ); - считывание строки
; закрываем файл

CloseFile( filein )

Как узнать существует ли файл?

Вот так:

If FileType("имя_файла") = 1 Then ...

Как "просканировать" некую директорию на наличие файлов?

Это делается циклом:

myDir=ReadDir("имя_директории")

Repeat
        fileName$=NextFile$(myDir)
        If fileName$="" Then Exit
        If FileType("имя_директории"+"\"+fileName$) = 1 Then
                fileIn=ReadFile("имя_директории"+"\"+fileName$)
                ...
                CloseFile(fileIn)
        EndIf
Forever

CloseDir myDir

Как открыть уже существующий файл и записать в его конец информацию

Файл можно открыть командой OpenFile. Действительно, при открытии файла позиция записи устанавливается в его начало. Устранить это можно двумя способами. Ламерским: сначала считать из файла всю потом записать с учетом новой инфы (можно, кстати, и так):

While Not(Eof(Your_File))

Readline$ your_File
Wend

;потом записываете вашу инфу

Или вот так:

filename$="имя_вашего_файла"

file=OpenFile(filename$)

SeekFile filе,FileSize(filename$)
 

Разное

Как работать с таймером?

Примерно так:

;в цикле пишете:

If TimerBegin=0 Then TimerBegin=MilliSecs()
If MilliSecs()>=TimerBegin+время_задержки_в_мс Then
        TimerBegin=MilliSecs()
        ...

EndIf

Как запустить другой файл из программы?

ExecFile("имя_файла")

Как "снимать" скриншоты?

Вот функция:

Function screenshot()

        Repeat
                name$ = "screen" + w + ".bmp"
                If FileType(FileName$) Then
                        SaveBuffer FrontBuffer(), name$
                        Exit
                End If
        Forever

End Function

Как скрыть / показать курсор в оконном режиме?

Используйте команды

HidePointer / ShowPointer

У меня не работает какая-либо стандартная функция и выдается сообщение "function not found"

на это может быть несколько причин:

  • проверьте правильность написания функции, например все ли буквы английские.
  • возможно ваша версия блица устарела и не поддерживает эту функцию. посмотреть версию своего блица вы можете в меню: ( help -> about Blitz3D ), а в файле versions.txt вы можете посмотреть какая команда с какой версией была добавлена. к примеру команда OpenMovie появилась с версией 1.71

Как изменить иконку (пиктограмму) у exe–файла, созданного в Blitz3D?

Нужно воспользоваться редактором ресурсов exe-шника, например, ResHack’ером, XNResourceEditor’ом или Restorator’ом. В ResHacker это делается так: Action->Replace Icon…->Open with new icon…->Replace.

Как использовать сторонние библиотеки?

Нужно просто забросить файлы нужной библиотеки (*.dll,*.decls) в папку "userlibs" Blitz3D (по-умолчанию это: C:\Program Files\Blitz3D\userlibs\). Важно! У библиотеки обязательно должен быть файл Имя_Библиотеки.decls - с описанием всех функций нашей библиотеки (его мы обязательно кидаем в папку "userlibs", а заодно и в папку с проектом). Не забывайте так же копировать библиотеку *.dll в папку со своим проектом, если хотите использовать ее уже вне Blitz'а, т.е. в скомпилированном *.exe проекте.

Другие

Друзья