Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 25.08.2007, 12:40   #1
avel
Бывалый
 
Аватар для avel
 
Регистрация: 11.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Хорошо FAQ по B3D

полазев по форуму, и обнаружив, что у новичков возникают в основном одни и теже вопросы, решил вот написать FAQ по Blitz3D, дабы люди не засоряли форум постами из-за одного простенького вопроса, а нашли все нужное здесь. все мы когда-то были зелеными новичками и не знали как сделать то или иное...
я не считаю себя таким уж профессионалом в Blitz3D, я тоже продолжаю учиться и узнавать много нового про этот замечательный язык, но, думаю я вполне достиг того уровня, когда могу ответить людям на их вопросы.
все материалы и вопросы взяты с форума и головы автора. большинство из приведенных здесь функций написаны либо мной либо взяты из стандартных хелпов блица, которые к сожалению не все могут читать...
если у вас возникают вопросы, то пишите их сюда, только в краткой форме. время от времени я буду на них отвечать, когда наберется побольше.
а пока, вот:
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Yalenz (02.03.2009)
Старый 25.08.2007, 12:47   #2
avel
Бывалый
 
Аватар для avel
 
Регистрация: 11.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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Yalenz (02.03.2009)
Старый 25.08.2007, 12:48   #3
avel
Бывалый
 
Аватар для avel
 
Регистрация: 11.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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Yalenz (02.03.2009)
Старый 25.08.2007, 12:50   #4
avel
Бывалый
 
Аватар для avel
 
Регистрация: 11.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 за это полезное сообщение:
indri (05.06.2009), Yalenz (02.03.2009)
Старый 25.08.2007, 12:52   #5
avel
Бывалый
 
Аватар для avel
 
Регистрация: 11.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 за это полезное сообщение:
indri (05.06.2009), Yalenz (02.03.2009), Ziro(AL) (26.12.2009)
Старый 25.08.2007, 13:15   #6
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 772 пользователей)
Re: FAQ по B3D

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

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

Остальное еще не прочитал...
(Offline)
 
Ответить с цитированием
Старый 26.08.2007, 16:26   #7
ZanoZa
Элита
 
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 131 полезных сообщений
(для 251 пользователей)
Re: FAQ по B3D

малаца! надо тока чтобы тему сразу видно было.
(Offline)
 
Ответить с цитированием
Старый 26.08.2007, 16:51   #8
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,702
Написано 295 полезных сообщений
(для 562 пользователей)
Re: FAQ по B3D

Р-Е-С-П-Е-К-Т-!!!
(Offline)
 
Ответить с цитированием
Старый 26.08.2007, 20:56   #9
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,425
Написано 3,451 полезных сообщений
(для 6,852 пользователей)
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, 09:59   #10
Horror
Бывалый
 
Регистрация: 09.09.2006
Сообщений: 656
Написано 53 полезных сообщений
(для 109 пользователей)
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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Yalenz (02.03.2009)
Старый 27.08.2007, 15:57   #11
avel
Бывалый
 
Аватар для avel
 
Регистрация: 11.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Re: FAQ по B3D

все исправления и предложения принимаются. если я где-то что-то не совсем корректно описал, то прошу прощенья, возможно для новичков и впрямь не все так понятно... но за счет ваших поправок они думаю разберуться. а самим новичкам еще раз напомню, что они могут писать сюда свои вопросы и я время от времени буду на них отвечать.
(Offline)
 
Ответить с цитированием
Старый 27.08.2007, 19:07   #12
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Re: FAQ по B3D

прикольно, теперь соберите все это вместе, добавьте еще че-нить создайте отдельную тему и сразу ее закройте (чтоб мусором не засоряли)
(Offline)
 
Ответить с цитированием
Старый 28.08.2007, 10:41   #13
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 772 пользователей)
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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Yalenz (02.03.2009)
Старый 28.08.2007, 11:02   #14
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: FAQ по B3D

2H@NON OpenMovie - function not found
(Offline)
 
Ответить с цитированием
Старый 28.08.2007, 11:11   #15
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,012 пользователей)
Re: FAQ по B3D

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 15:20.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com