|
3D-программирование Вопросы, касающиеся программирования 3D мира |
25.06.2011, 19:06
|
#1
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Лифт
Привет булка. Я тут написал код передвижения без деления уровня на стены и пол и кое что получилось. Сейчас сделал лифт. Но тут возникли проблемы. Некоторые лифты ведут себя более чем странно. Игрок иногда(самое непонятное почему именно иногда) проваливается через них. А лифт двигающийся по двум осям вообще смещает игрока по горизонтальной оси при движении обратно.
Не могу понять где проблема.
К слову. Реально ли на блице вообще реализовать лифт аля Квейк 3?
В аттаче исходник.
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2011, 19:23
|
#2
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Лифт
Сообщение от Gector
Привет булка. Я тут написал код передвижения без деления уровня на стены и пол и кое что получилось. Сейчас сделал лифт. Но тут возникли проблемы. Некоторые лифты ведут себя более чем странно. Игрок иногда(самое непонятное почему именно иногда) проваливается через них. А лифт двигающийся по двум осям вообще смещает игрока по горизонтальной оси при движении обратно.
Не могу понять где проблема.
К слову. Реально ли на блице вообще реализовать лифт аля Квейк 3?
В аттаче исходник.
|
Реально, чё-ж тут нереального, просто надо хорошо себе представить как все должно работать и при каких действиях могут возникнуть "спорные моменты"...
П.с. код не смотрел т. к. в квэйк 3 играл всего пару раз и лифтов там не видел)
П.с.с. Ща позырю код, мож чё прояснится...
Выложи деклс к парсеру...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2011, 19:30
|
#3
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Лифт
Сообщение от Crayzi
Реально, чё-ж тут нереального, просто надо хорошо себе представить как все должно работать и при каких действиях могут возникнуть "спорные моменты"...
П.с. код не смотрел т. к. в квэйк 3 играл всего пару раз и лифтов там не видел)
П.с.с. Ща позырю код, мож чё прояснится...
Выложи деклс к парсеру...
|
А. Да. Забыл). Не экзешник же)
Иными словами такой платформерный лифт.
Я уже даже на бумажке расписывал его движение). Но видать чтото упустил.
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
25.06.2011, 19:49
|
#4
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Лифт
Закомментируй строчку
;M\ZSpeed = Float(ReadSub(S$,4," "))
и проверь подъемную платформу, при спуске перестанеш съезжать с нее, наверное надо разделить платформы на 2 типа, подъемные и нет, и менять тип платформы в нужный момент на тот какой нужен для определенного действия... каждый тип платформ обрабатывается по разному...
П.с. Я еще не совсем понял чё дают фнкции с либы))
П.с.с. Еще когда поднимаешся то както по 2 раза дергаешся, видать поднимаешся медленнее платформы и србатывает коллизея чтоль, ну хз короч...
П.с.с.с. Чёт я недогоняю как ты все там организовал)))) (сложновато для моего понимания)
|
(Offline)
|
|
25.06.2011, 20:02
|
#5
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Лифт
Либа простейший парсер. Юзаю по старинке). Функция в которой она используется читает из имени чайлда его особенность. В примере она отвечает за конвертацию чайлда в лифт. Сама либо тут не причем.
Когда я только написал этот код заметил, что горизонтальная платформа придает игроку скорость но она равна половине скорости платформы. Поэтому я стал ее умножать на 2. Полагаю дело как раз в этом отставании. Видимо слишком радикальным способом от него избавился).
П.с.с.с. Чёт я недогоняю как ты все там организовал)))) (сложновато для моего понимания)
|
Не мудрено). Чужой код всегда сложней разбирать).
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
25.06.2011, 20:27
|
#6
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Лифт
Сообщение от Gector
Не мудрено). Чужой код всегда сложней разбирать).
|
Ну да, у каждого свои тараканы в голове))
Попробовал бы перемещать игрока вместе с платформой, а не только во время колизеи, тоесть координата платформы х=50, у=80, z=30, а координата игрока сообтевтсвенно (допустим он стоит ровно по центру, так-же в платформу запихнуть Field со значением 0-1, есть там игрок или нет, проколизеился с платформой - отметить что он на ней) равны х=50, y=81, z=30, ну или хз, я могу только варианты предложить)
П.с. Или наоборот, игроку прописывать на какой платформе он находится, так будет чуть проще...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2011, 20:30
|
#7
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Лифт
Сообщение от Crayzi
Ну да, у каждого свои тараканы в голове))
Попробовал бы перемещать игрока вместе с платформой, а не только во время колизеи, тоесть координата платформы х=50, у=80, z=30, а координата игрока сообтевтсвенно (допустим он стоит ровно по центру, так-же в платформу запихнуть Field со значением 0-1, есть там игрок или нет, проколизеился с платформой - отметить что он на ней) равны х=50, y=81, z=30, ну или хз, я могу только варианты предложить)
|
Пробовал к сожалению).
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
25.06.2011, 23:41
|
#8
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Лифт
Type lift
Field x%,y%,z%
Field ent
Field size#
Field spd#
Field maxh
End Type
Function createlift(x,y,z,size,spd#,maxh)
li.lift = New lift
li\x=x
li\y=y
li\z=z
li\ent=CreateCube()
li\size=size
li\size=size
ScaleEntity li\ent,li\size,.1,li\size
PositionEntity li\ent,x,y,z,1
li\spd=spd
li\maxh=maxh
End Function
TheLift = createlift(20,1,20,8,.1,10)
цикл
For li.lift = Each lift
If EntityY(li\ent,1)=>li\maxh
li\spd=-li\spd
EndIf
If EntityY(li\ent,1)=<0
li\spd=-li\spd
EndIf
If EntityX(player,1)<EntityX(li\ent,1)+li\size And EntityX(player,1)>EntityX(li\ent,1)-li\size And EntityZ(player,1)<EntityZ(li\ent,1)+li\size And EntityZ(player,1)>EntityZ(li\ent,1)-li\size
If EntityY(player,1)=> EntityY(li\ent) And EntityY(player,1)=< EntityY(li\ent)+8
;TranslateEntity player,0,li\spd*2,0,1
PositionEntity player,EntityX(player,1),EntityY(li\ent)+8,EntityZ (player,1),1
EndIf
EndIf
TranslateEntity li\ent,0,li\spd,0,1
Next
|
Попробуй вот так, например. Блицевые коллизии это отстой - не пользуй их.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо NitE за это полезное сообщение:
|
|
26.06.2011, 00:54
|
#9
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Лифт
Сообщение от NitE
Попробуй вот так, например. Блицевые коллизии это отстой - не пользуй их.
|
+1000, хотел чёт типо этого намутить в его коде, только терпения нехватило))
|
(Offline)
|
|
26.06.2011, 00:59
|
#10
|
|
Ответ: Лифт
NitE
Жесть
Достаточно делать игрока чайлдом платформы когда на ней стоишь. Т.е. когда с ней есть коллизия и вектор нормали (Collision Nx Ny Nz) направлен вверх (ну или не сильно отличается, если платформа неровная)
|
|
|
Сообщение было полезно следующим пользователям:
|
|
26.06.2011, 05:28
|
#11
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Лифт
Моё дело предложить. А блицем уже 3 года как-то не пользуюсь.
|
(Offline)
|
|
27.06.2011, 15:43
|
#12
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Лифт
У меня похожая проблема была (с лифтом). Тоесть была плитка и персонаж.
Сначала опускалась плитка, потом персонаж, и проверялось на коллизию. Всё было нормально. Но стоило таким же макаром поднимать плитку - персонаж просачивался сквозь неё. Непонятно.
Ща проверю 1 мысль - сначала поднять плитку и сразу же опусть. Типо 2 шага вперед, и 1 назад.
ВАХ, работает!
Кусок кода:
plita_speed_x#(1)=Sin(time)*0.1
If plita_speed_x#(1)<=0 Then PositionEntity (plita_m(1),EntityX(plita_m(1))+plita_speed_x#(1),EntityY(plita_m(1))+plita_speed_x#(1)/10,EntityZ(plita_m(1)))
If plita_speed_x#(1)>0 Then
PositionEntity (plita_m(1),EntityX(plita_m(1)),EntityY(plita_m(1))+plita_speed_x#(1)/10,EntityZ(plita_m(1)))
PositionEntity (plita_m(1),EntityX(plita_m(1))+plita_speed_x#(1),EntityY(plita_m(1))-plita_speed_x#(1)/5,EntityZ(plita_m(1)))
End If
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:34.
|