forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   FAQ по B3D (http://forum.boolean.name/showthread.php?t=4251)

avel 25.08.2007 16:40

FAQ по B3D
 
полазев по форуму, и обнаружив, что у новичков возникают в основном одни и теже вопросы, решил вот написать FAQ по Blitz3D, дабы люди не засоряли форум постами из-за одного простенького вопроса, а нашли все нужное здесь. все мы когда-то были зелеными новичками и не знали как сделать то или иное...
я не считаю себя таким уж профессионалом в Blitz3D, я тоже продолжаю учиться и узнавать много нового про этот замечательный язык, но, думаю я вполне достиг того уровня, когда могу ответить людям на их вопросы.
все материалы и вопросы взяты с форума и головы автора. большинство из приведенных здесь функций написаны либо мной либо взяты из стандартных хелпов блица, которые к сожалению не все могут читать...
если у вас возникают вопросы, то пишите их сюда, только в краткой форме. время от времени я буду на них отвечать, когда наберется побольше.
а пока, вот:

avel 25.08.2007 16:47

Re: FAQ по B3D
 
ПРОГРАММНАЯ ЛОГИКА И ОБЩИЕ ВОПРОСЫ

н: как сделать в программе выбор из нескольких вариантов?
avel:удобнее всего пользоваться структурой Select:
Код:

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

н: как правильно проверять на совпадение несколько условий?
avel: воспользуйтесь AND'ом: IF условие1 And условие2 Then

н: как быстро поменять значение переменной-флага?
avel: m = Not m

н: как задать бесконечный цикл и выйти из него?
avel:
Repeat
...
If условие_выхода Then Exit
Forever

н: как изменить шаг в цикле?
avel: используй команду Step

н: как сделать, чтобы функция возвращала что-либо?
avel: в функции: Return что_возвращать
при вызове: куда_возвращать=имя_функции()

н: как переместиться в определенную часть программы?
avel: удобнее всего воспользоваться метками и командой Goto:
.имя_метки
...
Goto имя_метки

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

н: как перебирать все элементы типа?
avel: используй цикл:
for имя_элемента.имя_типа = Each имя_типа
...
Next

н: как создать\удалить элемент типа?
avel:
создать:
имя_элемента.имя_типа = New имя_типа
удалить:
Delete имя_элемента
не забудьте сначала удалить все объекты этого элемента командой FreeEntity

н: как создать массив типа и работать с ним?
avel:
1) создаем тип стандартным способом.
2) создаем массив: Dim имя_массива.имя_типа(кол-во_элементов)
3) создаем элементы типа: имя_массива(номер_элемента) = New имя_типа
4) обращаемся так: имя_массива(номер_элемента)\параметр_типа
параметр_типа - это то, что стоит после Field.

н: как подключить какой-либо файл *.bb к программе?
avel: используй команду Include "имя_файла.bb"

н: как перевести число в целочисленный тип?
avel: Int(число)

н: генератор случайных чисел выдает одни и теже значения. что делать?
avel: используй зависимость генерации от таймера, т. е. поставь вначале вот это: SeedRnd Millisecs()

н: как избежать ошибки при написании строковых значений в различных регистрах?
avel: используй команду Upper, она конвертирует все к верхнему регистру.

н: как выводить текст команды Print или Input в определенном месте?
avel: поставь перед выводом команду Locate x,y

н: условие KeyHit() срабатывает раньше, чем надо. почему?
avel: видимо надо использовать "очистку" нажатий клавиш: FlushKeys

avel 25.08.2007 16:48

Re: FAQ по B3D
 
РАБОТА С ФАЙЛАМИ

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


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

н: как прочитать файл?
avel:
Код:


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

н: как узнать существует ли файл?
avel: вот так: If FileType("имя_файла") = 1 Then ...

н: как "просканировать" некую директорию на наличие файлов?
avel: это делается циклом:
Код:

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


avel 25.08.2007 16:50

Re: FAQ по B3D
 
ВИДЕО И ЗВУК

н: как загрузить *.Gif файл?
avel: в качестве текстуры никак, но можно его проиграть как видео-файл командой DrawMovie

н: как проиграть видеоролик?
avel: я пользуюсь такой вот функцией:
Код:

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

н: как проиграть звуковой файл?
avel: можно так:
Код:

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

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

;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 способ более гибкий, например, слегка изменив код, можно реализовать проигрывание нескольких мелодий и т. д.

avel 25.08.2007 16:52

Re: FAQ по B3D
 
РАЗНОЕ

н: как работать с таймером?
avel: примерно так:
Код:

;в цикле пишешь:
If TimerBegin=0 Then TimerBegin=MilliSecs()
If MilliSecs()>=TimerBegin+время_задержки_в_мс Then
        TimerBegin=MilliSecs()
        ...
EndIf

