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
она у тебя подсвечевается в редакторе ?? (т.е. єто блицовская функция)

dimanche13 28.08.2007 15:49

Re: FAQ по B3D
 
нет не подсвечивается

H@NON 28.08.2007 16:11

Re: FAQ по B3D
 
ВОПРОС : подскажите, как бы мне сделать небо в моей игре?
ОТВЕТ: есть разные способы:
1) Можно просто создать плоскость(CreatePlane()) , натянуть на него текстуру и поднять на уровень облаков. Но такой способ предпочтителен лишь когда у вас камера направлена вверх, потому что по бокам неба просто не будет, так как это плоскость.
2) Можно создать сферу(CreateSphere()) , и так же натянуть на нее текстуру. только Сфера ,внутри которой мы будем находится не будет видна, потому что изначально объекты видны лишь с внешней стороны, но это можно исправить либо флипнув меш и тем самым у нас поменяются внешняя с внутренней стороной местами(FlipMesh меш), либо поставив, если нужно чтоб меш был виден с обоих сторон, флаг 16 (EntityFX меш, 16). Теперь надо привязать наше небо к камере, потому что иначе игрок может спокойно пересечь границу неба и увидеть что это всего-лишь объект с текстурой(а нам ведь нужно чтоб было как можно реалистичнее), или в таком случае нужно заранее отмасштабировать объект небо так чтоб игрок не смог этого сделать. А привязать небо к камере нам поможет следующий код:
Код:

    dxsky#=EntityX( camera,True )-EntityX( sky )
    dysky#=EntityY(camera,True )-EntityY( sky )
    dzsky#=EntityZ( camera,True )-EntityZ( sky )
    TranslateEntity sky,dxsky,dysky,dzsky
или такой:
Positionentity sky, EntityX(camera), EntityY(camera), EntityZ(camera)
что в принципе равноценно


просто вставьте этот код в главный цикл. Естественно, замените навзания camera и sky на ваши.
3)Этот способ самый распространненый.
Код:

Function MakeSkyBox()

    m1=CreateMesh()
    ;передняя сторона
    b1=LoadBrush( "tex\sky_FR.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,+1,-1,0,0:AddVertex s1,+1,+1,-1,1,0
    AddVertex s1,+1,-1,-1,1,1:AddVertex s1,-1,-1,-1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;правая сторона
    b1=LoadBrush( "tex\sky_LF.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,+1,+1,-1,0,0:AddVertex s1,+1,+1,+1,1,0
    AddVertex s1,+1,-1,+1,1,1:AddVertex s1,+1,-1,-1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;задняя сторона
    b1=LoadBrush( "tex\sky_BK.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,+1,+1,+1,0,0:AddVertex s1,-1,+1,+1,1,0
    AddVertex s1,-1,-1,+1,1,1:AddVertex s1,+1,-1,+1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;левая сторона
    b1=LoadBrush( "tex\sky_RT.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,+1,+1,0,0:AddVertex s1,-1,+1,-1,1,0
    AddVertex s1,-1,-1,-1,1,1:AddVertex s1,-1,-1,+1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;верхняя сторона
    b1=LoadBrush( "tex\sky_UP.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,+1,+1,0,1:AddVertex s1,+1,+1,+1,0,0
    AddVertex s1,+1,+1,-1,1,0:AddVertex s1,-1,+1,-1,1,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
;нижняя сторона 
    b1=LoadBrush("tex\sky_DN.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,-1,-1,1,0:AddVertex s1,+1,-1,-1,1,1
    AddVertex s1,+1,-1,+1,0,1:AddVertex s1,-1,-1,+1,0,0
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1


    ScaleMesh m1,500,600,500
    FlipMesh m1
    EntityFX m1,9
    EntityOrder m1,10
    Return m1
   
End Function

Эта функция, которая создает коробку с натянутой на нее 6 текстур(вверх, низ, право, лево, перед, зад).Это и есть наше небо. В строках LoadBrush идет загрузка текстур. Впишите туда свой путь и имя файла с расширением . Теперь просто вставьте эту функцию в ваш код(не в главный цикл) и вызывайте ее вот так к примеру: sky = MakeSkyBox() .

IGR 28.08.2007 16:12

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

нет не подсвечивается
какая версия Блица ??

moka 28.08.2007 17:05

Re: FAQ по B3D
 
H@NON, это же не фак, а мини туторы у тебя ;) Тут речь Совсем о нюбаях, и лучше хлебом не кормить, а дать начальные знания, а дальше пусть сам, чтобы опыт Сам набирал, а не копи-пастеров ростить очередных.

moka 28.08.2007 17:12

Re: FAQ по B3D
 
IGR, ну это не меняет сути. Факт что он сам не додумался до этого т.к. ему дали уже готовый код.

johnk 28.08.2007 18:03

Re: FAQ по B3D
 
H@NON, Респект! Продолжай Дальше!

H@NON 28.08.2007 18:37

Re: FAQ по B3D
 
To Мока:
Ну какой же это копи/паст?ведь я привел функцию создания неба, которой многие пользуются, в том числе и я. Зачем нам очередной велосипед? А остальное я в виде описания сделал, че да как.

IGR 28.08.2007 18:41

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

H@NON 28.08.2007 18:54

Re: FAQ по B3D
 
Надо просто хорошенько раздел FAQ прорекламировать. Лучше сделать ее заглавной страницей.

MiXaeL 28.08.2007 22:02

Re: FAQ по B3D
 
ВОПРОС : Как открыть уже существующий файл и записать в его конец информацию (сам долго думал)
ОТВЕТ:
Файл можно открыть командой OpenFile. Действительно, при открытии файла позиция записи устанавливается в его начало. Устранить это можно двумя способами. Ламерским: сначала считать из файла всю потом записать с учетом новой инфы (можно, кстати, и так:
While not(eof(Your_File))
Readline$ your_File
Wend

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

Или простым (как обычно, все гениальное просто), вот так:

Код:

filename$="имя_вашего_файла"
file=openfile(filename$)
seekfile filе,filesize(filename$)

И все.

avel 30.08.2007 12:30

Re: FAQ по B3D
 
2Moka&JohnK предлагаю вам вынести ваши "разборки" за рамки поста, дабы не засорять его. лично я уважаю вас обоих и не понимаю чего вы спорите. что же касается моего мнения, то если у опытных людей возникает желание писать сюда свои дополнения и замечания, то я только рад. по поводу размера сообщений, конечно они должны быть небольшими, однако приведение готовых функций и участков кода вполне допустимо. даже в профессиональных FAQ имеются специальные разделы с расширенными ответами и по собственному опыту, скажу, что они бывают весьма полезны.
2всем было предложение закрыть тему, но она пополняется ценной инфой и новички, как я уже писал выше, могут писать сюда свои вопросы, поэтому закрывать ее, думаю нестоит. поэтому прошу всех не флудить и не забивать пост пустой болтовней.
по поводу того, чтобы тему "было видно" я обращусь к администрации.
по поводу собирания материала в одном месте, можно сделать архивчик со всеми вопросами\ответами и поместить его сюда.

avel 30.08.2007 14:13

Re: FAQ по B3D
 
вот еще немного полезной информации:

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

вопрос: как сделать, чтобы скорость движения объекта набиралась\сбавлялась постепенно?
ответ: для этого нужно ввести переменную, например speed# и прописать в главном цикле:
Код:

if KeyDown(клавиша_увеличения_скорости) then
        if speed#>=верхнее_ограничение_скорости then
                speed#=верхнее_ограничение_скорости
        else
                speed#=speed#+0.03
        endif
endif
if KeyDown(клавиша_уменьшения_скорости) then
        if speed#<=нижнее_ограничение_скорости then
                speed#=нижнее_ограничение_скорости
        else
                speed#=speed#-0.03
        endif
endif

вопрос: как сделать, чтобы скорость постепенно сбрасывалась автоматически?
ответ: смотри вопрос выше + добавь строчку: speed#=speed#*0.99
0.99 - это скорость сбрасывания скорости, чем она ближе к единице, тем медленнее будет этот процесс.

вопрос: при использовании команды Animate объект начинает двигаться ни тогда, когда нажата клавиша, а когда она отпускается. почему?
ответ: когда ты пишешь в главном цикле if KeyDown(...) Animate ... блиц запускает эту команду постоянно, когда ты нажимаешь клавишу, а надо ее запустить один раз. решение: используй KeyHit(), либо введи переменну-флаг. примерно так:
Код:

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

вопрос: как работать с колесиком мыши?
ответ: используй функции MouseZ и MouseZSpeed

moka 30.08.2007 14:44

Re: FAQ по B3D
 
Код:

if KeyDown(клавиша_увеличения_скорости) then
        speed#=speed#+0.03
        if speed#>=верхнее_ограничение_скорости then speed#=верхнее_ограничение_скорости
endif
if KeyDown(клавиша_уменьшения_скорости) then
        speed#=speed#-0.03
        if speed#<=нижнее_ограничение_скорости then speed#=нижнее_ограничение_скорости
endif

Так меньше букаф и смысловой нагрузки и более коррекстно.

NitE 30.08.2007 16:57

Re: FAQ по B3D
 
классны фак, всем спасибо - для себя очень много нового узнал )) 2MoKa, я-бы с твоей подписью промолчал-бы про копи/паст...

moka 30.08.2007 17:13

Re: FAQ по B3D
 
NitE, хочешь сказать что я практикую этот "стиль" кодинга? Ы! Ни в одной моей толковой наработке нету чужых строк. А это я для рекламы, т.к. многие прежде чем задать глупый вопрос не ходят по таким ссылкам, где почитать код нуна чтобы понять, вот и всё ;) а для меня то что по той ссылке, только поднимает интузиазм :)

avel 30.08.2007 20:05

Re: FAQ по B3D
 
вот еще кое-что из совсем элементарного:

вопрос: как изменить размеры текстуры?
ответ: использовать команду ScaleTexture
не забывайте, что ее надо прописывать перед командой EntityTexture.

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

вопрос: как загрузить спрайт, чтобы он не был полупрозрачным?
ответ: при загрузке спрайта нужно поставить флаг 4:
spr=LoadSprite("...",4)

вопрос: как определить порядок видимости объектов?
ответ: используй команду EntityOrder

вопрос: что делает команда EntityFX ?
ответ: она отвечает за различные визуальные эффукты в основном связанные с освещением.

вопрос: как поворачивать спрайт?
ответ: вот так: RotateSprite спрайт, угол

avel 03.10.2007 01:30

Re: FAQ по B3D
 
Вложений: 2
вот, сбросил все в архивчик и отредактировал слегка.
берите, пользуйтесь.Вложение 4803

LUK 06.10.2007 17:59

Re: FAQ по B3D
 
"нет не подсвечивается"
Это значит, что скорей всего у тебя достаточно старая версия Blitz (или крайне урезанная).
Сейчас (06.10.2007) самая последняя версия, которая мне встретилась и которую я пользую - 1.98.
Вообще встречал еще такой глюк. Дело было так: я писал гульку с другом. Я писал на 1.98, у него была еще 1.96 вроде-бы. И когда я прислал ему свою новонаписанную функцию - у него она незаработала! Там были вечные ошибки с подгрузкой мешей. Но после установки очередного обновления все заработало... так что советую пользовать самые последние версии, которые сможете найти...

avel 07.10.2007 01:37

Re: FAQ по B3D
 

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

HolyDel 07.10.2007 01:45

Re: FAQ по B3D
 
вопрос: как изменить размеры текстуры?
ответ: использовать команду ScaleTexture
не забывайте, что ее надо прописывать перед командой EntityTexture.

неправильный ответ, садись, два.

Leito 07.10.2007 01:59

Re: FAQ по B3D
 
вопрос: как переместить объект?
ответ: Moveentity lol,1,0,0

jimon 07.10.2007 11:32

Re: FAQ по B3D
 

Leito
MoveEntity - ето двигать обьект
PositionEntity - ето задать позицию обьекту
что собсно имеет большую разницу

avel 08.10.2007 00:22

Re: FAQ по B3D
 
2Leito давай не будем доходить до абсурда. с этим думаю народ и сам разберется.

HolyDel 08.10.2007 00:30

Re: FAQ по B3D
 
я имею ввиду, что без разницы, до, или посел EntityTexture, проводить манипуляции с текстурой. Потомучто EntityTexture всеголишь указывает что етот объект должен текстуриться такой то текстурой.

LUK 08.10.2007 03:01

Re: FAQ по B3D
 
To AVEL. Э-э-э. Не надо на меня оффтопить! Я всю тему просмотрел. Единственное, что было отвечено на данный вопрос это был встречный вопрос от IGOR:
"какая версия Блица ??"
И все! Так что все правильно я сделал! Единственное в чем меня можно обвинить - это в том, что свой пост я оформил достаточно по-ламерски и все!
P.S. Правильно Люк, а не лук!
P.P.S. Выше исправлю свое "ламерство".

LUK 08.10.2007 04:11

Вопрос: Как изменить иконку (пиктограмму) у *.exe – файла, созданного в Blitz3D?
Ответ: Нужно воспользоваться редактором ресурсов exe-шника, например, ResHack’ером, XNResourceEditor’ом или Restorator’ом. В ResHacker это делается так: Action->Replace Icon…->Open with new icon…->Replace. Скачать ResHacker можно здесь:
http://boolean.name/archive/files/reshack.rar

Вопрос: У меня не подсвечивается/неправильно работает/не работает стандартная функция в Blitz3D. Что делать?
Ответ: Попробуйте обновить свою версию Blitz3D, до максимально новой. ( На 08.10.2007 - это 1.99 ).

Вопрос: Где можно скачать русскую справку к Blitz3D?
Ответ: В сети доступна для скачки справка к Blitz3D ПОЛНОСТЬЮ переведенная на русский язык, а с недавнего времени скачать ее можно БЕСПЛАТНО! Ссылка:
http://blitz-coder.narod.ru/help/help.rar
Пароль к архиву: "Blitz3D the best" (без кавычек).

Вопрос: Как можно заставить Blitz3D работать с DirectX9?
Ответ: Единственный известный мне способ использование сторонней dll-библиотеки, например, этой:
http://blitz.pp.ru/forum/showthread....&pagenumber=50

Вопрос: Как использовать сторонние библиотеки?
Ответ: Нужно просто забросить файлы нужной библиотеки в папку "userlibs" Blitz3D. Важно! У библиотеки обязательно должен быть файл Имя_Библиотеки.decls - или какой-нибудь похожий с описанием всех функций нашей библиотеки (его мы обязательно кидаем в папку "userlibs", а потом и в папку нашего проекта). Файл(ы) Имя_библиотеки.dll можно кидать и в папку "bin" Blitz3D (но не нужно забывать, так же, копировать их в папку нашего проекта, при их использовании).

IGR 08.10.2007 19:59

Re: FAQ по B3D
 
половина ответов есть в справке !!

Horror 08.10.2007 20:18

Re: FAQ по B3D
 

Цитата:

Мои проекты: Sausage1-3 (BasicKorvet), Millioner (BasicKorvet), Olen (BasicKorvet), Astro (BorlandPascal), SokoBan (BorlandPascal), SonicSokoBan (BorlandPascal), SokoBan3D (Blitz3D), Far (Blitz3D), LegendOfKyrandiaIV (Blitz3D), MobilePascal (Midlet Pascal)...


Дауж пипец списочек!
дай хоть на картинки поглядеть))


