 |
3D-программирование Вопросы, касающиеся программирования 3D мира |
06.02.2012, 23:03
|
#1
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Дубликаты дверей
Я создаю двери, которые при соприкосновении с игроком должны открываться, но так как дверей дофига, отдельно прописывать каждую не получится, как мне сделать дубликаты и добиться отдельного открытия дверей?
|
(Offline)
|
|
06.02.2012, 23:55
|
#2
|
Знающий
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 113 полезных сообщений (для 167 пользователей)
|
Ответ: Дубликаты дверей
Сделай список дверей, определи им свой тип столкновения. Каждой двери задай имя из списка с помощью Handle, при столкновении с типом дверей, читай имя обьекта и передавай функции обработки дверей. С помощью Object. находишь нужную запись в списке, выполняешь действия с дверью.
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.02.2012, 15:08
|
#3
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,743
Написано 5,461 полезных сообщений (для 15,676 пользователей)
|
Ответ: Дубликаты дверей
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
07.02.2012, 15:51
|
#4
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Дубликаты дверей
Спасибо большое 
|
(Offline)
|
|
08.02.2012, 21:32
|
#5
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Дубликаты дверей
Извиняюсь, конечно, я дибил редкостный, но всё-таки я не разобрался: TYPE, вроде бы, создаёт дубликаты, но я никак не пойму, как отследить их положение, а по HANDLE и OBJECT я не нашёл нормального хэлпа, помогите, если нетрудно... 
|
(Offline)
|
|
08.02.2012, 22:12
|
#6
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Ответ: Дубликаты дверей
эм и так
допусти у нас есть тип
type players
field x
end type
создание плеера
player.players=new players
получаем хендл в пеменную
и так нам нужно получить доступ к экземпляру зная handle и присвоить перменной x значение 120
pl.players=object.players(myplayer) -pl - экземпляр созданый по хендлу myplayer
pl\x=120
конечно как мне кажется объяснил слишком коряво  но думаю поможет
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
08.02.2012, 23:33
|
#7
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,743
Написано 5,461 полезных сообщений (для 15,676 пользователей)
|
Ответ: Дубликаты дверей
как отследить их положение
|
Создать Field'ы для положения (x,y,z)
При создании новой двери писать в них координаты.
Когда понадобилось - читать оттуда координаты.
Если у твоей двери есть модель (а скорее всего так и есть) то можешь создать Field для модели, а координаты её брать через EntityX, EntityY и EntityZ.
Сложности object-handle я вообще не понял к чему тут.
Можно же хранить ссылку на объект двери тупо в переменной:
door.MyDoorType = new MyDoorType
door\MySuperField = значение
Вообще object-handle довольно редко юзается (в основном чтобы ускорить переборы списков) и не рекомендую забивать им себе голову пока не разберёшься с азами.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
09.02.2012, 01:39
|
#8
|
Нуждающийся
Регистрация: 27.08.2010
Адрес: Лен. область
Сообщений: 58
Написано 21 полезных сообщений (для 50 пользователей)
|
Ответ: Дубликаты дверей
Вот простой урок про двери и взаимодействие с ними
Но лучше конечно научиться использовать TYPE
|
(Offline)
|
|
09.02.2012, 02:01
|
#9
|
Знающий
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 113 полезных сообщений (для 167 пользователей)
|
Ответ: Дубликаты дверей
Сообщение от ABTOMAT
Сложности object-handle я вообще не понял к чему тут.
|
Вероятно моя ошибка, упустил что object-handle слабо докуметированы и для новичка не очень подходят.
как написал АВТОМАТ начну с азов.
Создадим тип для дверей
Type doors
Field ent ;здесь будем хранить ссылку на объект двери
; здесь можно еще добавить нужные поля
End Type
теперь нужно создать тип.
door.doors = New doors ;создали новую пустую запись
door\ent = <ссылка на обьект двери> ;сохраняем ссылку на дверь
так делаем с каждой дверью когда создаем их.
теперь как найти нужную запись(искать будем перебором)
;contact - допустим это ссылка на дверь с которой столкнулись
For door.doors = Each doors ;делаем цикл for для нужного типа
if door\ent = contact ;проверяем запись по ссылке
; сюда попадаем если это нужная запись
Exit ;нашли нужную запись, можно выйти из цикла
End if
Next
У этого способа есть недостаток: долгий поиск. Чем больше дверей, тем дольше.
Еще советую почитать FAQ по B3D
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
|
(Offline)
|
|
09.02.2012, 19:32
|
#10
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Дубликаты дверей
Спасибо большое, буду пробовать разбираться 
|
(Offline)
|
|
27.02.2012, 20:51
|
#11
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Дубликаты дверей
Вот, что получилось:

Graphics3D 640,480
SetBuffer BackBuffer()
Const t_player=1, t_block=2
Type doors
Field ent
End Type
player=CreateSphere()
EntityType player, t_player
cam=CreateCamera(player)
bl=CreateCube()
PositionEntity bl,0,0,5
EntityType bl, t_block
HideEntity bl
Collisions t_player, t_block,2,3
Dim AllDoors.doors(3)
For i=0 To 3
AllDoors(i) = New doors
AllDoors(i)\ent = CopyEntity(bl)
Next
PositionEntity AllDoors(0)\ent,10,0,0
PositionEntity AllDoors(1)\ent,5,0,0
PositionEntity AllDoors(2)\ent,0,0,0
PositionEntity AllDoors(3)\ent,-5,0,0
While Not KeyDown(1)
For i=0 To 3
If EntityCollided(player,t_block)
MoveEntity AllDoors(i)\ent,0,0.2,0
EndIf
Next
TurnEntity player, 0, 0 -MouseXSpeed()*0.1, 0
TurnEntity cam, MouseYSpeed()*0.1, 0, 0
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
RotateEntity cam, EntityPitch#( cam ), 0, 0
If KeyDown(17) MoveEntity player,0,0,0.5
If KeyDown(31) MoveEntity player,0,0,-0.5
If KeyDown(30) MoveEntity player,-0.5,0,0
If KeyDown(32) MoveEntity player,0.5,0,0
UpdateWorld()
RenderWorld()
Flip
Wend
End
Вот только при соприкосновении с любым блоком двигаются все...
Что не так?
|
(Offline)
|
|
27.02.2012, 23:41
|
#12
|
Разработчик
Регистрация: 06.06.2011
Адрес: Ирк. обл.
Сообщений: 543
Написано 133 полезных сообщений (для 220 пользователей)
|
Ответ: Дубликаты дверей
Ни все так просто как бы тебе казалось!
Вот те код, правда не мой, я тебе его подредактировал, чтоб ты смог разобраться! Но без коментов, думаю так поймешь!

Graphics3D 640, 480,32,2
SetBuffer BackBuffer()
Dim aCube(20)
Const TypePlayer = 1, TypeDoor = 3
Const HDOOR = 6
Const OPENING = 10, OPENED = 20, CLOSING = 30, CLOSED = 40
Global player=CreateSphere()
PositionEntity player,6, 0.4, -15
ScaleEntity player,0.1,0.1,0.1
TurnEntity player,0,0,0
EntityType player, TypePlayer
cam=CreateCamera(player)
light=CreateLight(1)
Global Floortex=LoadTexture("floor.jpg")
Floor1=CreatePlane()
PositionEntity Floor1,0,-1.5,0
EntityTexture Floor1, floortex
Type doorsinfo
Field ix%,iz%
Field oDoor%
Field status%
Field pos#
Field doortype%
Field ticks#
End Type
Dim Doors.doorsinfo( 50 )
Global NumDoors = 0
tex5 = LoadTexture ("door1.jpg")
For i=1 To 5
aCube(i)=CreateCube()
EntityTexture aCube(i), tex5
ScaleEntity aCube(i),1.5,1.5,0.2
EntityType aCube(i), TypeDoor
NumDoors = NumDoors + 1
Doors(NumDoors) = New doorsinfo
Doors(NumDoors)\oDoor = aCube(i)
Doors(NumDoors)\ix = i*8
Doors(NumDoors)\iz = j*3
Doors(NumDoors)\status = CLOSED
Doors(NumDoors)\pos = 0
Doors(NumDoors)\doortype = HDOOR
PositionEntity aCube(i), i*8, 0, j*3
Next
Collisions TypePlayer, TypeWall, 2, 3
Collisions TypePlayer, TypeDoor, 2, 3
While Not KeyDown( 1 )
If KeyDown(200) MoveEntity player, 0, 0, 0.2
If KeyDown(208) MoveEntity player, 0, 0, -0.2
If KeyDown(203) TurnEntity player, 0, 2, 0
If KeyDown(205) TurnEntity player, 0, -2, 0
entitywall% = EntityCollided(Player,TypeWall)
entitydoor% = EntityCollided(Player,TypeDoor)
CollideDoors(entitydoor)
UpdateWorld
RenderWorld
Flip
Wend
End
Function CollideDoors( door )
For i=1 To NumDoors
If Str(Doors(i)\oDoor) = Str(door)
Doors(i)\status = OPENING
EndIf
Next
If current + time_delay < MilliSecs()
For i=1 To NumDoors
If Doors(i)\status = OPENING
Doors(i)\pos = Doors(i)\pos + 0.1
If Doors(i)\doortype = HDOOR
PositionEntity Doors(i)\oDoor, Doors(i)\ix + Doors(i)\pos, 0, Doors(i)\iz
EndIf
If Doors(i)\pos > 2.8
Doors(i)\pos = 2.8
Doors(i)\status = OPENED
Doors(i)\ticks = MilliSecs()+3000
EndIf
EndIf
If Doors(i)\ticks < MilliSecs() And Doors(i)\status = OPENED Then
If Doors(i)\doortype = HDOOR
Doors(i)\status = CLOSING
EndIf
EndIf
If Doors(i)\status = CLOSING
Doors(i)\pos = Doors(i)\pos - 0.1
If Doors(i)\pos < 0
Doors(i)\pos = 0
Doors(i)\status = CLOSED
EndIf
If Doors(i)\doortype = HDOOR
PositionEntity Doors(i)\oDoor, Doors(i)\ix + Doors(i)\pos, 0, Doors(i)\iz
EndIf
EndIf
Next
EndIf
current = MilliSecs()
End Function
Media свою вставь...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.02.2012, 12:51
|
#13
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Дубликаты дверей
Неправильно проверку коллизий делаешь вот тут
For i=0 To 3
If EntityCollided(player,t_block)
MoveEntity AllDoors(i)\ent,0,0.2,0
EndIf
Next
Тебе от коллизии нужно получить конкретную дверь, получить её вот так:
Local door% = EntityCollided(player,t_block)
и далее уже двигаешь дверь:
if(door <> Null)
MoveEntity door,0,0.2,0
Exit ;выходим из цикла, т.к. уже подвинули нужную дверь
endif
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.03.2012, 19:10
|
#14
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Дубликаты дверей
L-ee-X, я этот исходник в БлитзСкуле смотрел, уж очень он запутанный для новичка.
Жека, я всё написал, вот только он поднимает один и тот же блок:

Graphics3D 640,480
SetBuffer BackBuffer()
Const t_player=1, t_block=2
Type doors
Field ent
End Type
player=CreateSphere()
EntityType player, t_player
cam=CreateCamera(player)
bl=CreateCube()
PositionEntity bl,0,0,5
EntityType bl, t_block
HideEntity bl
Collisions t_player, t_block,2,3
Dim AllDoors.doors(3)
For i=0 To 3
AllDoors(i) = New doors
AllDoors(i)\ent = CopyEntity(bl)
Next
PositionEntity AllDoors(0)\ent,10,0,0
PositionEntity AllDoors(1)\ent,5,0,0
PositionEntity AllDoors(2)\ent,0,0,0
PositionEntity AllDoors(3)\ent,-5,0,0
While Not KeyDown(1)
For i=0 To 3
Local door% = EntityCollided(player, t_block)
If door<>0
MoveEntity AllDoors(i)\ent,0,0.2,0
Exit
EndIf
Next
TurnEntity player, 0, 0 -MouseXSpeed()*0.1, 0
TurnEntity cam, MouseYSpeed()*0.1, 0, 0
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
RotateEntity cam, EntityPitch#( cam ), 0, 0
If KeyDown(17) MoveEntity player,0,0,0.5
If KeyDown(31) MoveEntity player,0,0,-0.5
If KeyDown(30) MoveEntity player,-0.5,0,0
If KeyDown(32) MoveEntity player,0.5,0,0
UpdateWorld()
RenderWorld()
Flip
Wend
End
|
(Offline)
|
|
02.03.2012, 07:08
|
#15
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Дубликаты дверей
Я забыл тебе дописать проверку конкретной двери через сравнение door и ent, вот код подправленный (+ сдвинул камеру чтоб было видно шарик и делэй(20) чтоб притормозить фпс)

Graphics3D 640,480
SetBuffer BackBuffer()
Const t_player=1, t_block=2
Type doors
Field ent
End Type
player=CreateSphere()
EntityType player, t_player
cam=CreateCamera(player)
MoveEntity cam,0,5,-10
bl=CreateCube()
PositionEntity bl,0,0,5
EntityType bl, t_block
HideEntity bl
Collisions t_player, t_block,2,3
Dim AllDoors.doors(3)
For i=0 To 3
AllDoors(i) = New doors
AllDoors(i)\ent = CopyEntity(bl)
Next
PositionEntity AllDoors(0)\ent,10,0,0
PositionEntity AllDoors(1)\ent,5,0,0
PositionEntity AllDoors(2)\ent,0,0,0
PositionEntity AllDoors(3)\ent,-5,0,0
While Not KeyDown(1)
For i=0 To 3
Local door% = EntityCollided(player, t_block)
If door<>0 And door=AllDoors(i)\ent
MoveEntity AllDoors(i)\ent,0,0.2,0
Exit
EndIf
Next
TurnEntity player, 0, 0 -MouseXSpeed()*0.1, 0
TurnEntity cam, MouseYSpeed()*0.1, 0, 0
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
RotateEntity cam, EntityPitch#( cam ), 0, 0
If KeyDown(17) MoveEntity player,0,0,0.5
If KeyDown(31) MoveEntity player,0,0,-0.5
If KeyDown(30) MoveEntity player,-0.5,0,0
If KeyDown(32) MoveEntity player,0.5,0,0
UpdateWorld()
RenderWorld()
Flip
Delay(20)
Wend
End
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:38.
|