|
3D-программирование Вопросы, касающиеся программирования 3D мира |
01.08.2010, 00:19
|
#1
|
Знающий
Регистрация: 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
|
Мастер
Регистрация: 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
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Проблема с дверями
Вот, моджет поможет!
Там в какомто уроке (их 13) расказывается об дверях (код очень похожий с твоим))))
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 01:42
|
#4
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Проблема с дверями
я уже там посмотрел, вроде все правильно, подскажите что тут не так!
__________________
...мама я больше не буду!
|
(Offline)
|
|
01.08.2010, 01:46
|
#5
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Проблема с дверями
Попробуй другие функции проверки на столкновение.
Я блитз уже позабыл, но помню что функций проверок на столкновение уйма!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 01:49
|
#6
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Проблема с дверями
я уже вроде все попробовал, у меня уже кончились идеи...
__________________
...мама я больше не буду!
|
(Offline)
|
|
01.08.2010, 01:53
|
#7
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Проблема с дверями
Может не надо For door to door ..? Блитз же сам, кажется, прогоняется по объектам при EntityCollided. Главное потом словить NameEntity ~ (EntityName), или подобное.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 01:54
|
#8
|
Знающий
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 10:46
|
#9
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Проблема с дверями
Вот функция проверки пересечения двух мешей - MeshesIntersect(меш№1, меш№2)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 11:47
|
#10
|
ПроЭктировщик
Регистрация: 04.08.2007
Сообщений: 192
Написано 44 полезных сообщений (для 58 пользователей)
|
Ответ: Проблема с дверями
С дверью можно элементарно проверять на расстояние по координатам. Игрок нажимает кнопку открытия, по координатам находишь ближайшую дверь и открываешь. Причем, вычислять квадратные корни не нужно. Расстояние_взаимодействия (так сказать) возводишь в квадрат умножением на само себя. Типа:
if r*r >= (doorX-persX)*(doorX-persX)+...+(doorZ-persZ)*(doorZ-persZ) then
Это по центрам объектов (дверь и персонаж) считается.
Оно конечно все вручную, но числогрызы все монструознее. Дверей там надо думать тоже не много. Да и код понятнее. Чего-то с блицевскими коллизиями у меня все время траблы.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 12:27
|
#11
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Проблема с дверями
if r*r >= (doorX-persX)*(doorX-persX)+...+(doorZ-persZ)*(doorZ-persZ) then
|
тип ты чего?
Нелегче перебирать все двери, и проверять растояние EntityDistance ???
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 13:01
|
#12
|
ПроЭктировщик
Регистрация: 04.08.2007
Сообщений: 192
Написано 44 полезных сообщений (для 58 пользователей)
|
Ответ: Проблема с дверями
A entitydistance между какими точками объектов меряет? Всеми?
Ну и мне проще код из головы забить, чем лезть в help уточнять.
З.Ы. к тому-же entitydistance выдает расстояние, значит, вычисляет квадратный корень. Довольно долгая функция. С другой стороны давненько я спецификации процессоров не смотрел, а мой метод дает потери на блицевском интерпретаторе. Тестировать надо, а лень.
А с третей стороны, знает ли блиц, что бывают процессоры новее третьего пенька.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 13:17
|
#13
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Проблема с дверями
A entitydistance между какими точками объектов меряет? Всеми?
|
Между цетрами 2 объектов, которых укажех в параметрах.
З.Ы. к тому-же entitydistance выдает расстояние, значит, вычисляет квадратный корень. Довольно долгая функция.
|
Ну прям ооооочень долгая! Аж камп виснет!
|
(Offline)
|
|
01.08.2010, 13:22
|
#14
|
ПроЭктировщик
Регистрация: 04.08.2007
Сообщений: 192
Написано 44 полезных сообщений (для 58 пользователей)
|
Ответ: Проблема с дверями
Сообщение от Den
Ну прям ооооочень долгая! Аж камп виснет!
|
Ну как минимум раз в 10 длиннее умножения.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2010, 13:43
|
#15
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Проблема с дверями
Ну как минимум раз в 10 длиннее умножения.
|
Блин, тип, ты меня уже бесить начинаеш!
1)В твоей функции ты вызываеш EntityX EntityY EntityZ, а в EntityDistance координаты беруца скорей всего прямо из матриц обекта, что как ты говориш
Ну как минимум раз в 10 быстрее
|
2)У тя код прям соответствует одному из правил говнокода:
Никогда не используй циклы - копипаста твой друг
|
3)Твой код ограничен нужно знать кол-во дверей, а если хочешь супер-скорости в играх-чтож ты директс и опегл не юзаеш, ааа???!!!
Надеюсь я тебя убедил
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:17.
|