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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 20:09   #1
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
Вопрос Реализация препятствия

Преветствую! У меня есть файл с цифрами от 1 до 6. Вот так рисую карту:
Код:
    for y:=0 to 22 do
       for x:=0 to 28 do
    case  MapMas[x,y] of
     '0':bitbuf.Canvas.Draw(x*cell,y*cell,wall0);
     '1':bitbuf.Canvas.Draw(x*cell,y*cell,steal);
     '2':bitbuf.Canvas.Draw(x*cell,y*cell,ladder);
     '3':bitbuf.Canvas.Draw(x*cell,y*cell,wall1);
     '4':bitbuf.Canvas.Draw(x*cell,y*cell,exit);
     '5':bitbuf.Canvas.Draw(x*cell,y*cell,gold);
     '6':bitbuf.Canvas.Draw(x*cell,y*cell,water);
        end;
Хотел реализовать препятствия типо:
Код:
  if keypressed(37) then
     begin
       Player.texture.LoadFromFile('111.bmp');
       if (mapmas[x,y]='0') then 
           begin
              ....
              player.X:=player.X-4;
          end;
       if (mapmas[x,y]='1') then 
           begin
           player.X:=player.X;
           end;
Но не получилось... Подскажите пожалуйста как это можно сделать?
[BeNdeR] вне форума Ответить с цитированием
Старый 25.05.2011, 22:17   #2
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

что это такое? это нормально? Кэпу привет! =)
Код:
player.X:=player.X;
xrob вне форума Ответить с цитированием
Старый 26.05.2011, 00:23   #3
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Какая разница! Ну можно и не писать! Лучше подсказал бы, как препятствие реализовать!
[BeNdeR] вне форума Ответить с цитированием
Старый 26.05.2011, 06:50   #4
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Настоятельно советую Вам прочитать журнал "ПРОграммист" №14 (ст. 16-21) про волновой алгоритм. Иначе, Я чувствую, Вы полезете в такие дебри матанализа...
Виталий Желтяков вне форума Ответить с цитированием
Старый 26.05.2011, 08:23   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

погляди как я сделал практичеси подобную твоей вещь :
http://programmersforum.ru/showthread.php?t=139451
phomm вне форума Ответить с цитированием
Старый 26.05.2011, 12:05   #6
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Реализовать коллизию что-ли?
VintProg вне форума Ответить с цитированием
Старый 26.05.2011, 23:07   #7
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию на счет препятствия

У меня каждая клетка карты имеет несколько значений, одно из которых - проходимость, типа boolean (т.е. может в этой клетке находится персонаж или нет)
и в обработчике движения персонажа я сравниваю следующую клетку, в которую должен переместится персонаж, с истиной, если возможно - двигаемся иначе - останавливаемся

как реализовать?

Код:

 map = packed record  //ячейка карты
    layer1:              Byte;    // низший слой (id текстуры поверхности)
    layer2:              Byte;    // средный слой (id текстуры объекта на поверхности)
    prohod:              boolean; // проходимость
  end;

person = packed record
PosX, PosY:byte; // позиция персонажа в игровом поле
end;

var 
maparray: array [1..6, 1..6] of map;
pers:person;
... 
// при обработке движения персонажа сверяем следующую клетку куда он должен наступить

// обработка движения вниз
if map[x,y+1].prohod then pers.posY:=pers.posY+1// можно двигатся вперед
else // остановится

// обработка движения вверх
if map[x,y-1].prohod then pers.posY:=pers.posY-1// можно двигатся вперед
else // остановится

// обработка движения влево
if map[x-1,y].prohod then pers.posX:=pers.posX-1// можно двигатся вперед
else // остановится

// обработка движения вправо
if map[x+1,y].prohod then pers.posX:=pers.posX+1// можно двигатся вперед
else // остановится
но если речь идет об обходе препятствий - это уже другой алгоритм -
в поисковике набираешь - алгоритм нахождения кратчайшего пути!
Daemonghost вне форума Ответить с цитированием
Старый 27.05.2011, 00:07   #8
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Как я понимаю в примере реализован граф?А зачем нам слои?И ещё небольшая проблемка
Код:
11111111111111111111111111111
10000000000000000000000002001
12330023300000002333330002001
12330023323233333333332332301
12332320000200000000040002001
12000020000200000002333330001
12000020003333333332000002001
12000020000000000033322222001
12033323323300500000020002001
12000020000333333330020002001
12000020000000505000020002001
12003333323323303333020002001
12000000000020000000020002001
13223320000020003330020023001
10000020000023323332330023331
15000333333020000000000020501
13300000000020000000323023301
15000323333333323300020020301
13330020000000000003323330301
10000023333333323000020005301
10000020000000000000020033301
11111116666666666666611111111
многовато true false переписывать. Хотя можно вот так попробывать
Код:
case  MapMas[x,y] of
    '0':begin 
              bitbuf.Canvas.Draw(x*cell,y*cell,wall0);
              prohod:=true;
        end;
...
Попробывал... если я обьявляю свой массив типом map, то программа не может считать мой текстовый файл.

Последний раз редактировалось [BeNdeR]; 27.05.2011 в 00:28.
[BeNdeR] вне форума Ответить с цитированием
Старый 27.05.2011, 01:08   #9
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от [BeNdeR] Посмотреть сообщение
Как я понимаю в примере реализован граф?А зачем нам слои?И ещё небольшая проблемка
....
многовато true false переписывать. Хотя можно вот так попробывать
Код:
case  MapMas[x,y] of
    '0':begin 
              bitbuf.Canvas.Draw(x*cell,y*cell,wall0);
              prohod:=true;
        end;
...
Попробывал... если я обьявляю свой массив типом map, то программа не может считать мой текстовый файл.
согласен ,что не сможет считать файл, дабы я использую типизированный файл map, а ты текстовый, предлагаю делать еще один файл в котором будут указаны ID, которые используются в карте, а рядом/ниже будет располагаться указатель на проходимость и при загрузки карты ты загружаешь отдельный массив проходимости, а после с согласованием ячейки карты и сравнения этого массива ты получишь тот же самый эффект.

Пример файла
0 1
1 0
2 1
3 1
4 1
5 1
6 0

где 0-6 твои ID, 0 - нельзя пройти, 1 - можно.

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

Последний раз редактировалось Daemonghost; 27.05.2011 в 01:10.
Daemonghost вне форума Ответить с цитированием
Старый 27.05.2011, 11:02   #10
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

А если я буду использовать типизированный файл, то
Код:
case  MapMas[x,y] of
    '0':begin 
              bitbuf.Canvas.Draw(x*cell,y*cell,wall0);
              prohod:=true;
        end;
будет работать. Просто мне кроме препятствий ещё и предметы на карте реализовывать.
[BeNdeR] вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление препятствия в игру или закраска столбца в StringGrid Arm!n Помощь студентам 1 29.12.2010 21:23
Реализация stopvirus Общие вопросы Delphi 12 24.12.2010 19:44
Как соединить 2 image ломаной линией, обходящей препятствия (другие визуальные компоненты) Zerofill Помощь студентам 0 08.03.2010 00:15
Препятствия! anton14 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 01.02.2009 12:50
Препятствия в игре. Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 07.06.2008 14:14