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

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

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

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

Ответ
 
Опции темы
Старый 01.08.2010, 00:19   #1
Mark Castle
Знающий
 
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений
(для 3 пользователей)
Проблема с дверями

Опять я к вам с вопросом: у меня в игре предусмотрена дверь, при столкновением с которой она двигается вниз.Я загружаю все это через csm-карту,но проблема в том, что если пишу
If EntityCollided(doren(id)\dos,user_type)
то не работает, а если
If EntityCollided(user,door_type)
- то открываются все
помогите плиз с этим уже второй день мучаюсь!
вот код загрузки дверей:
Function RecurseSeek(ent)
	For i=1 To CountChildren(ent)	
		child=GetChild(ent,i)
		name$=Lower(EntityName(child))
		If Instr(name$,"door")
		create_door(child)				
		EndIf	
		If Instr(name$,"floor")
		EndIf	
			Next
End Function
вот инициализация:
Function create_door(doors)
numd%=numd%+1
doren(numd) = New doore
doren(numd)\dos=doors
doren(numd)\status=0
EntityType doren(numd)\dos,door_type
End Function
а вот обработка:
Function update_door()
For id=1 To numd
If EntityCollided(doren(id)\dos,user_type) Then ab=1
If ab
doren(id)\status=1
EndIf
If doren(id)\status=1
If doren(id)\time<127 
doren(id)\time=doren(id)\time+1
MoveEntity doren(id)\dos,0,-2,0
EndIf
EndIf
If doren(id)\time>=125 Then
doren(id)\kb%=doren(id)\kb%+1
If doren(id)\kb%=300 Then doren(id)\status=2:doren(id)\kb=0
EndIf

If doren(id)\status=2
If doren(id)\time>0 
doren(id)\time=doren(id)\time-1
MoveEntity doren(id)\dos,0,2,0
EndIf
EndIf

Next
End Function
помогите пожалуйста,заранее спасибо!
__________________
...мама я больше не буду!
(Offline)
 
Ответить с цитированием
Старый 01.08.2010, 01:35   #2
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Проблема с дверями

Разбирать код сложновато. Но может просто придавать имя каждой двери NameEntity( entity, name$ ). А потом делать проверку на имя.
Ну типа того.

If EntityCollided(doren(id)\dos,user_type) - не работает.
If EntityCollided(user,door_type) - работает.
Я думаю, на первом месте ставить "объект который имеет движение". Т.е. стоячие, статические объекты не проверяются на столкновения.

Function update_door() не оптимизированная (не правильная считай). Не нужно в самой For id=1 To numd .. Next
делать проверки.
И лучше сменить всю систему загрузки, хранения и проверки дверей.
ИМХО Function create_door(doors) мне не нравится.
(Offline)
 
Ответить с цитированием
Старый 01.08.2010, 01:38   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Проблема с дверями

Вот, моджет поможет!
Там в какомто уроке (их 13) расказывается об дверях (код очень похожий с твоим))))
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 01:42   #4
Mark Castle
Знающий
 
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Проблема с дверями

я уже там посмотрел, вроде все правильно, подскажите что тут не так!
__________________
...мама я больше не буду!
(Offline)
 
Ответить с цитированием
Старый 01.08.2010, 01:46   #5
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Проблема с дверями

Попробуй другие функции проверки на столкновение.
Я блитз уже позабыл, но помню что функций проверок на столкновение уйма!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 01:49   #6
Mark Castle
Знающий
 
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Проблема с дверями

я уже вроде все попробовал, у меня уже кончились идеи...
__________________
...мама я больше не буду!
(Offline)
 
Ответить с цитированием
Старый 01.08.2010, 01:53   #7
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Проблема с дверями

Может не надо For door to door ..? Блитз же сам, кажется, прогоняется по объектам при EntityCollided. Главное потом словить NameEntity ~ (EntityName), или подобное.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 01:54   #8
Mark Castle
Знающий
 
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Проблема с дверями

Сообщение от LLI.T.A.L.K.E.R. Посмотреть сообщение
Разбирать код сложновато. Но может просто придавать имя каждой двери NameEntity( entity, name$ ). А потом делать проверку на имя.
Ну типа того.