LUK 08.10.2007 21:35

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

Сообщение от MoKa
LUK, ты потдался, что тебя и унизило, не словами а делами можно только показать своё не нубайчество. Хз я нуб во многом, но я могу это признать и буду раз повысить знния в том или ином направлении. ;)

Насчёт ScaleTexture в старых версиях текса ивправду не обновлялась. В новых обновляется.

Непойму, что меня унизило? Никто меня не унижал... и вообще хватит эту тему засорять разным флудом, ненужными сообщениями и оффтопами - она совсем для другого служит!

LUK 08.10.2007 22:36

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

Сообщение от Horror



Дауж пипец списочек!
дай хоть на картинки поглядеть))


Смотри уж:
http://oldkorvet.narod.ru/1.html

Кстати, смотрите мои Чаво ниже(выше - как у вас настройки) - добавил еще немного...

LUK 09.10.2007 19:03

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

Сообщение от IGR
половина ответов есть в справке !!

А второй половины то-нет!!! Да я бы сказал, что даже большего нет! А вот эти вопросы, как я заметил там-сям проскакивают на форуме. С большинством из них я и сам когда-то сталкивался...

HolyDel 10.10.2007 01:24

Re: FAQ по B3D
 
MoKa, 1.8x корректо скалил, поворачивал, перемещал текстуру в не зависимости от места вызова соотвествующей команды.

