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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2011, 16:56   #11
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

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

Код:
// отрисовка
case  MapMas[x,y].layer1 of
    '0':begin 
              bitbuf.Canvas.Draw(x*cell,y*cell,{ячейка банка текстур} ); // низший слой
        end;

case  MapMas[x,y].layer2 of
    '0':begin 
              bitbuf1.Canvas.Draw(x*cell,y*cell,{ячейка банка текстур}); // средний слой
        end;
а вот MapMas[x,y].prohod используется в движении.
Есть еще верхний слой - интерфейс игры.
Daemonghost вне форума Ответить с цитированием
Старый 27.05.2011, 20:35   #12
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Ага. Почти всё понял, спасибо! А что имеется ввиду под ячейкой банка текстур, моя картинка? Так что мне два буфера создавать?
[BeNdeR] вне форума Ответить с цитированием
Старый 27.05.2011, 23:32   #13
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

да, именно твоя картинка! Но вот когда у тебя будет готова карта и постоянно будет отрисовываться, постоянно подгружая с жесткого диска, а не из банка текстур, который подготавливается с самой загрузки карты, то при таймере 33 милисекунды будет грузится процессор (одноядерный 2ГГц) на 33%, а вот из банка текстур (данные уже хранятся в оперативной памяти) копировать или отрисовывать на карте не будет грузить процессор.
На счет второго буфера - один буфер - построение картинки (он включает в себя несколько слоев), а вот на счет второго буфера - это динамический массив (если подгружаемые ресурсы меняюстя) или статический массив (если количесво текстур постоянно) типа БанкТекстур.
И в процессе игры из банка текстур будут браться текстуры и наносится на слои, а слои на буфер, а буфер туда куда ты выводишь его.

Но, если честно не очень ясна твоя отрисовка.. там надо чуть по другому - используя цикл, а не case ... of ....

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

А как банк текстур объявляется?) Это надо создать тип, и массив им обьявить?

Последний раз редактировалось [BeNdeR]; 28.05.2011 в 11:51.
[BeNdeR] вне форума Ответить с цитированием
Старый 29.05.2011, 06:30   #15
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от [BeNdeR] Посмотреть сообщение
А как банк текстур объявляется?) Это надо создать тип, и массив им обьявить?
да, я делаю именно так.

Пользуюсь советами уважаемого Beermonzы и делаю так:

объявляю тип TBankTex
Код:
type 
TBankTex = packed record
   Tex: TBitmap; // пока необходима картинка, возможно понадобиться еще что-нибудь, возможно буду хранить адрес и идентификатор.
  end;
обзначаю массив типа TBankTex
Код:
var
poverh: array of TBankTex;
obj:    array of TBankTex;
в обработчике процедуры загрузки банка сначало получаю из файла длинну массива, перед тем как заполнить его, а после указываю длинну массива
Код:
SetLength(poverh, SizeOf(TBankTex) * arrlength);
далее заполняю массив нобходимым
Код:
for i:=0 to arrlength do
      begin
poverh[i].tex:=TBitmap.Create;
poverh[i].tex.Height:=32; // меняются значения
poverh[i].tex.Width:=32;
poverh[i].tex.LoadFromFile(s1+inttostr(i)+'.bmp'); // при необходимости заменить на ресурс
poverh[i].tex.TransparentColor:=ClYellow;
poverh[i].tex.Transparent:=true;
      end;
s1 - адрес текстуры (получаю из файла), i - порядковый номер (0 - arrlength)

примерно так.

Последний раз редактировалось Daemonghost; 29.05.2011 в 06:37.
Daemonghost вне форума Ответить с цитированием
Старый 31.05.2011, 13:52   #16
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Тут вопрос созрел! Когда я перевожу файл в типизированный, то у меня всё получается на одной строчке и из-за этого много ошибок. Так же в файле уже нету 0123456 и поэтому он ругается на case! Подскажите что делать!
[BeNdeR] вне форума Ответить с цитированием
Старый 31.05.2011, 20:59   #17
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от [BeNdeR] Посмотреть сообщение
Тут вопрос созрел! Когда я перевожу файл в типизированный, то у меня всё получается на одной строчке и из-за этого много ошибок. Так же в файле уже нету 0123456 и поэтому он ругается на case! Подскажите что делать!
ну смотри!

отрисовка карты делается один раз, а после если не меняются объекты - не трогается, иначе получишь загрузку процессора = 30%