н: как скрыть\показать курсор в оконном режиме?
avel: используй HidePointer\ShowPointer

н: как запустить другой файл из программы?
avel: ExecFile("имя_файла")

н: как включить каркасный просмотр?
avel: If KeyHit(wire_key) Then wLog=Not wLog WireFrame wLog

н: как создать равномерное освещение?
avel: AmbientLight r,g,b

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


flame = CreateLight(2)
PositionEntity flame,0,1,0
LightColor flame,255,150,150
LightRange flame,50
;в главном цикле:
LightRange flame,Rnd(30,50)

н: как сделать простую воду?
avel: примерно так:
water=CreatePlane()
EntityColor water,10,60,200
EntityAlpha water,0.6

н: как сделать воду с волнами?
avel: делается загрузкой меша или террайна:
Код:

;создаем тип
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
;все!

н: как разделить экран на несколько частей?
avel: используй CameraViewport

н: как заставить спрайт не поворачиваться к камере?
avel: SpriteViewMode имя_спрайта,2

н: как "снимать" скриншоты?
avel: вот функция:
Код:

Function screenshot()
For w = 1 To 100
        name$ = "screen" + w + ".bmp"
        If FileType(name$) = 0
                If done = 0
                        SaveBuffer(FrontBuffer(), name$)
                        done = 1
                EndIf
        EndIf
Next
done = 0       
End Function

н:как создать эффект тумана?
avel: используй команды работы с камерой:
Код:

camera = CreateCamera()
CameraFogMode camera,1
CameraFogRange camera,10,100
CameraFogColor camera,100,100,120


H@NON 25.08.2007 17:15

Re: FAQ по B3D
 
Цитата:

н: как перевести число в целочисленный тип?
avel: Int(число)
Надо не забывать, что int не возводит в целое число а округляет его.

Цитата:

н: как изменить шаг в цикле?
avel: используй команду Step
Нужно уточнять ,что это за цикл, ведь есть еще repeat/forever, моэтому правильней будет так:
for m = 0 to n Step 1
...
next

Остальное еще не прочитал...

ZanoZa 26.08.2007 20:26

Re: FAQ по B3D
 
малаца! надо тока чтобы тему сразу видно было.

johnk 26.08.2007 20:51

Re: FAQ по B3D
 
Р-Е-С-П-Е-К-Т-!!!

moka 27.08.2007 00:56

Re: FAQ по B3D
 
Хм, думаю ещё такой пунктик будет полезен:
вопрос: Как возвращать функцией не только целое число?
ответ: За именем функции при создании ставить соответствующий оператор:
Function ФункцияОператор()
Return
End Function
Операторы могут быть 3 и более видов: # % или $.

Ну чтото в этом роде добавь ;)


Цитата:

н: генератор случайных чисел выдает одни и теже значения. что делать?
avel: используй зависимость генерации от таймера, т. е. поставь вначале вот это: SeedRnd Millisecs()
Уточни, где ставить. Не "вначале" а "при загрузки программы" или "при инициализации"


Цитата:

н: как проиграть звуковой файл?
avel: можно так:
Так, тут немного не корректно. Во первых ты и грузишь и играешь музыку сразу в одном месте, многие новички поставят это в цикл, и их компьютер умрёт от постоянной загрузки и проигровки файлов. Уточни что нужно Загрузить при загрузки прогрммы файл, а уже потом его проигрывать. И то при условии.


Цитата:

н: как работать с таймером?
avel: примерно так:
Ты приводишь в коде не таймер, а самодельный эмитатор таймера, а именно замерка времени но не самими таймерами, которые уже есть в б3д, ну ты понял крч ;)


Цитата:

н: как создать равномерное освещение?
avel: AmbientLight r,g,b
вопрос: Как поменять цвет затенения?
ответ: Использовать комманду AmbientLight R,G,B.


Цитата:

н: как создать мерцающий свет (как от костра)?
avel:
Аналогично со звуками.


И ещё, ты извени но имхо, FAQ лучше оформлять так:
Вопрос:
Ответ:

Horror 27.08.2007 13:59

Re: FAQ по B3D
 
ВОт про мерцание света(так лучше чем через рандом, ПИШУ все как было):


ВОПРОС :
Мне надо чтоб свет мигал ,более реалистичние. Сейчас я делаю так [LightRange light,Rnd(5,15)]
ОТВЕТ:

А зачем менять расстояние освещения, когда нужно скрывать\показывать свет:
Задаешь время работы и время паузы:
Код:

PauseTime = 100;Время паузы в миллисекундах
WorkTime = 500;Время работы в миллисекундах
RndPauseTime = 35;Отклонение времени паузы
RndWorkTime = 85;Отклонение времени работы
;В цикле проверяешь:
If (MilliSecs() - Timer) > ConstraintTime Then
If (Status =1) Then
ConstraintTime = PauseTime +Rand(-RndPauseTime, RndPauseTime)
HideEntity(Light)
Else
ConstraintTime = WorkTime +Rand(-RndWorkTime, RndWorkTime)
ShowEntity(Light)
EndIf
Status =1 -Status
Timer =MilliSecs()
EndIf



Отклонение времени можно и не делать (убрать Rand'омы из кода), но так прикольнее



ПС Этим кодом можно сделать и огонь и мерцающуюю лампу , да много что ...
ППС Оригинальный код писал Platon

avel 27.08.2007 19:57

Re: FAQ по B3D
 
все исправления и предложения принимаются. если я где-то что-то не совсем корректно описал, то прошу прощенья, возможно для новичков и впрямь не все так понятно... но за счет ваших поправок они думаю разберуться. а самим новичкам еще раз напомню, что они могут писать сюда свои вопросы и я время от времени буду на них отвечать.

MiXaeL 27.08.2007 23:07

Re: FAQ по B3D
 
прикольно, теперь соберите все это вместе, добавьте еще че-нить создайте отдельную тему и сразу ее закройте (чтоб мусором не засоряли)

H@NON 28.08.2007 14:41

Re: FAQ по B3D
 
ВОПРОС : так как же все-таки загрузить gif картинку как анимационную ленту?
ОТВЕТ:

можно так:
Код:

; Animated Gif file loader by Peter Scheutz 2003.03.13
; Load animated Gif and returns an animImage
; Stores number of frames in gifframecount

Global gifframecount

; useage:
;myanim=LoadAnimGif("mygif.gif")



Function LoadAnimGif(fname$)

    Local fbank
    Local f
    Local thegif
    Local animPic
    Local count
    Local framecount
    fbank=CreateBank(FileSize(fname$))

    f=OpenFile(fname$)
        ReadBytes fbank,f,0,BankSize(fbank)
    CloseFile f
   
    ; This is a quick hack and not quite good enough,
    ; as it could count too many frames
    ; Works for all the gifs I tested though...
    ; Looks for "Gif magic marker"
    For n=0 To BankSize(fbank)-1
        If PeekByte(fbank,n)=0
        If PeekByte(fbank,n+1)=33
        If PeekByte(fbank,n+2)=249
            ;DebugLog "Gif Magic found at: " + n
            framecount=framecount+1
        EndIf
        EndIf
        EndIf
   
    Next

    FreeBank fbank

    thegif=OpenMovie(fname$)

    animPic=CreateImage(MovieWidth(thegif),MovieHeight(thegif),framecount)

    SetBuffer BackBuffer()
   
    count=0
    While MoviePlaying(thegif) And count<framecount
        DrawMovie thegif,0,0   
        GrabImage animPic,0,0,count
        count=count+1
    Wend

    CloseMovie thegif
   
    Cls
    Flip

    ; store framecount in global variable
    gifframecount=framecount

    Return animPic

End Function

ВОПРОС : как узнать scancode нужной мне клавиши?
ОТВЕТ: нужно нажать на кнопку ввиде домика на главной панели и вы попадете на главную страницу helpa , далее жмем Command Reference . Теперь на панели слева будут надписи Scancodes и Scancodes picker. Нажав на первую надпись вы попадете на страницу где бедет записаны все сканкоды клавиш в виде " Key - scancode". Нажав на другой надписи перед вами появится изображение клавиатуры. Нажав на нужную вам клавишу в верхнем поле с надписью Scan Code появится число, которое и является сканкодом выбранной клавиши.

ВОПРОС : как узнать сколько треугольников в текущем фрейме?
ОТВЕТ:для этого есть команда TrisRendered(), которая возвращает число треугольников попавших в камеру. Посмотреть можно так: Text 10,10,trisRendered()


ВОПРОС : что делать если мне надо в типе сделать массив, например для элемета patrons?
ОТВЕТ: Для этого просто впишите следующую строку в тип :
Field patrons[100]
Теперь обращатся к этому массиву можно так:
указатель\patrons[13] = zaklinit_pistolet()

ВОПРОС : У меня есть переменная. Она у меня должна вызываться в разных функциях, но этого не происходит.В чем может быть проблема?
ОТВЕТ: Раз у вас переменная вызывается в разных функциях, то ее нужно обзывать как глобальную, тогда она будет доступна в любой части кода. Обзывать ее можно перед главным циклом, сразу после инициализации графики( после строчки graphics....), вот так:
global имя_переменной

dimanche13 28.08.2007 15:02

Re: FAQ по B3D
 
2H@NON OpenMovie - function not found

IGR 28.08.2007 15:11

Re: FAQ по B3D
 
Цитата:

OpenMovie - function not found
она у тебя подсвечевается в редакторе ?? (т.е. єто блицовская функция)


Часовой пояс GMT +4, время: 03:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot