Четверг, 14 Ноября 2024, 05:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[Java] Проверка столкновений
last2424Дата: Понедельник, 19 Декабря 2016, 19:22 | Сообщение # 1
30 мл. блоков
Сейчас нет на сайте
Есть вот такой код:


Проблема следующая:
Персонаж падает как бы на куб и останавливается, но когда я пытаюсь пройти с боку в него, то он проходит, а должен останавливаться, исправляю уже пару часов, ничего в голову не пришло, может ли кто-нибудь знающий как работают столкновения в 3д пространстве помочь мне?

Если что вот код вызова update():


P.S. если   playerTemp.x = this.position.x; и playerTemp.z = this.position.z; переместить в конец, то он не двигается совсем после столкновения по y.


Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)

Сообщение отредактировал last2424 - Понедельник, 19 Декабря 2016, 19:24
DaemodДата: Вторник, 20 Декабря 2016, 01:09 | Сообщение # 2
был не раз
Сейчас нет на сайте
А он и не должен по твоему коду останавливаться.
Если игрок заходи с боку, то у него грубо устанавливаются координаты.
То есть выглядит так:
1) Сдвинулся внутрь куба.
2) Записал значения в temp.
3)Сработал If и установил значения temp в позицию игрока.

Если пример в цифрах то:
1) x = 3 , y = 3 , z = 3 (он уже в кубе)
2) temp.x = x , temp.z = z (то есть вносим те же самые координаты,что внутри куба). Выходит temp.x = 3, temp.z = 3
3) x = temp.x , z = temp.z . Выходит x =3, z = 3. Что была проверка, что не было...

Тебе нужно хранить отдельно старые координаты от текущих.
Попробуй перенести
Код
  playerTemp.x = this.position.x;
  playerTemp.z = this.position.z;
в else


Сообщение отредактировал Daemod - Вторник, 20 Декабря 2016, 02:57
last2424Дата: Вторник, 20 Декабря 2016, 11:19 | Сообщение # 3
30 мл. блоков
Сейчас нет на сайте
Daemod, если перенести temp в else то он будет стоять всегда в том случае если не указан temp.y и он уже не присвоен в position.y, но в таком случае он начинает подпрыгивать вверх вниз, хоть и двигается.

Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
DaemodДата: Вторник, 20 Декабря 2016, 15:47 | Сообщение # 4
был не раз
Сейчас нет на сайте
У тебя такой код выходит?
last2424Дата: Вторник, 20 Декабря 2016, 16:30 | Сообщение # 5
30 мл. блоков
Сейчас нет на сайте
Daemod, да

Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
DaemodДата: Вторник, 20 Декабря 2016, 17:47 | Сообщение # 6
был не раз
Сейчас нет на сайте
Попробовал еще раз разобраться в твоем коде, но сломал мозг :)
Примерно код у тебя работает так:
1) Прыгает на позицию.
2) Проверяет можно ли было прыгнут туда.
3) Прыгает обратно, если было нельзя.

Я бы сделал так:
1) Проверяю можно ли прыгать.
2) Прыгаю если можно.




p.s Не удобно однако тут код вкидывать копипастом :(


Сообщение отредактировал Daemod - Вторник, 20 Декабря 2016, 17:50
last2424Дата: Вторник, 20 Декабря 2016, 18:04 | Сообщение # 7
30 мл. блоков
Сейчас нет на сайте
Daemod, так работать не будет.
1. Он не падает в твоём коде.
2. Он не будет двигаться после столкновения.
3. Проверять столкновения одновременно с движением - плохая идея, могу появится проблемы с самим передвижением. Лучшим вариантом остаётся хранить предыдущую позицию и в нужное время её заменять настоящей позицией.


Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
DaemodДата: Вторник, 20 Декабря 2016, 18:11 | Сообщение # 8
был не раз
Сейчас нет на сайте
Цитата last2424 ()
1. Он не падает в твоём коде.

Должен падать по update.
Код

if(!player.getCollision(0,-1*delta,0){
    player.movePosition(0,-1*delta,0);
}

Цитата last2424 ()
2. Он не будет двигаться после столкновения.

Он не должен вообще столкнутся, так как проверит, а потом только сдвинется.(В мертвую зону не попадет)
Причем проверяет он отдельно по направлению.
Цитата last2424 ()
3. Проверять столкновения одновременно с движением - плохая идея

Мне кажется так было бы лучше чем дергаться скачками.


Сообщение отредактировал Daemod - Вторник, 20 Декабря 2016, 18:12
last2424Дата: Вторник, 20 Декабря 2016, 18:25 | Сообщение # 9
30 мл. блоков
Сейчас нет на сайте
Daemod, извини, теперь увидел, всё работает ) Теперь надо просто калибровки провести, ибо он может чуть дальше зайти и застрять там.
т.е. если упереться вперёд в куб и нажать в бок, то он в нём застрянет)


Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)

Сообщение отредактировал last2424 - Вторник, 20 Декабря 2016, 18:27
DaemodДата: Вторник, 20 Декабря 2016, 20:16 | Сообщение # 10
был не раз
Сейчас нет на сайте
Чтобы еще отдельно не создавать тему спрошу тут.
Какой версии lwjgl пользуетесь? 3 или 2?
Если на третей, то как устанавливали перспективную камеру? там вроде только ортогональная шла с фреймворком.
last2424Дата: Вторник, 20 Декабря 2016, 20:54 | Сообщение # 11
30 мл. блоков
Сейчас нет на сайте
Daemod, 3, есть такая вещь как JOML(Java OpenGL Math Library), там хранится вся математика для создания перспективы, а в самом lwjgl 3 есть функция GL11.glLoadMatrix, которая загружает созданную матрицу.

Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)

Сообщение отредактировал last2424 - Вторник, 20 Декабря 2016, 20:54
DaemodДата: Вторник, 20 Декабря 2016, 21:24 | Сообщение # 12
был не раз
Сейчас нет на сайте
а ларчик просто открывался... А я из-за этого из второй версии выйти не мог.
Спасибо за ответ.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг