25 / 25 / 15
Регистрация: 17.02.2014
Сообщений: 310
1

Прыжок 2Д

16.07.2015, 15:50. Показов 5544. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я написал такой скрипт для прыжка суть его такова когда срабатывает функция OnCollisionStay2D значит игровой персонаж на земле и ему можно прыгать а когда функция не срабатывает значит персонаж уже прыгну и ему нельзя прыгнуть снова пока он не на земле.
Javascript
1
2
3
4
5
6
7
function OnCollisionStay2D (col : Collision2D) 
{
    if (Input.GetKey(KeyCode.Space))
    {
        gameObject.transform.position.y+=2;
    }
}
Проблема возникает когда персонаж дотрагивается до боковых граней другого спрайта например персонаж подпригнул и коснулся боковой грани спрайта и он делает снова прыжок так как функция OnCollisionStay2D срабатывает как этого избежать ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2015, 15:50
Ответы с готовыми решениями:

Прыжок
Сделал прыжок, но проблема в том что когда платформа крутиться, ГГ может прыгнуть как пробка...

Прыжок AddForce
Здравствуйте. Есть дорога, по которой бежит персонаж и кнопка прыгать. Движение персонажа:...

Прыжок в 2d платформере
Помогите пожалуйста, реализовал движения спрайта по поверхности влево и вправо, а вот с прыжком...

Прыжок персонажа
Есть два спрайта персонаж и платформа и есть код прыжка на кнопке пробел: if...

12
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 16:27 2
Проверять координаты соприкосновения, и сравнивать их с координатами центра персонажа. Если точка соприкосновения однозначно ниже, значит, это земля.
1
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
16.07.2015, 16:57 3
Можно попробовать ввести булевый флаг isOnGround и проверять его при нажатии на пробел.

C++
1
2
3
4
5
6
7
8
9
10
bool isOnGroung=true; //псевдокод
 
function OnCollisionStay2D (col : Collision2D) 
{
    if (Input.GetKey(KeyCode.Space))&&(isOnGround))
    {
        isOnGroung=false; //Это не позволит при повторном нажатии в полете при соприкосновении со стеной сделать второй прыжок, т.к. флаг уже переключен
        gameObject.transform.position.y+=2;
    }
}
Ну и дописать функцию на проверку приземления, переключая флаг обратно.
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
16.07.2015, 17:04 4
Цитата Сообщение от Горбаг Посмотреть сообщение
Можно попробовать ввести булевый флаг isOnGround и проверять его при нажатии на пробел.
а еще лучше примерно вот так (из 3D случая, ландшафт по карте высот):
C++
1
2
3
4
5
6
7
8
9
    
               if (FPosition.z <= MapHeight) {
            FPosition.z = MapHeight;
            Acceleration.z = 0;
            Velocity.z = Move.y*10; // при зажатй клавише прыжка Move.x==1
        }
        else {
            Acceleration.z = -Gravity;
        }
0
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 17:33 5
Цитата Сообщение от Горбаг Посмотреть сообщение
Можно попробовать ввести булевый флаг isOnGround и проверять его при нажатии на пробел.
Вопрос был, скорее, в том, как автору, собсно, выбирать значение для isOnGround. Сейчас он, считай, проверяет его в OnCollisionStay, который работает и при соприкосновении со стеной.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
16.07.2015, 17:57 6
Цитата Сообщение от lentinant Посмотреть сообщение
Вопрос был, скорее, в том, как автору, собсно, выбирать значение для isOnGround. Сейчас он, считай, проверяет его в OnCollisionStay, который работает и при соприкосновении со стеной.
Ну дык проверять коллизию только с полом. Если она есть только тогда учитывать нажатие кнопки прыжка.

Добавлено через 1 минуту
т.е. при использовании карты высот примерно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        float MapHeight = Game->Map->GetObjectHeight(FPosition.x, FPosition.y);
        if (MapHeight >= OldPosition.z + MaxStepHeight) {
            FPosition.x = OldPosition.x;
            FPosition.y = OldPosition.y;
            Velocity.x = 0;
            Velocity.y = 0;
            Acceleration.x = 0;
            Acceleration.y = 0;
            MapHeight = OldMapHeight;
        }
        if (FPosition.z <= MapHeight) {
            FPosition.z = MapHeight;
            Acceleration.z = 0;
            Velocity.z = Move.y*10;
        }
        else {
            Acceleration.z = -Gravity;
        }
