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=16298)

Devilox 06.02.2012 23:03

Дубликаты дверей
 
Я создаю двери, которые при соприкосновении с игроком должны открываться, но так как дверей дофига, отдельно прописывать каждую не получится, как мне сделать дубликаты и добиться отдельного открытия дверей?

RBK 06.02.2012 23:55

Ответ: Дубликаты дверей
 
Сделай список дверей, определи им свой тип столкновения. Каждой двери задай имя из списка с помощью Handle, при столкновении с типом дверей, читай имя обьекта и передавай функции обработки дверей. С помощью Object. находишь нужную запись в списке, выполняешь действия с дверью.

ABTOMAT 07.02.2012 15:08

Ответ: Дубликаты дверей
 
http://forum.boolean.name/showthread.php?t=10
Цитата:

TYPE – это ваш лучший помощник.

Devilox 07.02.2012 15:51

Ответ: Дубликаты дверей
 
Спасибо большое :)

Devilox 08.02.2012 21:32

Ответ: Дубликаты дверей
 
Извиняюсь, конечно, я дибил редкостный, но всё-таки я не разобрался: TYPE, вроде бы, создаёт дубликаты, но я никак не пойму, как отследить их положение, а по HANDLE и OBJECT я не нашёл нормального хэлпа, помогите, если нетрудно...:SOS:

Spy4433 08.02.2012 22:12

Ответ: Дубликаты дверей
 
эм и так :)

допусти у нас есть тип

Код:

type players
field x
end type

создание плеера
Код:

player.players=new players

получаем хендл в пеменную

Код:

myplayer=handle(player)
и так нам нужно получить доступ к экземпляру зная handle и присвоить перменной x значение 120

Код:

pl.players=object.players(myplayer)  -pl - экземпляр созданый по хендлу myplayer
pl\x=120


конечно как мне кажется объяснил слишком коряво :) но думаю поможет

ABTOMAT 08.02.2012 23:33

Ответ: Дубликаты дверей
 
Цитата:

как отследить их положение
Создать Field'ы для положения (x,y,z)
При создании новой двери писать в них координаты.
Когда понадобилось - читать оттуда координаты.
Если у твоей двери есть модель (а скорее всего так и есть) то можешь создать Field для модели, а координаты её брать через EntityX, EntityY и EntityZ.

Сложности object-handle я вообще не понял к чему тут.
Можно же хранить ссылку на объект двери тупо в переменной:

door.MyDoorType = new MyDoorType
door\MySuperField = значение

Вообще object-handle довольно редко юзается (в основном чтобы ускорить переборы списков) и не рекомендую забивать им себе голову пока не разберёшься с азами.

Kudesnic 09.02.2012 01:39

Ответ: Дубликаты дверей
 
Вложений: 1
Вот простой урок про двери и взаимодействие с ними
Но лучше конечно научиться использовать TYPE

RBK 09.02.2012 02:01

Ответ: Дубликаты дверей
 
Цитата:

Сообщение от ABTOMAT (Сообщение 219028)

Сложности 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

Devilox 09.02.2012 19:32

Ответ: Дубликаты дверей
 
Спасибо большое, буду пробовать разбираться :)

Devilox 27.02.2012 20:51

Ответ: Дубликаты дверей
 
Вот, что получилось:
Код:

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

Вот только при соприкосновении с любым блоком двигаются все...
Что не так?

L-ee-X 27.02.2012 23:41

Ответ: Дубликаты дверей
 
Ни все так просто как бы тебе казалось!
Вот те код, правда не мой, я тебе его подредактировал, чтоб ты смог разобраться! Но без коментов, думаю так поймешь!
PHP код:

Graphics3D 640480,32,2
SetBuffer BackBuffer
()
Dim aCube(20)

Const 
TypePlayer 1TypeDoor 3
Const HDOOR 6
Const OPENING 10OPENED  20CLOSING 30CLOSED  40


Global player=CreateSphere()
PositionEntity player,60.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
.doorsinfo50 )
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*80j*3
Next


Collisions TypePlayer
TypeWall23
Collisions TypePlayer
TypeDoor23


While Not KeyDown)

If 
KeyDown(200MoveEntity player000.2
If KeyDown(208MoveEntity player00, -0.2
If KeyDown(203TurnEntity player020
If KeyDown(205TurnEntity player0, -20
entitywall
% = EntityCollided(Player,TypeWall
entitydoor% = EntityCollided(Player,TypeDoor)


CollideDoors(entitydoor)

   
UpdateWorld
   RenderWorld
   Flip
Wend

End

Function CollideDoorsdoor )
   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)\oDoorDoors(i)\ix Doors(i)\pos0Doors(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 
          Doors
(i)\pos 0
          Doors
(i)\status CLOSED
       
EndIf
       If 
Doors(i)\doortype HDOOR
          PositionEntity Doors
(i)\oDoorDoors(i)\ix Doors(i)\pos0Doors(i)\iz
       
EndIf
    EndIf
Next
EndIf
current MilliSecs()   
End Function 

Media свою вставь...

Жека 28.02.2012 12:51

Ответ: Дубликаты дверей
 
Неправильно проверку коллизий делаешь вот тут
Код:

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


Devilox 01.03.2012 19:10

Ответ: Дубликаты дверей
 
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


Жека 02.03.2012 07:08

Ответ: Дубликаты дверей
 
Я забыл тебе дописать проверку конкретной двери через сравнение 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


Devilox 02.03.2012 11:08

Ответ: Дубликаты дверей
 
Спасибо большое! Всё работает :)

Алекс_Нос 08.05.2012 11:26

Ответ: Дубликаты дверей
 
а угол открытия у тебя везде одинаковый? А как же звук ? ты его умеешь подгонять под разворот ?
я сталкивался с такой задачей и экспортил напрямую из макса , а в блице все прекрасно открывалось и работало и со звуком )


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

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