отрисовывается таким способом:
Код:
procedure PaintMap;
var i,j:byte;
begin
// анализировать массив карты и отрисовать на буфер
for j:=0 to 23 do // учет что текстура 32 на 32 а экран у меня 1024 на 768
for i:=0 to 31 do
begin
// составление первого слоя
layer1.Canvas.Draw(i*32,j*32,poverh[maparray[(i+1)+smeshenieX,(j+1)+smeshenieY].layer1].Tex);
// составление 2 слоя
layer2.Canvas.Draw(i*32,j*32,obj[maparray[(i+1)+smeshenieX,(j+1)+smeshenieY].layer2].Tex);
// составление 3 слоя
layer2.Canvas.Draw(i*32,j*32,obj[maparray[(i+1)+smeshenieX,(j+1)+smeshenieY].layer3].Tex);
end;
// срисовать в буфер первый слой  
buf.Canvas.Draw(0,0,layer1); {можно заменить на быстрый copyrect}
// срисовать в буфер 2 слой
buf.Canvas.Draw(0,0,layer2); {при использовании прозрачности не использовать copyrect} 
// срисовать в буфер 3 слой
buf.Canvas.Draw(0,0,layer3);
end;
где
poverh[]-банк текстур поверхности
obj[] - банк текстур объектов
maparray[] - массив карты [1..100,1..100] of map
smeshenieX, smeshenieY - смещение относительно экрана

у меня назрел вопрос: у тебя есть редактор файла карты? Ведь простым блокнотом ее уже не состряпать.
Daemonghost вне форума Ответить с цитированием
Старый 01.06.2011, 13:10   #18
[BeNdeR]
Пользователь
 
Аватар для [BeNdeR]
 
Регистрация: 14.04.2011
Сообщений: 74
По умолчанию

Нету... Я пробовал сделать так:
-Считывал мой текстовый файл
-Создавал новый типизированный файл
-и записывал в него мой текстовый
но так сделать не получилось!
А где можно взять редактор?
Так если типизированный файл case можно использовать или всё же цикл лучше?

Последний раз редактировалось [BeNdeR]; 01.06.2011 в 13:14.
[BeNdeR] вне форума Ответить с цитированием
Старый 01.06.2011, 19:21   #19
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от [BeNdeR] Посмотреть сообщение
Нету... Я пробовал сделать так:
-Считывал мой текстовый файл
-Создавал новый типизированный файл
-и записывал в него мой текстовый
но так сделать не получилось!
А где можно взять редактор?
Так если типизированный файл case можно использовать или всё же цикл лучше?
case - это куча условий, оно тебе надо? Вот представь у тебя 1000 объектов и, что для каждого case писать, не напряжно ли?

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

На счет редактора карт - тут своими ручками. Надо не забывать, что если в программе ты используешь свой тип данных, он должен дублироваться и в редакторе.
т.е. если наш тип:
Код:
type
map = packed record  //тип клетки карты
    layer1:              word;    // Низший уровень (id текстуры карта)
    layer2:              word;    // Средний уровень (id текстуры объект)
    layer3:              word;    // Высший уровень (id текстуры объект)
    prohod:             boolean; // проходимость
  end;

var  maparray: array [1..100,1..100] of map; // карта
то мы должны в одном (или нескольких) цикле заполнить ячейки массива
Код:
for j:=1 to 100 do
for i:=1 to 100 do
begin
maparray[i,j].layer1:=....; // присваивание значения в ячейку 1 слоя
maparray[i,j].layer2:=....; // присваивание значения в ячейку 2 слоя
maparray[i,j].layer3:=....; // присваивание значения в ячейку 3 слоя
maparray[i,j].prohod:=....;// присваивание значения в ячейку проходимости
end;
а далее твоя фантазия - либо чтение одного файла, где 4 таблици 100 на 100, либо 4 файлов, либо использовать StringGrid, либо свой собственный вариант.

p.s. уже отдалились от темы реализация препядствий =)

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

Да! Далеко ты меня увёл)
Код:
for j:=1 to 100 do
for i:=1 to 100 do
begin
maparray[0].layer1:={загружаем картинку}; // присваивание значения в ячейку 1 слоя
maparray[0].layer2:={загружаем картинку}; // присваивание значения в ячейку 2 слоя
maparray[0].layer3:={загружаем картинку}; // присваивание значения в ячейку 3 слоя
maparray[0].prohod:=true;// присваивание значения в ячейку проходимости
end;
или что здесь надо сделать?
На счёт типизированного файла так нужно:
Код:
  type
map = packed record  //òèï êëåòêè êàðòû
    layer1:              word;    // Íèçøèé óðîâåíü (id òåêñòóðû êàðòà)
    layer2:              word;    // Ñðåäíèé óðîâåíü (id òåêñòóðû îáúåêò)
    prohod:             boolean; // ïðîõîäèìîñòü
    dver:boolean;
    goldd:boolean;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
f:textfile;
f1:file of map; //?????
fName,fName1:string; //????? ??????
mapmas:array[0..22,0..28] of map;
begin
fName:='1.txt';
fName1:='2.exitMap';
AssignFile(f,fName);
AssignFile(f1,fName1);
Reset(f);
rewrite(f1);
while not eof(f) do
begin
readln(f,s);
for i:=1 to length(s) do
write(f1,strtoint(s[i]);
writeln(f1);
closefile(f);
closefile(f1);
end;
end;
end.
Или сначала загрузить в массив а потом из него выгрузить?

Последний раз редактировалось [BeNdeR]; 02.06.2011 в 19:45.
[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