Как видим проверка коллизий со стенами и полом разделена и все тип-топ
0
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 18:11 7
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
т.е. при использовании карты высот примерно вот так:
Очень сомневаюсь, что ваш код сильно поможет новичку разработки на Unity
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
16.07.2015, 18:16 8
Цитата Сообщение от lentinant Посмотреть сообщение
Очень сомневаюсь, что ваш код сильно поможет новичку разработки на Unity
Ему больше алгоритм чем код нужен. Тут пример алгоритма. Правда больше ориентирован на новичка разработки чего-то подобного Unity а не "на Unity" (код из нутрей самодельного движка). Как понимаю те же данные - где и как произошло пересечение можно вытащить из передаваемой в обработчик col : Collision2D и точно так же обработать.
1
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 18:25 9
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
где и как произошло пересечение можно вытащить из передаваемой в обработчик col : Collision2D и точно так же обработать
Я это первым своим комментом тут и указал.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
16.07.2015, 18:28 10
Цитата Сообщение от lentinant Посмотреть сообщение
Я это первым своим комментом тут и указал.
Ну а я добавил как примерно обрабатывать
0
25 / 25 / 15
Регистрация: 17.02.2014
Сообщений: 310
17.07.2015, 15:56  [ТС] 11
Всем спасибо за помощь
Вот такой я составил код
Javascript
1
2
3
4
5
6
7
8
9
function OnCollisionStay2D (col : Collision2D) 
{
    var Cplayer = gameObject.transform.localScale.y/2-gameObject.transform.position.y;//размер персонажа делится на два (чтобы узнать середину) и добавляется к его позиции
    var Ctexture = col.transform.localScale.y/2+col.transform.position.y;//размер спрайта делится на два (чтобы узнать середину) и добавляется к его позиции
    if (Input.GetKey(KeyCode.Space) && Cplayer > Ctexture)//Если нажать Space и персонаж выше спрайты
    {
        gameObject.transform.position.y+=2;//прыжок
    }
}
Добавлено через 20 часов 18 минут
Я еще немного модифицировал свой код так как коллайдеры не всегда такие же как и размер спрайта, но и он работает не в совершенстве, когда стоять между двумя спрайтами одновременно прыжок удваивается (+3,5 на +7 (3,5+3,5)) как этого избежать ?
Javascript
1
2
3
4
5
6
7
8
9
10
function OnCollisionStay2D (col : Collision2D) 
{
    var Cplayer = gameObject.transform.position.y - gameObject.GetComponent.<BoxCollider2D>().size.y/2;
    var Ctexture = col.transform.position.y + col.collider.GetComponent.<Collider2D>().GetComponent.<BoxCollider2D>().size.y/2;
 
    if (Input.GetKeyDown(KeyCode.Space) && Cplayer > Ctexture)//Если нажать Space и персонаж выше спрайты
    {
        gameObject.transform.position.y+=3.5;//прыжок
    }
}
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
17.07.2015, 19:02 12
Цитата Сообщение от user-men Посмотреть сообщение
как этого избежать
OnCollisionStay2D как понимаю вызывается последовательно для каждого объекта для которого обнаружена коллизия. Заведи внешний флаг что он уже прыгнул (т.е. взводи флаг при прыжке), и при поднятом флаге тоже не прыгай. А в начале каждого цикла просчета коллизий обнуляй флаг.
1
25 / 25 / 15
Регистрация: 17.02.2014
Сообщений: 310
17.07.2015, 21:05  [ТС] 13
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var Prizhok = true;
 
function OnCollisionStay2D (col : Collision2D) 
{
    var Cplayer = gameObject.transform.position.y - gameObject.GetComponent.<BoxCollider2D>().size.y/2;
    var Ctexture = col.transform.position.y + col.collider.GetComponent.<Collider2D>().GetComponent.<BoxCollider2D>().size.y/2;
 
    if (Input.GetKey(KeyCode.Space) && Cplayer > Ctexture && Prizhok)//Если нажать Space и персонаж выше спрайты
    {
        Prizhok=false;
        gameObject.transform.position.y+=3.5;//прыжок
    }
    else
        Prizhok = true;
}
0
17.07.2015, 21:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2015, 21:05
Помогаю со студенческими работами здесь

Прыжок на андроиде
Помогите с кодом для прыжка в CharacterControll, чтобы прыгнуть можно было всего один раз, до...

Прыжок в unity2D
Пробую создать простенькую 2D игру, не получается реализовать прыжки, вернее один прыжок. При...

Прыжок и стрельба в юнити
всем юнитичанам привет! прошу вас помочь в юнити! как сделать прыжок и стрельбу, я знаю что для...

Не могу сделать прыжок
Есть код на прыжок но не могу понять почему он не прыгает(он прыгает как бы, он поднимается в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru