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

Mark Castle 01.08.2010 00:19

Проблема с дверями
 
Опять я к вам с вопросом: у меня в игре предусмотрена дверь, при столкновением с которой она двигается вниз.Я загружаю все это через 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

помогите пожалуйста,заранее спасибо!

LLI.T.A.L.K.E.R. 01.08.2010 01:35

Ответ: Проблема с дверями
 
Разбирать код сложновато. Но может просто придавать имя каждой двери 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) мне не нравится.

den 01.08.2010 01:38

Ответ: Проблема с дверями
 
Вот, моджет поможет!
Там в какомто уроке (их 13) расказывается об дверях (код очень похожий с твоим))))

Mark Castle 01.08.2010 01:42

Ответ: Проблема с дверями
 
я уже там посмотрел, вроде все правильно, подскажите что тут не так!

den 01.08.2010 01:46

Ответ: Проблема с дверями
 
Попробуй другие функции проверки на столкновение.
Я блитз уже позабыл, но помню что функций проверок на столкновение уйма!

Mark Castle 01.08.2010 01:49

Ответ: Проблема с дверями
 
я уже вроде все попробовал, у меня уже кончились идеи...

LLI.T.A.L.K.E.R. 01.08.2010 01:53

Ответ: Проблема с дверями
 
Может не надо For door to door ..? Блитз же сам, кажется, прогоняется по объектам при EntityCollided. Главное потом словить NameEntity ~ (EntityName), или подобное.

Mark Castle 01.08.2010 01:54

Ответ: Проблема с дверями
 
Цитата:

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


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

Function update_door() не оптимизированная (не правильная считай). Не нужно в самой For id=1 To numd .. Next
делать проверки.
И лучше сменить всю систему загрузки, хранения и проверки дверей.
ИМХО Function create_door(doors) мне не нравится.

хорошо, а как бы ты сделал? можешь выложить?

den 01.08.2010 10:46

Ответ: Проблема с дверями
 
Вот функция проверки пересечения двух мешей - MeshesIntersect(меш№1, меш№2)

Nafi 01.08.2010 11:47

Ответ: Проблема с дверями
 
С дверью можно элементарно проверять на расстояние по координатам. Игрок нажимает кнопку открытия, по координатам находишь ближайшую дверь и открываешь. Причем, вычислять квадратные корни не нужно. Расстояние_взаимодействия (так сказать) возводишь в квадрат умножением на само себя. Типа:
if r*r >= (doorX-persX)*(doorX-persX)+...+(doorZ-persZ)*(doorZ-persZ) then
Это по центрам объектов (дверь и персонаж) считается.
Оно конечно все вручную, но числогрызы все монструознее. Дверей там надо думать тоже не много. Да и код понятнее. Чего-то с блицевскими коллизиями у меня все время траблы.

den 01.08.2010 12:27

Ответ: Проблема с дверями
 
Цитата:

if r*r >= (doorX-persX)*(doorX-persX)+...+(doorZ-persZ)*(doorZ-persZ) then
:4to: :4to: :4to:
тип ты чего?
Нелегче перебирать все двери, и проверять растояние EntityDistance ???

Nafi 01.08.2010 13:01

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

З.Ы. к тому-же entitydistance выдает расстояние, значит, вычисляет квадратный корень. Довольно долгая функция. С другой стороны давненько я спецификации процессоров не смотрел, а мой метод дает потери на блицевском интерпретаторе. Тестировать надо, а лень.
А с третей стороны, знает ли блиц, что бывают процессоры новее третьего пенька.

den 01.08.2010 13:17

Ответ: Проблема с дверями
 
Цитата:

A entitydistance между какими точками объектов меряет? Всеми?
Между цетрами 2 объектов, которых укажех в параметрах.
Цитата:

З.Ы. к тому-же entitydistance выдает расстояние, значит, вычисляет квадратный корень. Довольно долгая функция.
Ну прям ооооочень долгая!:-D Аж камп виснет!:-D

Nafi 01.08.2010 13:22

Ответ: Проблема с дверями
 
Цитата:

Сообщение от Den (Сообщение 156939)
Ну прям ооооочень долгая!:-D Аж камп виснет!:-D

Ну как минимум раз в 10 длиннее умножения.

den 01.08.2010 13:43

Ответ: Проблема с дверями
 
Цитата:

Ну как минимум раз в 10 длиннее умножения.
Блин, тип, ты меня уже бесить начинаеш!>>:(
1)В твоей функции ты вызываеш EntityX EntityY EntityZ, а в EntityDistance координаты беруца скорей всего прямо из матриц обекта, что как ты говориш
Цитата:

Ну как минимум раз в 10 быстрее
2)У тя код прям соответствует одному из правил говнокода:
Цитата:

Никогда не используй циклы - копипаста твой друг
3)Твой код ограничен нужно знать кол-во дверей, а если хочешь супер-скорости в играх-чтож ты директс и опегл не юзаеш, ааа???!!!
Надеюсь я тебя убедил:)


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

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