Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2009, 22:16   #21
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Не верный диапазон, нужно:
Код:
for y := 0 to 28 do
for x := 0 to 39 do
Дальше, файл можно типа TextFile, никаких символов, только числа подряд, и отделять строчки не нужно, в кучу все. Оператор read заберет подряд по байту в цикле. Допустим карта теоретически такая:

00000
01110
00000

в файле вот так:

000000111000000

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

Вот точный код загрузки карты:
Код:
// инициализация файла
  AssignFile(f,'map.txt');
  // открыть для чтения
  Reset(f);

  for y := 0 to 28 do
    begin
      for x := 0 to 39 do
        begin
          // считываем символ, s типа Char
          read(f, s);
          // сохраняем в проходимость
          MapMas[x,y].GMove := StrToInt(s);
          // определение текстуры
          if MapMas[x,y].GMove = 1 then MapMas[x,y].GTexture := brg;
          if MapMas[x,y].GMove = 0 then MapMas[x,y].GTexture := wall;
        end;
    end;
  // закрытие файла
  CloseFile(f);
Для создания карт нужно написать редактор, иначе забивать в файл подряд не совсем удобно, но оправдано с точки зрения экономии, лишние переходы тоже весят, это нужно помнить всегда.

Исходник с загрузкой карты в архиве.
Вложения
Тип файла: zip Аркада2.zip (11.4 Кб, 14 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 07.02.2009 в 22:19.
Beermonza вне форума Ответить с цитированием
Старый 08.02.2009, 01:36   #22
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Не верный диапазон, нужно:

Для создания карт нужно написать редактор, иначе забивать в файл подряд не совсем удобно, но оправдано с точки зрения экономии, лишние переходы тоже весят, это нужно помнить всегда.

Исходник с загрузкой карты в архиве.

Все превосходно работает чего думаю и следовало ожидать, следующим шагом в понимании кода я сделал следующее:

Код:
label1.Caption:='UPosX-(UW div cell) ='+inttostr(UPosX-(UW div cell)) ;
     label2.Caption:='UPosY-(UH div cell) ='+inttostr(UPosY-(UH div cell)) ;
     label3.Caption:='UW ='+inttostr(UW) ;
     label4.Caption:='UH ='+inttostr(UH) ;
     label5.Caption:='UMoveX ='+inttostr(UMoveX) ;
     label6.Caption:='USpeedY ='+floattostr(USpeedY);
     label7.Caption:='MapMas[UPosX+1,UPosY+1].GMove= '+ inttostr(MapMas[UPosX+1,UPosY+1].GMove);
     label8.Caption:='MapMas[UPosX-1,UPosY+1].GMove= '+ inttostr(MapMas[UPosX-1,UPosY+1].GMove);
     label9.Caption:='MapMas[UPosX-(UW div cell),UPosY-(UH div cell)].GMove= '+ inttostr(MapMas[UPosX-(UW div cell),UPosY-(UH div cell)].GMove);
Так сказать визуализировать все что происходит на математическом уровне, и вот непонятная вещь происходит которой что-то я не могу дать объяснения:

смотрите рисунок, при столкновении с препятствием наш объект падает вниз, хотя, показывает что:
MapMas[UPosX+1,UPosY+1].GMove=1 и MapMas[UPosX-1,UPosY+1].GMove=1, далее я решил поставить вот что:

Код:
              if UDispX < 0 then begin
          UDispX := 0 ;   // нет смещения
         windows.Beep(100,100); // Подать сигнал 
end;
т.е имеем следующее, условие что = 1 выполняется, но вот видимо
Код:
 UDispX := 0 ;
чего то не хочет, т. к нет, не какого сигнала, но в любом случаи код по сравнению со вчерашним днем стал "прозрачнее".

p.s про редактор еще рановато думать... что -то мне подсказывает.. )
Изображения
Тип файла: jpg 1.jpg (68.0 Кб, 162 просмотров)
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 08.02.2009 в 01:39.
Stanislav вне форума Ответить с цитированием
Старый 08.02.2009, 21:55   #23
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Условия заданы так, что при прыжке и стремлении объекта "влезть" в щель, выпадает один момент, когда условия смотрят выше и ниже препятствий, соответственно упуская из виду пол под ногами, вот и происходит провал.
Нужна часть системы поиска пути, волновой вариант, причем на несколько клеток от объекта, на сколько? - это определяется делением нацело размера объекта на размер клетки, и дальше отсторйка смещений.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.02.2009, 22:49   #24
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Условия заданы так, что при прыжке и стремлении объекта "влезть" в щель, выпадает один момент, когда условия смотрят выше и ниже препятствий, соответственно упуская из виду пол под ногами, вот и происходит провал.
Из выше написаного не пойму лишь одного: что значит "упуская из виду" а почему нельзя приминить?

