Физика 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) --------------------------------------------- Всё равно по наклонным поверхностям он рахитно передвигается.
|
|
| |
|
Alkosha | Дата: Понедельник, 23 Июня 2014, 13:59 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Цитата RomanNVKZ ( ) Кстати, на чем пишешь?
Очевидо, что на Бейсике.
|
|
| |
Saitei | Дата: Понедельник, 23 Июня 2014, 14:28 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Цитата Alkosha ( ) Очевидо, что на Бейсике. тык <- там есть ответ
|
|
| |
Alkosha | Дата: Понедельник, 23 Июня 2014, 14:58 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Цитата Saitei ( ) тык <- там есть ответ
Ну дык, если ячейки как в Марио раскидать, то у меня всё в порядке.
В первой части марио броуз (клон которого рассматривается в варианте по SFML) не было наклонных поверхностей, а у меня как раз запара именно с наклонными поверхностями. Я имею ввиду нет интерполяции перехода от ячейки к ячейке, когда поднимается вверх, и когда спускается, больше планирует за счёт свободного падения (как это визуально выглядит, можно глянуть в том примере, который я скинул)Добавлено (23.06.2014, 14:58) --------------------------------------------- Вот в диззи фантастик эдвэнче тоже по двумерному массиву определялась коллизия, и там тоже заметно эти ячейки, тем не менее, там он гораздо плавнее двигался по склонам.
Сообщение отредактировал Alkosha - Понедельник, 23 Июня 2014, 14:56 |
|
| |