forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Смена локаций (http://forum.boolean.name/showthread.php?t=4566)

Crystal 25.09.2007 08:28

Смена локаций
 
Допустим у меня есть 2 функции. Каждая создаёт свою камеру свой свет свою плоскость. Тобиш 2 функции это 1 и 2 локации. Есть у меня например переменная location изменяя которую я заставляю работать функции. например если переменная равна одному работает первая функция, если двум то работает вторая.
А вот суть вопроса.
Например заработала у меня эта первая функция создались в ней камера свет плоскоать, и я вдруг меняю переменную функция перестаёт работать включается другая функция где грузятся новые камера свет плоскость.
Вопрос в том если я перестал выполнять первую функцию исчезнут ли объяекты которые она создавала? тобиш камера свет плоскость первой локации. Или мне их придётся при смене переменной удалять командой фри ентити?

jimon 25.09.2007 08:38

Re: Смена локаций
 
прийдется удалять ручками
у тебя же в памяти хранятся только ссылки на обьекты (указатели)
поетому даже если ты их затрешь то из памяти они никуда не денутся

Crystal 25.09.2007 08:54

Re: Смена локаций
 
Посмотри так пойдёт? Вроди всё работает как надо на Q грузится первая локация, на W вторая локация. Ток чёто медленно грузится почемуто.

Код:

;--------------------------------------------------------------------------------------- WORLD:
Graphics3D 1024, 768, 32
SetBuffer BackBuffer()
HidePointer

Global Location=0
Global Camera1
Global Svet
Global Ploskost
Global Zemla
Global Camera2
Global Svet2
Global Ploskost2
Global Zemla2

Function Location1()
Camera1 = CreateCamera()
PositionEntity Camera1,0,20,0
RotateEntity Camera1, 0, 0, 0
CameraRange Camera1,0.01,100000000

Svet = CreateLight()
TurnEntity Svet,30,20,0

Ploskost= CreatePlane()
Zemla=LoadTexture("Data\textures\15820652.jpg")
ScaleTexture Zemla,150,150
EntityTexture Ploskost,Zemla
End Function

Function Location2()
Camera2 = CreateCamera()
PositionEntity Camera2,0,20,0
RotateEntity Camera2, 0, 0, 0
CameraRange Camera2,0.01,100000000

Svet2 = CreateLight()
TurnEntity Svet2,30,20,0

Ploskost2= CreatePlane()
Zemla2=LoadTexture("Data\textures\SAND.JPG")
ScaleTexture Zemla2,150,150
EntityTexture Ploskost2,Zemla2
End Function

While Not KeyDown(1)

If KeyHit(16) Then Location=1
If Location=1 Then
Location1()
End If

If KeyHit(17) Then
Location=2
End If

If Location=<1>1 Then
FreeEntity Camera1
FreeEntity Svet
FreeEntity Ploskost
FreeEntity Zemla
End If

If Location=<2>2 Then
FreeEntity Camera2
FreeEntity Svet2
FreeEntity Ploskost2
FreeEntity Zemla2
End If

If Location=2 Then
Location2()
End If

UpdateWorld

RenderWorld

Flip

Wend

End


jimon 25.09.2007 08:59

Re: Смена локаций
 
oiiii
zdelay prosto cthobi bilo :
Код:

function CreateLocation1()
...
end function
function FreeLocation1()
...
end function

;)

ps. ya v fluxbox v linux'e , tut poka russkogo netu :)

Crystal 25.09.2007 09:08

Re: Смена локаций
 
Чёт я смысла непонял. ты имееш ввиду так? :

Код:

function CreateLocation1()
Camera1 = CreateCamera()
PositionEntity Camera1,0,20,0
RotateEntity Camera1, 0, 0, 0
CameraRange Camera1,0.01,100000000
Svet = CreateLight()
TurnEntity Svet,30,20,0
Ploskost= CreatePlane()
Zemla=LoadTexture("Data\textures\15820652.jpg")
ScaleTexture Zemla,150,150
EntityTexture Ploskost,Zemla
end function

function FreeLocation1()
FreeEntity Camera1
FreeEntity Svet
FreeEntity Ploskost
FreeEntity Zemla
end function

While Not KeyDown(1)

If Location=<1>1 Then
FreeLocation1()
End If

Зачем удаление в функцию пихать? Так работать быстрее будет?

Damp 25.09.2007 09:16

Re: Смена локаций
 