Код:
 if (условие слева) or (условие справа) or (условие под нагами) then // нет смещения, другими словами в нашем случаи не падать
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 09.02.2009, 00:10   #25
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Дело в том, что смотреть нужно не только справа, слева, сверху и под ногами, ...объект крупнее одной клетки карты, поэтому нужен цикл который перебирает клетки карты от исходной по часовой стрелке например:

xxx
x0x
xxx

0 - это точная позиция объекта, а крестиками показано сканирование карты на предмет препятствий. Условие одно - если есть хоть в одной из этих клеток препятствие, то нельзя двигаться, и куда нельзя определяется по номеру. Все это справедливо для объекта с размерами превышающими размер клетки карты в 2 раза или чуть больше, ...до 3-х кратного. Если объект в 3 раза крупнее, то нужно двойной цикл:

xxxxx
xxxxx
xx0xx
xxxxx
xxxxx

Вопрос на засыпку: если в качестве препятствия будет еще один такой же крупный объект, что нужно делать для правильной отработки столкновений?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 09.02.2009, 00:51   #26
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
0 - это точная позиция объекта, а крестиками показано сканирование карты на предмет препятствий. Условие одно - если есть хоть в одной из этих клеток препятствие, то нельзя двигаться, и куда нельзя определяется по номеру. Все это справедливо для объекта с размерами превышающими размер клетки карты в 2 раза или чуть больше, ...до 3-х кратного. Если объект в 3 раза крупнее, то нужно двойной цикл:


Вопрос на засыпку: если в качестве препятствия будет еще один такой же крупный объект, что нужно делать для правильной отработки столкновений?

Честно говоря, я в замешательстве: в плане математики, что делает этот код?

Каждые 10 мск запускаем цикл и проверяем всех наших юнитов на предмет столкновения:



Код:
for i:=0 to 1 do  // количество юнитов - 1
    begin
      with UnitMas[i] do  // работаем с массивом
        begin
          // проверка на столкновение справа по уровню 0
          if ((MapMas[UPosX+(UW div cell),UPosY].GMove = 1)
              and (UMoveX >= (UW div 2 - cell))) or (UPosX > 38) then
            begin
              if UDispX > 0 then UDispX := 0       // нет смещения
            end;

          // проверка на столкновение слвева по уровню 0
          if ((MapMas[UPosX-(UW div cell),UPosY].GMove = 1)
              and (UMoveX <= -(UW div 2 - cell))) or (UPosX < 1) then
            begin
              if UDispX < 0 then UDispX := 0       // нет смещения
            end;
Это работает правильно если размер юнита равен размеру клетки? для того что бы увеличить обзор по x,y относительно точного нашего расположения на карте нам нужно прогнать еще один цикл но с другими условиями проверки? Нет, я лучше пока покопаюсь сам.. а по поводу вашего вопроса, пусть он будет пока для меня риторическим. )
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 09.02.2009, 15:47   #27
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Stanislav
Честно говоря, я в замешательстве: в плане математики, что делает этот код?
Все просто, он смотрит все соседние клетки карты вокруг текущей позиции и запрещает двигаться в определенных направлениях. Например, код в цикле сканирования "обнаружил" снизу стену, значит нужно выключить гравитацию (оставаться на месте по-Y).


Цитата:
Сообщение от Stanislav
Код:


for i:=0 to 1 do // количество юнитов - 1
begin
with UnitMas[i] do // работаем с массивом
begin
// проверка на столкновение справа по уровню 0
if ((MapMas[UPosX+(UW div cell),UPosY].GMove = 1)
and (UMoveX >= (UW div 2 - cell))) or (UPosX > 38) then
begin
if UDispX > 0 then UDispX := 0 // нет смещения
end;

// проверка на столкновение слвева по уровню 0
if ((MapMas[UPosX-(UW div cell),UPosY].GMove = 1)
and (UMoveX <= -(UW div 2 - cell))) or (UPosX < 1) then
begin
if UDispX < 0 then UDispX := 0 // нет смещения
end;

