Четверг, 18 Апреля 2024, 05:08

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Физика 2д платформера.
Физика 2д платформера.
AlkoshaДата: Среда, 11 Июня 2014, 14:45 | Сообщение # 1
участник
Сейчас нет на сайте
Платформер у меня обрабатывается по битмапе, в смысле столкновения персонажа с граундом.

Вот пока как-то кривовато это дело происходит, а именно выталкивание персонажа из под "земли".

То после прыжка с высокой платформы он на половину застряёт в ячейках, и вдоль них может ходить и так же можно продолжать прыгать на том же уровне, то как раз впритык ячейке состыковка... ай, короче. Кажись я непонятно пояснил.
Рабочая программа прилагается, дабы глянуть поведение персонажа (управление ADW)


Вот класс физики.
Собственно запара в функции gravitation().

Код
class Physix
{
public:

void wallcollis()
{
            int centery=pers.y/32;
int centerx=pers.x/32;
// стена слева
         if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B')
                        {
                        if (pers.dx<0)
                            {

                            pers.dx=0;

                            }
                        }
// стена справа
         if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B')
                        {
                        if (pers.dx>0)
                            {

                            pers.dx=0;

                            }
                        }
                        if(pers.onGround)pers.x+=pers.dx;
}

void gravitation()
{
        int centery=pers.y/32;
int centerx=pers.x/32;
        if (!pers.onGround)
            {
            pers.dy=pers.dy+0.9;
            pers.x+=pers.dx;
            }
            pers.y+=pers.dy;
                pers.onGround=false;

                    if(collisMap.bitmap[centery+1][centerx]=='B')
                        {pers.onGround=true;

                        if (pers.dy>0)
                            {
                            pers.dy=0;

                            }
                        }

            if(collisMap.bitmap[centery][centerx]=='B')
                        {pers.onGround=true;
                         pers.y-=8;
                        if (pers.dy>0)
                            {
                            pers.dy=0;
                            }
                        }

}

};
Physix phys;


Добавлено (11.06.2014, 14:44)
---------------------------------------------
Где dx dy - ускорения по соответствущим осям.
onGround - флаг нахождения на земле.
bitmap[][] - двумерный массив char'ов , где символ "B" обозначает земную твердь.
ну в общем и всё.

Добавлено (11.06.2014, 14:45)
---------------------------------------------
Подозрение на погрешности при переводе float'a в int


Сообщение отредактировал Alkosha - Среда, 11 Июня 2014, 14:54
RomanNVKZДата: Среда, 11 Июня 2014, 19:33 | Сообщение # 2
участник
Сейчас нет на сайте
Возьми Box2D и не парься

Добавлено (11.06.2014, 19:32)
---------------------------------------------
Да, слишком мощно для обычного платформера, но сильно облегчает задачу со временем

Добавлено (11.06.2014, 19:33)
---------------------------------------------
Да, слишком мощно для обычного платформера, но сильно облегчает задачу со временем

Добавлено (11.06.2014, 19:33)
---------------------------------------------
Возьми Box2D и не парься




ДиггерДата: Пятница, 20 Июня 2014, 10:16 | Сообщение # 3
частый гость
Сейчас нет на сайте
Перезалей пример на Яндекс. Да, и вот так будет лучше читаться:
Код

class Physix{   
     public:   
         
        void wallcollis(){   
            int centery=pers.y/32;   
            int centerx=pers.x/32;   
// стена слева   
            if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B') {   
                      
               if (pers.dx<0) {   
                  pers.dx=0;   
               }   
            }   
// стена справа   
            if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B') {   
               if (pers.dx>0){   
                  pers.dx=0;   
               }   
            }   
                           
            if(pers.onGround)pers.x+=pers.dx;   
        }   

void gravitation() {   
            
     int centery=pers.y/32;   
     int centerx=pers.x/32;   
            
     if (!pers.onGround){   
        pers.dy=pers.dy+0.9;   
        pers.x+=pers.dx;   
     }   
                
     pers.y+=pers.dy;   
     pers.onGround=false;   

     if(collisMap.bitmap[centery+1][centerx]=='B'){
        pers.onGround=true;   
        if (pers.dy>0){   
           pers.dy=0;
        }   
     }   

     if(collisMap.bitmap[centery][centerx]=='B'){
        pers.onGround=true;   
        pers.y-=8;   
        if (pers.dy>0){   
           pers.dy=0;   
        }   
     }   
}   
};
     
Physix phys;   


Сообщение отредактировал Диггер - Пятница, 20 Июня 2014, 10:32
AlkoshaДата: Пятница, 20 Июня 2014, 22:07 | Сообщение # 4
участник
Сейчас нет на сайте
Сейчас он немного отличается от того, что было в первом посте.
И класс физики тож чуток изменился, вроде.

Код
class Physix
{
public:

void wallcollis()
{
         int centery=pers.y/32;
int centerx=pers.x/32;
// стена слева
      if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B')
                     {
                     if (pers.dx<0)
                         {

                         pers.dx=0;

                         }
                     }

// стена справа
      if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B')
                     {
                     if (pers.dx>0)
                         {

                         pers.dx=0;

                         }
                     }
                     if(pers.onGround)pers.x+=pers.dx;

//сверху
  if(collisMap.bitmap[centery-1][centerx]=='B')
                     {
                     if (pers.dy<0)
                         {

                         pers.dy=0;

                         }
                     }

}

void gravitation()
{
     int centery=pers.y/32;
int centerx=pers.x/32;
     if (!pers.onGround)
         {
             pers.dy=pers.dy+1;
         pers.x+=pers.dx;
         }
         pers.y+=pers.dy;
         pers.onGround=false;
                 if(collisMap.bitmap[centery+1][centerx]=='B')
                     {pers.onGround=true;
                     if (pers.dy>=0)
                         {pers.y=centery*32;
                         pers.dy=0;

                         }
                     }
         if(collisMap.bitmap[centery][centerx]=='B')
                     {pers.onGround=true;
                      pers.y=centery*32-1;
                     if (pers.dy>0)
                         {
                         pers.dy=0;

                         }
                     }

}

};
Physix phys;


Нынешнее состояние моего горе-платформера.
Сдёрни

Добавлено (20.06.2014, 22:07)
---------------------------------------------
Всё равно по наклонным поверхностям он рахитно передвигается.

RomanNVKZДата: Понедельник, 23 Июня 2014, 13:56 | Сообщение # 5
участник
Сейчас нет на сайте
Ну, для начала, ты лучше напиши некие классы физических объектов, и создай в классе физики для них контейнеры. При создании персонажа или других игровых объектов просто добавляй в них физические объекты, инициализируй и добавляй их в этот пресловутый класс физики. Потом просто вызывай ф-цию кадра физического движка, а там уже обрабатывай и т.д.

Кстати, на чем пишешь?




AlkoshaДата: Понедельник, 23 Июня 2014, 13:59 | Сообщение # 6
участник
Сейчас нет на сайте
Цитата RomanNVKZ ()
Кстати, на чем пишешь?


Очевидо, что на Бейсике. sad
SaiteiДата: Понедельник, 23 Июня 2014, 14:28 | Сообщение # 7
старожил
Сейчас нет на сайте
Цитата Alkosha ()
Очевидо, что на Бейсике.

biggrin biggrin
тык <- там есть ответ
AlkoshaДата: Понедельник, 23 Июня 2014, 14:58 | Сообщение # 8
участник
Сейчас нет на сайте
Цитата Saitei ()
тык <- там есть ответ


Ну дык, если ячейки как в Марио раскидать, то у меня всё в порядке.

В первой части марио броуз (клон которого рассматривается в варианте по SFML) не было наклонных поверхностей, а у меня как раз запара именно с наклонными поверхностями. Я имею ввиду нет интерполяции перехода от ячейки к ячейке, когда поднимается вверх, и когда спускается, больше планирует за счёт свободного падения (как это визуально выглядит, можно глянуть в том примере, который я скинул)

Добавлено (23.06.2014, 14:58)
---------------------------------------------
Вот в диззи фантастик эдвэнче тоже по двумерному массиву определялась коллизия, и там тоже заметно эти ячейки, тем не менее, там он гораздо плавнее двигался по склонам.

Сообщение отредактировал Alkosha - Понедельник, 23 Июня 2014, 14:56
Форум игроделов » Программирование » C/C++ » Физика 2д платформера.
  • Страница 1 из 1
  • 1
Поиск:

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