Кажется не совсем пойдет...
Походу какмера у тебя оздается в цикле и есть возможность создавать одну и ту же много раз.
Сколько раз нажмешь KeyHit(16) столько камер будет...
Эти инициализации имхо лучше делать перед циклом образно говоря типа так:

InitGraphicMode
InitGlobalVar&Constant

.start
Select level
Case 1
InitCamera1
CreateWorld1
Case 2
InitCamera2
CreateWorld1
...
End Select

цикл
While Not KeyDown(1)

if KeyHit(16)
level=level+1;на следующий левел
free_all_world; там прописать убой всех энтити, света и камеры
Goto start
End If
...

Crystal 25.09.2007 09:18

Re: Смена локаций
 
Чёто я загрузив мир вообще долговато не могу закрыть окно программы.
Моя система с 3 поста случаем не плодит триллион миров??? Вроди ток по 1 каждого элемента загрузиться должно.

Crystal 25.09.2007 09:25

Re: Смена локаций
 
Цитата:

Сообщение от Damp
Кажется не совсем пойдет...
Походу какмера у тебя оздается в цикле и есть возможность создавать одну и ту же много раз.
Сколько раз нажмешь KeyHit(16) столько камер будет...
Эти инициализации имхо лучше делать перед циклом образно говоря типа так:

InitGraphicMode
InitGlobalVar&Constant

.start
Select level
Case 1
InitCamera1
CreateWorld1
Case 2
InitCamera2
CreateWorld1
...
End Select

цикл
While Not KeyDown(1)

if KeyHit(16)
level=level+1;на следующий левел
free_all_world; там прописать убой всех энтити, света и камеры
Goto start
End If
...

Хз. Если я W нажму второй раз переменная же всё равно равная 1 останется. Да а может и создастся второй мирок с второй камерой. Но я же в игре не буду себе локации грузить клавишами )
Я пока примерную систему загрузки уровней делаю, а дальше будет грузиться новая локация при коллизии юзера с концом локации, а старая сразуже удаляться. Там я уже не смогу второй раз проколлизиться ибо буду уже во второй локации.

Damp 25.09.2007 09:27

Re: Смена локаций
 
:) так не ставь создание мира в цикл.

Crystal 25.09.2007 09:36

Re: Смена локаций
 
Я не понял что значит не ставить создание мира в цикл.
Ты мне скопируй с моего кода то что я не должен ставить и скажи куда недолжен и почему?

Damp 25.09.2007 09:51

Re: Смена локаций
 
Функции Location1, Location2 лучше вызывать ДО While Not KeyDown(1) (тоесть цикла).
Можно еще посоветовать юзать стандартную функцию FreeWorld , почитай в хэлпе она облегчит удаление.
---
Незнаю поможет ли, там есть смена локации (какраз с Goto), но пример не самый простой.
http://damp.ucoz.ru/GAME.rar - 500Кб

Crystal 25.09.2007 09:56

Re: Смена локаций
 
Если я

Код:

If KeyHit(16) Then Location=1
If Location=1 Then
Location1()
End If

If KeyHit(17) Then Location=2
If Location=2 Then
Location2()
End If

пропишу до While Not KeyDown(1)
то у меня нихрена работать не будет

А вот шо есть Goto понятия не имею ) Свою же систему загрузки делаю.

HolyDel 25.09.2007 10:01

Re: Смена локаций
 
эк, Вы, батенька жжоте.
Код:

If Location=<1>1 Then ....
If Location=<2>2 Then .....

сие что означает, сэр?
а всего лиеш это
if location <=(2>2)
или
if location<=(false)
оно же
if location<=(0)

собсно с еденицетй таже проблема.
ЗЫ. Чо то ненравится мне твоя идея, Crystal, таким макаром грузить локации. Имхо надо выделить общую часть (камера, свет, скайбокс, оружие, враги, деревья) / которые ниезменны от уровня к уровню и нетрогать при загрузке локации их вообще.
а в ф-ию передавать параметр, например LoadLocation(2)
а в самой функции уже парсить это select - ом и загружать локацию в зависимости от значения.

Crystal 25.09.2007 10:11

Re: Смена локаций
 
Цитата:

эк, Вы, батенька жжоте.
Гы )
Да хрен его знает я решил что смогу обозначить этим то что если переменная меньше или больше единици то удаляем мир нахрен.

Цитата:

ЗЫ.
Так в новой локации новые мобы новые деревья.
Я вообще хочу в новой локации и юзера по новой создать, а всякое барахло что юзер с собой таскает всё равно в переменных храниться будет.

HolyDel 25.09.2007 10:14

Re: Смена локаций
 
значит так if variable<>1 надо

Crystal 25.09.2007 10:31

Re: Смена локаций
 
Незнаю правильно ли сделал

Код:

If Location<>1 Then
FreeEntity Camera1
FreeEntity Svet
FreeEntity Ploskost
FreeEntity Zemla
End If

If Location<>2 Then
FreeEntity Camera2
FreeEntity Svet2
FreeEntity Ploskost2
FreeEntity Zemla2
End If

Но теперь когда переменная Location равняется двум - вылазиет ошибка
пишет что нету такого обьекта Camera1 которая была гружена функцией которая в свою очередь работает при переменной Location равной одному.

В итоге я думаю что етот чёртов If Location<>1 Then удалил объекты и сразуже хочет их сново удалить, а раз удалять уже нечего то ругается насчёт этого....

Мде... С этой загрузкой локаций придётся покапаться дольше чем я думал...

Crystal 25.09.2007 11:25

Re: Смена локаций
 
Фуф понял чё тормозило, и вправду миры клонировало.
Сделал пока тупую простенькую системку а потом переделаю )

Код:

Global Camera1
Global Svet1
Global Ploskost1

Global Camera2
Global Svet2
Global Ploskost2

Global Camera3
Global Svet3
Global Ploskost3


Function Location1()
Camera1 = CreateCamera()
PositionEntity Camera1,0,20,0
RotateEntity Camera1, 0, 0, 0
CameraRange Camera1,0.01,100000000

Svet1 = CreateLight()
TurnEntity Svet1,30,20,0

Ploskost1= CreatePlane()
Zemla1=LoadTexture("Data\textures\15820652.jpg")
ScaleTexture Zemla1,150,150
EntityTexture Ploskost1,Zemla1
End Function

Function Location2()
Camera2 = CreateCamera()
PositionEntity Camera2,0,20,0
RotateEntity Camera2, 0, 0, 0
CameraRange Camera2,0.01,100000000

Svet2 = CreateLight()
TurnEntity Svet2,30,20,0

Ploskost2= CreatePlane()
Zemla2=LoadTexture("Data\textures\SAND.JPG")
ScaleTexture Zemla2,150,150
EntityTexture Ploskost2,Zemla2
End Function

Function Location3()
Camera3 = CreateCamera()
PositionEntity Camera3,0,20,0
RotateEntity Camera3, 0, 0, 0
CameraRange Camera3,0.01,100000000

Svet3 = CreateLight()
TurnEntity Svet3,30,20,0

Ploskost3= CreatePlane()
Zemla3=LoadTexture("Data\textures\TEX37.BMP")
ScaleTexture Zemla3,150,150
EntityTexture Ploskost3,Zemla3
End Function

While Not KeyDown(1)

If KeyHit(16) Then
Location1()
End If

If KeyHit(17) Then
FreeEntity Camera1
FreeEntity Svet1
FreeEntity Ploskost1
Location2()
End If

If KeyHit(18) Then
FreeEntity Camera2
FreeEntity Svet2
FreeEntity Ploskost2
Location3()
End If

If KeyHit(19) Then
FreeEntity Camera3
FreeEntity Svet3
FreeEntity Ploskost3
Location1()
End If


Тут вроди пока кажется системка не очень. Но все If KeyHit будут заменены на коллизию. В зависимости в какой локации юзер и с переходом в какую локацию коллизится то, и будет удаляться данная локация и грузиться нужная.
Ток тут получится что все мобы заново создадутся и все валяющиеся предметы, но если их хранить в переменных отдельно в глобале то если убиты или подняты не загрузятся. Вроди норм система локаций получается.
Системка то простая и работать будет замечательно.

Но эт всё моя теория. Мож я и не прав.

IGR 25.09.2007 11:40

Re: Смена локаций
 
у тебя в цикле переменная была равна 1 и по этому всё время когда она была равна 1 создавался новай мир (и это каждый цикл) !!

Crystal 25.09.2007 11:47

Re: Смена локаций
 
Да конечно я это понял. Функция создания работала непрерывно. А щас я ток 1 раз вызываю.

Crystal 25.09.2007 12:49

Re: Смена локаций
 
Щас делаю пробную версию смены локаций.
Подскажите как скай бокс удалить? FreeEntity не удаляет нифига!

IGR 25.09.2007 12:51

Re: Смена локаций
 
если он один для обоих локаций, то ненадо его удалять !!

Crystal 25.09.2007 13:17

Re: Смена локаций
 
Он для одной локации, в новой новый скай бокс.

Crystal 25.09.2007 13:29

Re: Смена локаций
 
Так как удалить чёртов бокс? ФриЕнтити его не берёт!!!
Щас доделаю тестовую версию смены локаций по моей системе и выложу сюда ехе на скачивание. Там будет виден баг из-за не возможности мною удалить скай бокс от перемещения с локаций туда сюда боксы перепутываются нахрен.

Damp 25.09.2007 13:30

Re: Смена локаций
 
Наверно ты его составлял из трианглов типа m=CreateMesh итд
Если да то удалять надо FreeEntity m
Goto start - это переход на строку .start , посути как начать прогу заново (так выходить из цикла конечно не красиво, но если локаций меньше... 10000-100000 штук :) то стак оверфлоу не выскочит)
И всетаки не создавай мир в цикле, чтоб небыло даж намека на ошибку.

Crystal 25.09.2007 13:34

Re: Смена локаций
 
Гы во я гоню
всё удаляется
просто в глобал забыл прописать боксы )

ещё 5 мин и демка закончена )

IGR 25.09.2007 13:36

Re: Смена локаций
 
не удаляй !!
перемести его и поменяй брашы т.е. текстуры которые на него натянуты !! и будет тебе новый скай-бокс !!

Crystal 25.09.2007 13:56

Re: Смена локаций
 
Хе. А если размеры второго бокса должны быть меньше первого.
Уж проще удалить всё к чёртовой матери и создать новое.

Так через 40% загрузки выложу свою демку

IGR 25.09.2007 14:00

Re: Смена локаций
 
scaleentity старыйбокс, 0.1,0.1,0.1 и получиш размеры нового !! :)
не удаляй, поскольку скайбокс это не цельный entity, ты его командой freeentity не удалиш, а удалять каждий триангл это хуже чем поменять размер бокса !!

Crystal 25.09.2007 14:03

Re: Смена локаций
 
Короче вот ссылка на скачивание:
http://ifolder.ru/3478416
3 с чемто метра (медиа весомая)

Вопщем запустите файл вылезет чёрный экран с разрешением 1024-768
Почему чёрный? Дык ведь ни мира ни вас нет! Его надо сотварить!
Тварим нажав кнопку Q (ток я вас прошу ради бога не жмите её второй раз. иначе вылезет параллельный мир с вашим клоном)

Далее видем корабль и планету. Летим к планете.
Ах да как лететь? Тыкая клавишу W увеличиваем скорость тыкая S понижаем. A D крен корабля. Стрелки вниз и вверх это лететь вверх и вниз. Стрелки влево вправо лететь влево вправо. Ещё рулить мышкой можно но тут кому как нравится.
Вопщем летим на планету и залетаем в неё. Если надо вернуться в космос летим в небо.
Вопщем помоему получилась неплохая система смены локаций по моему методу.
Тестируйте )

Crystal 25.09.2007 14:04

Re: Смена локаций
 
Цитата:

Сообщение от IGR
scaleentity старыйбокс, 0.1,0.1,0.1 и получиш размеры нового !! :)
не удаляй, поскольку скайбокс это не цельный entity, ты его командой freeentity не удалиш, а удалять каждий триангл это хуже чем поменять размер бокса !!

Да уже испытал. удаляется он фриентити.

IGR 25.09.2007 14:14

Re: Смена локаций
 
Цитата:

Да уже испытал. удаляется он фриентити.
ну и в чем проблема ?? юзай тогда !! но я бы на твоем месте не удалял !! :)

Crystal 25.09.2007 14:17

Дак юзаю уж давно )
Яж выше говорил, просто забыл в глобал прописать боксы.
А так как тут у меня боксы в функциях а функции вызываются переменными без глобала никак.

Ну чё мож найдётся тестер?
Хочу узнать насколько у вас быстро локация меняется, и не нашли ли вы багов?

HolyDel 25.09.2007 23:26

Re: Смена локаций
 
вы смеетесь господа?
зачем вообще менять размер скайбокса? разве что то изменится?
кто сказал что freeentity не удалит весь скайбокс?

Crystal 26.09.2007 01:34

Re: Смена локаций
 
Фри ентити удаляется свободно )

Мне вот проще удалить бокс, а в новой локации создать новый с новыми текстурами.
А в некоторых локациях он вообще может быть не нужен.

А вот чем больше локация, тем больше должен быть бокс (чтобы не видно было квадратность)


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

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