ЗЫ. А что за странная моде пошла на удаление текстуры, нанесенной на бъект, кто нибудь объяснит мне пользу от сего действия?

tormoz 10.10.2007 05:31

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

Сообщение от HolyDel
ЗЫ. А что за странная моде пошла на удаление текстуры, нанесенной на бъект, кто нибудь объяснит мне пользу от сего действия?

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

LUK 10.10.2007 14:37

Re: FAQ по B3D
 
Оформляйте, пожалуйста, свои вопросы и ответы так:

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

moka 10.10.2007 15:10

Re: FAQ по B3D
 
LUK, Брашь не создаётся, он модифицируется.

IGR 10.10.2007 15:25

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

Освобождение памяти.
Когда текстура наносится на объект, зоздается браш с этой текстурой. Если не нужно больше совершать манипуляции с текстурой - ее нужно удалить.
Я проверял - память действительно освобождалась.
Дык может сразу не loadTexture а CreateBrush ??
и потом закрасить брашем нужный обьект ??
Как думаете ??

LUK 11.10.2007 14:03

Re: FAQ по B3D
 
Вопрос: Сделал поект, скомпилировал, попытался запустить на другом компьютере, а там ошибка: "Unable to create 3D scene". Ошибка точно ни в несовместимости разрешениий - я сделал возможность смены разрешения. Может проблема в том что я использовал include и даже 2 раза?
Ответ: Точно не из-за инклудов. Такое бывает если попытаться запустить 2 проги использующие 3д режим. Например такое может быть, если запустить твою прогу всместе с 3д-максом.

