|
FAQ Туториалы и часто задаваемые вопросы |
25.08.2007, 16:40
|
#1
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
FAQ по B3D
полазев по форуму, и обнаружив, что у новичков возникают в основном одни и теже вопросы, решил вот написать FAQ по Blitz3D, дабы люди не засоряли форум постами из-за одного простенького вопроса, а нашли все нужное здесь. все мы когда-то были зелеными новичками и не знали как сделать то или иное...
я не считаю себя таким уж профессионалом в Blitz3D, я тоже продолжаю учиться и узнавать много нового про этот замечательный язык, но, думаю я вполне достиг того уровня, когда могу ответить людям на их вопросы.
все материалы и вопросы взяты с форума и головы автора. большинство из приведенных здесь функций написаны либо мной либо взяты из стандартных хелпов блица, которые к сожалению не все могут читать...
если у вас возникают вопросы, то пишите их сюда, только в краткой форме. время от времени я буду на них отвечать, когда наберется побольше.
а пока, вот:
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2007, 16:47
|
#2
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2007, 16:48
|
#3
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2007, 16:50
|
#4
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
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 способ более гибкий, например, слегка изменив код, можно реализовать проигрывание нескольких мелодий и т. д.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо avel за это полезное сообщение:
|
|
25.08.2007, 16:52
|
#5
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
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
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо avel за это полезное сообщение:
|
|
25.08.2007, 17:15
|
#6
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Re: FAQ по B3D
н: как перевести число в целочисленный тип?
avel: Int(число)
|
Надо не забывать, что int не возводит в целое число а округляет его.
н: как изменить шаг в цикле?
avel: используй команду Step
|
Нужно уточнять ,что это за цикл, ведь есть еще repeat/forever, моэтому правильней будет так:
for m = 0 to n Step 1
...
next
Остальное еще не прочитал...
|
(Offline)
|
|
26.08.2007, 20:26
|
#7
|
Элита
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений (для 252 пользователей)
|
Re: FAQ по B3D
малаца! надо тока чтобы тему сразу видно было.
|
(Offline)
|
|
26.08.2007, 20:51
|
#8
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Re: FAQ по B3D
Р-Е-С-П-Е-К-Т-!!!
|
(Offline)
|
|
27.08.2007, 00:56
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
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 лучше оформлять так:
Вопрос:
Ответ:
|
(Offline)
|
|
27.08.2007, 13:59
|
#10
|
Бывалый
Регистрация: 09.09.2006
Сообщений: 656
Написано 54 полезных сообщений (для 110 пользователей)
|
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.08.2007, 19:57
|
#11
|
Бывалый
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений (для 452 пользователей)
|
Re: FAQ по B3D
все исправления и предложения принимаются. если я где-то что-то не совсем корректно описал, то прошу прощенья, возможно для новичков и впрямь не все так понятно... но за счет ваших поправок они думаю разберуться. а самим новичкам еще раз напомню, что они могут писать сюда свои вопросы и я время от времени буду на них отвечать.
|
(Offline)
|
|
27.08.2007, 23:07
|
#12
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Re: FAQ по B3D
прикольно, теперь соберите все это вместе, добавьте еще че-нить создайте отдельную тему и сразу ее закройте (чтоб мусором не засоряли)
|
(Offline)
|
|
28.08.2007, 14:41
|
#13
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
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 имя_переменной
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.08.2007, 15:02
|
#14
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Re: FAQ по B3D
2H@NON OpenMovie - function not found
|
(Offline)
|
|
28.08.2007, 15:11
|
#15
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Re: FAQ по B3D
OpenMovie - function not found
|
она у тебя подсвечевается в редакторе ?? (т.е. єто блицовская функция)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:43.
|