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

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

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

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

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

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

Код:
for y:=0 to 28 do
    begin
      for x:=0 to 39 do
        begin
          if (y=28)
             or ((y=25) and (x>=5) and (x<=10))
             or ((y=23) and (x>=15) and (x<=20))
             or ((y=21) and (x>=25) and (x<=30)) then
            begin
              // картинка мостика, "в нем" ходить нельзя
              MapMas[x,y].TGTexture:=brg;
              MapMas[x,y].TGMove:=1;
            end
          else
            begin
              // картинка заднего фона, ходить можно
              MapMas[x,y].TGTexture:=wall;
              MapMas[x,y].TGMove:=0;
            end;
        end;
    end;
И вот вопрос!) Что делать если у меня обьектов много, а не 2-ва?

Последний раз редактировалось Serge_Bliznykov; 28.04.2011 в 20:54.
[BeNdeR] вне форума Ответить с цитированием
Старый 26.04.2011, 19:20   #2
Jakethefish
Форумчанин
 
Регистрация: 13.11.2009
Сообщений: 121
По умолчанию

Какая логика распределения объектов?
Если условия как в твоем примере, то только условиями и пилить.
Если рандом, то просто раскидывать рандомно.

Реализаций много, смотря что ты хочешь. К примеру:
Код:
a := ((x-y)/25)^(x+y) mod 5;

MapMas[x,y].TGTexture:=texture_array[a][0];
MapMas[x,y].TGMove:=texture_array[a][1];
Извращение, но кто сказал что программисты нормальные люди :D
Jakethefish вне форума Ответить с цитированием
Старый 26.04.2011, 23:39   #3
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Код:
for y:=0 to 21 do
    begin
      for x:=0 to 28 do
        begin
          if (y=22)
             or ((y=18) and (x>=5) and (x<=10))
             or ((y=15) and (x>=15) and (x<=20))
             or ((y=10) and (x>=15) and (x<=18)) then
            begin
              MapMas[x,y].TGTexture:=wall;
              MapMas[x,y].TGMove:=1;
            end;
            if (y=22)
             or ((y=21) and (x>=0) and (x<=29))
             or ((y=0) and (x>=0) and (x<=29))
             or ((x=0) and (y>=0) and (y<=22))
             or ((x=28) and (y>=0) and (y<=29)) then
            begin
             
              MapMas[x,y].TGTexture:=Steal;
              MapMas[x,y].TGMove:=1;
            end
          else
            begin
              MapMas[x,y].TGTexture:=gold;
              MapMas[x,y].TGMove:=0;
            end;
        end;
    end;
Когда я 2 раза делаю if, то он рисует только 1-но условие!

Последний раз редактировалось [BeNdeR]; 26.04.2011 в 23:58.
[BeNdeR] вне форума Ответить с цитированием
Старый 27.04.2011, 18:24   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

я не смог вчера написать по данному поводу, напишу сейчас

Такие вещи лучше делать файлом, где каждой клеточке дан некий индекс и по данному индексу грузится и текстура и проходимость

рисовать карту ифами - милое конечно дело, но ты точно убьёшься ...

альтернативный файлам вариант - создать массивы и заполнить их прямо в коде, вроде такого :
Код:
map1 : array [1..5,1..5] of byte=
(
(1,1,1,1,1),
(1,0,0,0,1),
(1,0,2,0,1),
(1,0,0,0,1),
(1,1,1,1,1)
);
phomm вне форума Ответить с цитированием
Старый 27.04.2011, 21:03   #5
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

У меня в игре 7 различных объектов, так заполнять тож не сладко!) Я правда сначала массивом и хотел делать, наверно придётся вернуться к этому методу!
Во что получилось:
Код:
11111111111111111111111111111
10000000000000000000000002001
12330023300000002333330002001
12330023323233333333332332301
12332320000200000000040002001
12000020000200000002333330001
12000020003333333332000002001
12000020000000000033322222001
12033323323300500000020002001
12000020000333333330020002001
12000020000000505000020002001
12003333323323303333020002001
12000000000020000000020002001
13223320000020003330020023001
10000020000023323332330023331
15000333333020000000000020501
13300000000020000000323023301
15000323333333323300020020301
13330020000000000003323330301
10000023333333323000020005301
10000020000000000000020033301
11111116666666666666611111111
)))))))
Вопросик! Массив должен обязательно быть char? Я просто хотел
Код:
Type
  TGameMap = object
  TGTexture: TBitmap; //картинка
  TGMove:    Byte;   //1-препятствие 0-ничего нет
....
MapMas: array[0..28, 0..21] of  TGameMap;
А потом что-то типа
Код:
case  MapMas[x,y] of
    '1':MapMas[x,y].TGTexture:=steal;
        MapMas[x,y].TGMove:=0;
    '2':...
        end;

Последний раз редактировалось [BeNdeR]; 27.04.2011 в 22:07.
[BeNdeR] вне форума Ответить с цитированием
Старый 28.04.2011, 16:50   #6
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
альтернативный файлам вариант - создать массивы и заполнить их прямо в коде, вроде такого :
Код:
map1 : array [1..5,1..5] of byte=
(
(1,1,1,1,1),
(1,0,0,0,1),
(1,0,2,0,1),
(1,0,0,0,1),
(1,1,1,1,1)
);
Чтобы создавать нестандартные карты нужен редактор, все карты должны быть в файлах, ...так делает разумное сообщество программистов, а создание в коде - точно вас убьет, если по каждому случаю нужно лезть в код и править, ...нерационально.