H@NON 11.10.2007 14:18

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

LUK 11.10.2007 14:31

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

avel 13.10.2007 15:16

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

Bagration 16.10.2007 21:40

Re: FAQ по B3D
 
У меня вопрос, не хотел создовать еще темы и решил написать тут.
Вообщем я создал глоб. переменную движения мыши
Global mx=MouseX()
Global my=MouseY()

потом эту же переменную использую в фунции по движению мышки
Function cursor()
HidePointer
DrawImage cursor,mxьн
MaskImage cursor,0,0,0
End Function

вставляю эту функцию в главный цикл... и не работает :''((
А вот если в этой фунции вместо mx и my поставить MouseX() и MouseY() то все работает :dontknow:
Такая же трабла с переменной нажатия кнопки мыши. :"(

dimanche13 16.10.2007 22:00

Re: FAQ по B3D
 
Bagration, все правильно что у тебя не работает. Ты глобально объявил 2 переменные присвоил им значения координат мыши. Теперь они ВСЕГДА одни и те же! А в главном цикле ты мышь двигаешь, координаты меняются, а ты используешь все те же переменные со старыми, не меняющимися координатами мыши.
Код:

mx=MouseX() ; берем новые(изменившиеся) координаты
my=MouseY()
DrawImage cursor,mx, my
MaskImage cursor,0,0,0

Кстати теперь раздел FAQ по B3D есть и в журнале. И ЛЮБОЙ МОДЖЕТ ЕГО ПОДРЕДАКТИРОВАТЬ!

avel 17.10.2007 01:21

Re: FAQ по B3D
 
2Bagration совершенно правильно поступил, что запостил свой вопрос сюда, а не стал новый пост создавать! все бы так делали! на вопрос тебе уже ответили, добавлю только, что функция твоя будет выглядеть так:
Function cursor()
mx=MouseX() ; берем новые(изменившиеся) координаты
my=MouseY()
DrawImage cursor,mx, my
MaskImage cursor,0,0,0
End Function

а команду HidePointer в цикле ставить не надо, достаточно один раз при инициализации.

H@NON 17.10.2007 09:01

Re: FAQ по B3D
 
Еще забыли о MaskImage, его тоже при инициализации картинки ставишь один раз. Ну это если тебе динамически не нужно менять цвет маски=).

moka 17.10.2007 12:59

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

Bagration 09.11.2007 21:19

Re: FAQ по B3D
 
У меня вопрос по FastImage, на счет команды RectsOverlap, пашет то она пашет, но увы коряво. Просто паловина изображение по x координате просто не проверяется... что делать? Или у FastImage есть свои способы проверки столкновения имеджов. ImageRectOverlap не пашет. Так как, как я понел тип изображений FastImage не поддерживается этой командой.
Заранее спасибо!

dimanche13 09.11.2007 21:48

Re: FAQ по B3D
 
половина... хм.. это наводит на мысль что x и y координаты- это центр имаджа.

Bagration 09.11.2007 21:52

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

Сообщение от dimanche13
половина... хм.. это наводит на мысль что x и y координаты- это центр имаджа.

То есть?
RectsOverlap(mx,my,1,1,x,y,257,47)
mx и my координаты курсора, 1,1 ширина и длина курсора, x,y коодинаты рисунка, 257,47 ширина и длина, просто с обычными имажами проблем нет, а вот FastImage... :(

H@NON 09.11.2007 22:28

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


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

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