Это работает правильно если размер юнита равен размеру клетки? для того что бы увеличить обзор по x,y относительно точного нашего расположения на карте нам нужно прогнать еще один цикл но с другими условиями проверки? Нет, я лучше пока покопаюсь сам.. а по поводу вашего вопроса, пусть он будет пока для меня риторическим. )
Хорошо, хозяин - барин, ...текущие условия справедливы до 2-х кратного размера объекта по отношению к размеру клетки, но там не все варианты.
Если нужно чтобы было все крупнее, то можно просто размер клеток карты задать побольше, и пропорционально размеры объекта увеличить, все зависит от поставленной задачи, ...кстати что поставлено целью? ...для чего нужны маленькие клетки карты и крупные объекты?

Само сканирование карты выполняется просто:

Код:
t := 0;

for y := (UPosY-1) to (UPosY+1) do
  begin
    z := 0;
    inc(t);
    for x := (UPosX-1) to (UPosX+1) do
      begin
        inc(z);
        // не смотреть саму позицию объекта
        if (y <> UPosY) and (x <> UPosX) then
          begin
            if (t = 1) and (z = 2) then
              begin
                // остановить прыжок (потолок)
              end;

            if (t = 2) and (z = 1) then
              begin
                // нельзя передвигаться влево
              end;

            if (t = 2) and (z = 3) then
              begin
                // нельзя передвигаться вправо
              end;

            if (t = 3) and (z = 2) then
              begin
                // нельзя падать (пол)
              end;
          end;
      end;
  end;
...вот по такой схеме нужно пробовать. Это мини "поиск пути", намного удобнее, не нужно каждому объекту смотреть где остальные, достаточно смотреть что вокруг "себя". Разный код препятствия в карте поможет определять что делать с ним, можно уничтожить (если противник) или просто нельзя перемещаться (стены).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.02.2009, 22:51   #28
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
кстати что поставлено целью?
Все очень просто, ответ кроиться в теме этого топика: коллизии. Честно говоря, думал, что столкновения в 2 d мире схожи с 3 d, но покопавшись, обнаружил, что это не совсем так, вот выдержка из одной статьи:
(один из вариантов) Столкновение сферы со сферой вокруг полигона или чего там еще описывается сфера, и перед объектом который движется, а далее:


Цитата:
"Сфера задается с помощью ее центра и ее радиуса. Столкновение двух сфер определить легко. (// да действительно легко, если знать геометрию...и знать как эту сферу на полигон натянуть или на что то другое) Находя расстояние между двумя центрами (метод dist класса TVector) мы можем это определить, пересекаются ли они, если расстояние меньше, чем сумма их радиусов."
и что самое интересное исходники встречаются только на "си" а из си я знаю, что си это буква алфавита. вообщем нашел такой вот компонент
glscene но вот установить его уже пытаюсь 2-3 день, перечитал все инструкции и на этом форуме и в других местах, но вставать, что-то не хочет (точнее встает но криво)

Вот собственно и цель, а на вопрос
Цитата:
для чего нужны маленькие клетки карты и крупные объекты
отвечу так.

А для того чтобы разобраться, разве не интересно? (да и сами видите, что знания оставляют желать лучшего) или просто взять чужие исходники наложить "шкуру" и сказать вот посмотрите я написал! только вот получиться что это не я написал, а за меня написали.

так что продолжаю "юзать" ваш "движок" (если вы не против что я его так нарикаю) посмотрите, кстати, что я там на юзал, (размер клетки 32 на 32) (и у объектов, кстати, тоже) карта пока в виде
1000001
1000001
сами понимаете так легче править.

p.s Я вот что думаю сейчас уже можно танчики писать используя ваш "движок" (можно и по сети, на сокетах например),
и по вложению, не помогли бы вы с физикой? точнее когда вы посмотрите я объясню что хочу, а вы на путь истиный меня поставьте..
Вложения
Тип файла: rar space.rar (199.8 Кб, 9 просмотров)
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 10.02.2009 в 22:55.
Stanislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
collision detection challengerr Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 10.01.2009 20:53
Нужна помощь!!)) ТРОЯН=) Паскаль, Turbo Pascal, PascalABC.NET 2 29.12.2008 21:42
Нужна помощь BreeZe Помощь студентам 1 14.05.2007 21:38