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)

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, хочешь сказать что я практикую этот "стиль" кодинга? Ы! Ни в одной моей толковой наработке нету чужых строк. А это я для рекламы, т.к. многие прежде чем задать глупый вопрос не ходят по таким ссылкам, где почитать код нуна чтобы понять, вот и всё ;) а для меня то что по той ссылке, только поднимает интузиазм :)


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

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