[BeNdeR], тип char нужен для того, чтобы задействовать еще и символы кодировки, а не только цифры, так больше вариантов, ...уже не 10, а 220. Например, G - земля темная, g - земля светлая, T - дерево большое, t - дерево маленькое, W - стена, w - разваленная стена и тд. т.п. Если нужно больше, то бери на клетку карты по 2 байта, тогда можно разбить текстуры на 10 типов: T1 - дуб, Т2 - тополь, Т3 - ясень, Т4 - клен, Т5 - орех, Т6 - кедр, Т7 - ель, Т8 - лиственница и тд. и т.п. Аналогично с поверхностью. Можно, и даже нужно отделить поверхность от объектов. В файле карты будет два массива кодирования один под другим. Правила считывания будут сразу заложены в код редактора и игры.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 28.04.2011, 19:26   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Beermonza , я привел этот способ всё-таки в альтернативу файлам, которые я описал в начале (как бы , по логике, способ более приоритетный, вот и описан сперва)

А насчет ЧАРов ТС спрашивал , как я полагаю , вот в каком ключе :
использовать не чары а тип byte и оперировать и для карты и для программы 256 вариантами , тогда выглядеть код будет так :
Код:
Type
  TGameMap = object
  TGTexture: TBitmap; //картинка
  TGMove:    Byte;   //1-препятствие 0-ничего нет
  TGtype : byte; // индекс типа клетки

const mapwidth = 29;
mapheight = 22
var 
MapMas: array[0..mapheight-1, 0..mapwidth-1] of  TGameMap;
...

case  MapMas[y,x].TGtype of // индексация 2мерных массивов - сперва строка, потом столбец !!!
    0:MapMas[y,x].TGTexture:=steal;
        MapMas[y,x].TGMove:=0;
    1:...
...
    255:...
        end;
...
function loadmap(fname : string) : boolean; // функция чтения карты - возращает true при удачном чтении файла, который передаётся по имени
var fs : tfilestream;
y,x : integer;
b : byte;
begin
try
fs := tfilestream.create(fname, fmopenread); // создать поток и передать имя файла для чтения
y := 0;
x := 0;
while fs.position <> fs.size do begin // цикл пока не достигнут конец файла (позиция - с нуля, поэтому когда она = размеру, то это конец файла)
if x = width // если вышли за ширину карты
  then begin
  inc(y); // то перейти на след строку карты
  x := 0;
  else inc(x); // иначе прочесть по следующему столбцу
if y = height // если вышли за высоту карты
  then break; // то завершим цикл
fs.read(b, sizeof(b)); // прочитаем в переменную B количество данных равных её размеру - для byte это 1
mapmas[y,x].tgtype := b; // запомним в карту этот тип клетки
end;
result := true; // по окончанию цикла отметим что чтение карты успешно
except
result := false; // при проблемах - отметим что не прочиталась карта
end;
freeandnil(fs); // освободим поток
end;
phomm вне форума Ответить с цитированием
Старый 28.04.2011, 21:26   #8
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

phomm, разумеется, File Of Byte самый предпочтительный формат, но не всегда новички готовы создавать редактор. В случае с Char редактором может послужить стандартный текстовый, тот же "Блокнот" MS Windows. Второй плюс - удобно кодировать текстуры, они ведь имеют имя файла, и гораздо нагляднее и понятнее если они будут закодированы допустимыми символами, чем с непонятными цифрами, которые означают числовой код в таблице кодировки.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 29.04.2011, 22:39   #9
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Если массив типа TGameMas тогда не работает процедура загрузки файла
Код:
procedure loadlevel();
var
  f: TextFile;
  x,y: byte;
begin
  AssignFile(f,'level1.txt');
  Reset(f);
  for y:=1 to 22 do
  for x:=1 to 29 do
      if x<29 then
        read(f,mapmas[x,y])
      else
        readln(f,mapmas[x,y]);
  CloseFile(f);
end;
на чтении ошибка(read)
И вообще если я использую массив типа TGameMas, есть ли мне смысл заполнять карту таким способам?

Последний раз редактировалось [BeNdeR]; 29.04.2011 в 23:05.
[BeNdeR] вне форума Ответить с цитированием
Старый 29.04.2011, 22:51   #10
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от [BeNdeR] Посмотреть сообщение
Если массив типа TGameMas тогда не работает процедура загрузки файла
Код:
procedure loadlevel();
var
  f: TextFile;
  x,y: integer;
begin
  AssignFile(f,'level1.txt');
  Reset(f);
  for y:=1 to 22 do
  for x:=1 to 29 do
      if x<29 then
        read(f,mapmas[x,y])
      else
        readln(f,mapmas[x,y]);
  CloseFile(f);
end;
на чтении ошибка(read)
а как вы хотели... read(f,mapmas[x,y]) в какую часть вы принимаете информацию в mapmas[x,y].TGtype или mapmas[x,y].TGMove... это надо все указывать. я бы использовал тогда не текстовый файл (f: TextFile; ) а типизированный файл который разбит на области и хранит в себе все значения для mapmas[x,y], вот тогда ошибки чтения не будет.
Daemonghost вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построчный алгоритм заполнения многоугольника с затравкой (Билдер С++) SKA_zo4nik Помощь студентам 8 28.03.2011 20:15
простейший алгоритм а работает криво Lokos Общие вопросы Delphi 7 27.10.2010 16:21
Простейший фаерволл wall66 Софт 0 24.10.2009 17:36
Алгоритм заполнения ячеек Иван_1651 Microsoft Office Excel 3 11.03.2009 21:27
Алгоритм заполнения квадратной матрицы по спирали beregok Помощь студентам 3 15.01.2009 16:56