|
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
Написано 112 полезных сообщений (для 166 пользователей)
|
Ответ: Дубликаты дверей
Сделай список дверей, определи им свой тип столкновения. Каждой двери задай имя из списка с помощью Handle, при столкновении с типом дверей, читай имя обьекта и передавай функции обработки дверей. С помощью Object. находишь нужную запись в списке, выполняешь действия с дверью.
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.02.2012, 15:08
|
#3
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Дубликаты дверей
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(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,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Дубликаты дверей
как отследить их положение
|
Создать 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
Написано 112 полезных сообщений (для 166 пользователей)
|
Ответ: Дубликаты дверей
Сообщение от 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
Адрес: Ирк. обл.
Сообщений: 541
Написано 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, время: 16:00.
|