Я думаю, на первом месте ставить "объект который имеет движение". Т.е. стоячие, статические объекты не проверяются на столкновения.

Function update_door() не оптимизированная (не правильная считай). Не нужно в самой For id=1 To numd .. Next
делать проверки.
И лучше сменить всю систему загрузки, хранения и проверки дверей.
ИМХО Function create_door(doors) мне не нравится.
хорошо, а как бы ты сделал? можешь выложить?
__________________
...мама я больше не буду!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 10:46   #9
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Проблема с дверями

Вот функция проверки пересечения двух мешей - MeshesIntersect(меш№1, меш№2)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 11:47   #10
Nafi
ПроЭктировщик
 
Регистрация: 04.08.2007
Сообщений: 192
Написано 44 полезных сообщений
(для 58 пользователей)
Ответ: Проблема с дверями

С дверью можно элементарно проверять на расстояние по координатам. Игрок нажимает кнопку открытия, по координатам находишь ближайшую дверь и открываешь. Причем, вычислять квадратные корни не нужно. Расстояние_взаимодействия (так сказать) возводишь в квадрат умножением на само себя. Типа:
if r*r >= (doorX-persX)*(doorX-persX)+...+(doorZ-persZ)*(doorZ-persZ) then
Это по центрам объектов (дверь и персонаж) считается.
Оно конечно все вручную, но числогрызы все монструознее. Дверей там надо думать тоже не много. Да и код понятнее. Чего-то с блицевскими коллизиями у меня все время траблы.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 12:27   #11
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Восклицание Ответ: Проблема с дверями

if r*r >= (doorX-persX)*(doorX-persX)+...+(doorZ-persZ)*(doorZ-persZ) then

тип ты чего?
Нелегче перебирать все двери, и проверять растояние EntityDistance ???
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 13:01   #12
Nafi
ПроЭктировщик
 
Регистрация: 04.08.2007
Сообщений: 192
Написано 44 полезных сообщений
(для 58 пользователей)
Ответ: Проблема с дверями

A entitydistance между какими точками объектов меряет? Всеми?
Ну и мне проще код из головы забить, чем лезть в help уточнять.

З.Ы. к тому-же entitydistance выдает расстояние, значит, вычисляет квадратный корень. Довольно долгая функция. С другой стороны давненько я спецификации процессоров не смотрел, а мой метод дает потери на блицевском интерпретаторе. Тестировать надо, а лень.
А с третей стороны, знает ли блиц, что бывают процессоры новее третьего пенька.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 13:17   #13
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Проблема с дверями

A entitydistance между какими точками объектов меряет? Всеми?
Между цетрами 2 объектов, которых укажех в параметрах.
З.Ы. к тому-же entitydistance выдает расстояние, значит, вычисляет квадратный корень. Довольно долгая функция.
Ну прям ооооочень долгая! Аж камп виснет!
(Offline)
 
Ответить с цитированием
Старый 01.08.2010, 13:22   #14
Nafi
ПроЭктировщик
 
Регистрация: 04.08.2007
Сообщений: 192
Написано 44 полезных сообщений
(для 58 пользователей)
Ответ: Проблема с дверями

Сообщение от Den Посмотреть сообщение
Ну прям ооооочень долгая! Аж камп виснет!
Ну как минимум раз в 10 длиннее умножения.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Старый 01.08.2010, 13:43   #15
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Проблема с дверями

Ну как минимум раз в 10 длиннее умножения.
Блин, тип, ты меня уже бесить начинаеш!
1)В твоей функции ты вызываеш EntityX EntityY EntityZ, а в EntityDistance координаты беруца скорей всего прямо из матриц обекта, что как ты говориш
Ну как минимум раз в 10 быстрее
2)У тя код прям соответствует одному из правил говнокода:
Никогда не используй циклы - копипаста твой друг
3)Твой код ограничен нужно знать кол-во дверей, а если хочешь супер-скорости в играх-чтож ты директс и опегл не юзаеш, ааа???!!!
Надеюсь я тебя убедил
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (01.08.2010)
Ответ


Опции темы

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

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


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


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