1 голос
 
653 просмотра
10.05.2021 / 07:04  GOAR

Как составить столкновения в объектом с 4-х сторон??

Всем привет, такой вопрос, как составить столкновение , что при достижении разных сторон , как определить?

ширина обьектов : 48х48
ширина героя: 48х96
  1. var right,left,up,down:boolean; // проверка сторон
  2.        obj: array[0..3,0..2] of integer; // карта
  3.        x,y:integer; // координаты героя
  4.        i,j:integer; // для цикла
  5. begin
  6. for i:=0 to 3 do
  7.  for j:=0 to 2 do
  8.  
  9. if ((x+48)>j*48) and (x<j*48+48) then
  10.   if ((y+96)>i*48) and (y<i*48+96) then
  11.    if obj[j,i]>0 then
  12. begin
  13. // вот тут мне надо определить, с какой стороны столкнулся ( + надо преверять столкновение с полом и стеной одновременно)
  14. // допустим если столкнулся с полом то, down:=true;
  15. end;
  16. end.
поможете , пожалуйста
Изм. aNNiMON от 10.05.2021 / 10:32
10.05.2021 / 09:06  aNNiMON
По коду не понял, у тебя тайловая карта с видом сверху или платформер с видом сбоку?
Ответы
 
1 голос
 
# 10.05.2021 / 11:19  aNNiMON
Если написать функцию для проверки столкновения, то станет проще разбираться.
Чтобы понять, с какой стороны произошло столкновение, можно проверять координаты не по всему объекту, а по его половинам.
  1. const
  2.   PLAYER_WIDTH = 48,
  3.   PLAYER_HEIGHT = 96,
  4.   OBJ_WIDTH = 48,
  5.   OBJ_HEIGHT = 48;
  6. var right, left, up, down: boolean;
  7. // ...
  8.  
  9. // Функция проверки нахождения точки в пределах заданного промежутка
  10. function inRange(v: integer, min: integer, max: integer): boolean;
  11. begin
  12.   inRange := (v >= min) and (v <= max);
  13. end;
  14.  
  15. function checkCollision(playerX: integer, playerY: integer, x: integer, y: integer): boolean;
  16. begin
  17.   // сбрасываем флаги столкновений
  18.   left := false;
  19.   right := false;
  20.   up := false;
  21.   down := false;
  22.  
  23.   // Горизонтальная проверка
  24.   if inRange(playerX + PLAYER_WIDTH, x, x + OBJ_WIDTH / 2) then
  25.     // если правая точка игрока в пределах левой части объекта (x..x+W/2),
  26.     // то это столкновение слева
  27.     left := true;
  28.   else if inRange(playerX, x + OBJ_WIDTH / 2, x + OBJ_WIDTH) then
  29.     // если левая точка игрока в пределах правой части объекта (x+W/2..x+W),
  30.     // то это столкновение справа
  31.     right := true;
  32.  
  33.   // Вертикальная проверка
  34.   if inRange(playerY + PLAYER_HEIGHT, y, y + OBJ_HEIGHT / 2) then
  35.     // если верхняя точка игрока в пределах нижней части объекта (y..y+H/2),
  36.     // то это столкновение снизу
  37.     down := true;
  38.   else if inRange(playerY, y + OBJ_HEIGHT / 2, y + OBJ_HEIGHT) then
  39.     // если нижняя точка игрока в пределах верхней части объекта (y+H/2..y+H),
  40.     // то это столкновение сверху
  41.     up := true;
  42.  
  43.   // Возвращаем результат функции, true — если хотя бы одна из сторон столкнулась с объектом
  44.   checkCollision := left or right or up or down;
  45. end;
  46.  
  47. // ...
  48.  
  49. for i:=0 to 3 do
  50.   for j:=0 to 2 do
  51.     if obj[j, i] > 0 and checkCollision(x, y, i * OBJ_WIDTH, j * OBJ_HEIGHT) then
  52.     begin
  53.       // есть столкновение и во флагах left, right, up, down можно проверить с какой стороны
  54.     end;
Изм. aNNiMON от 10.05.2021 / 11:22
10.05.2021 / 11:29  GOAR
Попробую, а так вид сбоку, если что
10.05.2021 / 11:38  GOAR
для вида сбоку подойдёт??
10.05.2021 / 19:10  aNNiMON
Да
11.05.2021 / 05:18  GOAR
Почему-то столкновение от середины тайла, как поправить?
Всего: 1

Реклама

Мы в соцсетях

tw tg yt gt