Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 06.02.2012, 23:03   #1
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Дубликаты дверей

Я создаю двери, которые при соприкосновении с игроком должны открываться, но так как дверей дофига, отдельно прописывать каждую не получится, как мне сделать дубликаты и добиться отдельного открытия дверей?
(Offline)
 
Ответить с цитированием
Старый 06.02.2012, 23:55   #2
RBK
Знающий
 
Аватар для RBK
 
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 112 полезных сообщений
(для 166 пользователей)
Ответ: Дубликаты дверей

Сделай список дверей, определи им свой тип столкновения. Каждой двери задай имя из списка с помощью Handle, при столкновении с типом дверей, читай имя обьекта и передавай функции обработки дверей. С помощью Object. находишь нужную запись в списке, выполняешь действия с дверью.
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (07.02.2012)
Старый 07.02.2012, 15:08   #3
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Дубликаты дверей

http://forum.boolean.name/showthread.php?t=10
TYPE – это ваш лучший помощник.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
Devilox (07.02.2012), LLI.T.A.L.K.E.R. (07.03.2012)
Старый 07.02.2012, 15:51   #4
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Дубликаты дверей

Спасибо большое
(Offline)
 
Ответить с цитированием
Старый 08.02.2012, 21:32   #5
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Дубликаты дверей

Извиняюсь, конечно, я дибил редкостный, но всё-таки я не разобрался: TYPE, вроде бы, создаёт дубликаты, но я никак не пойму, как отследить их положение, а по HANDLE и OBJECT я не нашёл нормального хэлпа, помогите, если нетрудно...
(Offline)
 
Ответить с цитированием
Старый 08.02.2012, 22:12   #6
Spy4433
ПроЭктировщик
 
Аватар для Spy4433
 
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений
(для 63 пользователей)
Ответ: Дубликаты дверей

эм и так

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

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

конечно как мне кажется объяснил слишком коряво но думаю поможет
__________________
форум эт вещь... и почему я раньше им не пользовался?

AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
(Offline)
 
Ответить с цитированием
Старый 08.02.2012, 23:33   #7
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 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
Kudesnic
Нуждающийся
 
Аватар для Kudesnic
 
Регистрация: 27.08.2010
Адрес: Лен. область
Сообщений: 58
Написано 21 полезных сообщений
(для 50 пользователей)
Ответ: Дубликаты дверей

Вот простой урок про двери и взаимодействие с ними
Но лучше конечно научиться использовать TYPE
Вложения
Тип файла: zip 4_Двери, окна, стены.zip (381.1 Кб, 385 просмотров)
(Offline)
 
Ответить с цитированием
Старый 09.02.2012, 02:01   #9
RBK
Знающий
 
Аватар для RBK
 
Регистрация: 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
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Дубликаты дверей

Спасибо большое, буду пробовать разбираться
(Offline)
 
Ответить с цитированием
Старый 27.02.2012, 20:51   #11
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 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
L-ee-X
Разработчик
 
Аватар для L-ee-X
 
Регистрация: 06.06.2011
Адрес: Ирк. обл.
Сообщений: 541
Написано 133 полезных сообщений
(для 220 пользователей)
Ответ: Дубликаты дверей

Ни все так просто как бы тебе казалось!
Вот те код, правда не мой, я тебе его подредактировал, чтоб ты смог разобраться! Но без коментов, думаю так поймешь!
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 свою вставь...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (28.02.2012)
Старый 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (28.02.2012)
Старый 01.03.2012, 19:10   #14
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (02.03.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com