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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2009, 18:47   #261
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,033
Смех

Цитата:
Сообщение от Алекс Ялта Посмотреть сообщение
Код:
type
  TGameMap = packed record
    p:       byte;       // Проходимость
    Tex:    TBitmap;     // Текстура клетки
proxodimo:boolean;
  end;
Для ускорения можно сделать так...
Levsha100 вне форума Ответить с цитированием
Старый 31.03.2009, 19:04   #262
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
Для ускорения можно сделать так...
Сути не меняет. На этот же индекс не получится записать другую текстуру.
Алекс Ялта вне форума Ответить с цитированием
Старый 31.03.2009, 19:54   #263
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Про загрузку и использование текстур и проходимости...

Это пример с поста #102, если не ошибаюсь. Пример простейший. Задача стоит по-иному: если много текстур, как вместить проходимость?
Будем предельно точны, расширим представления о системе хранения текстур и проходимостей. У нас есть база текстур, в виде одномерного массива, в котором загружены все текстуры, что есть на карте, ...как? ...пробегаем по массиву карты, что был загружен с файла, смотрим каждую цифру, и записываем последовательно в массив Bitmap с файла текстуры. Дополнительно в коде каждой клетке зашифрована и проходимость, ...как? ...допустим мы берем 256 текстур - это много, половина из них проходимые, половина нет, или даже 3 степени проходимости: 0 - можно идти, 1 - нельзя ни при каких условиях, 2 - можно при определенных условиях. В итоге у нас:

0 - 99 - номера текстур, по которым можно ходить;
100 - 199 - номера текстур, по которым нельзя ходить;
200 - 255 - номера специальной проходимости.

Вернемся к загрузке текстур. Проверяя очередную клетку выполняем условия:

если число < 100, то ставим в запись проходимости 0;
если число > 99 но < 200, то ставим в запись проходимости 1;
если число > 199, то ставим в запись проходимости 2;

Попутно с файла загружаются текстуры с именами, равными числам, таким образом тип банка текстур становится справедливым:
Код:
type
  TTexBank = packed record
    Tex:    TBitmap;     // Текстура клетки
// тут еще масса параметров текстуры
    DispX:  Byte;         // Смещение по-X
    DispY:  Byte;         // Смещение по-Y
// если есть анимация
    MaxFrame:  Byte;  // количество кадров
    Frame:       Byte;  // текущий кадр
// и еще, что нужно....
  end;
Назначая тип на массив, мы представляем все текстуры в виде индексов привязки:
Код:
TexMas: array[0..255] of TTexBank;
У нас 256 индексов текстур. Теперь, куда идет проходимость? ...она идет в тип карты:
Код:
Type
  TGameMap = packed record
    Move:    Byte;       // Проходимость
    Index:    Byte;     // Индекс текстуры
  end;
Массив карты двумерный:
Код:
MapMas: array[1..20,1..15] of TGameMap;
Что происходит? Текстура много раз повторяющаяся на карте хранится в единственном экземпляре в массива TexMas, а массив MapMas хранит проходимость и индекс текстуры. Теперь когда мы будем рисовать карту мы напишем так:
Код:
Buf.Canvas.Draw(x,y,TexMas[MapMas[i,j].Index].Tex);
Если нужно проверить, может ли объект двигаться в клетку, проверим содержимое MapMas[i,j].Move, и через условия разрешим двигаться или нет. Сейчас там могут быть 3 значения: 0, 1 и 2.

Как записать на карту числа уже весом в 3 байта? (0 - 9 весят 1 байт, 10 - 99 весят 2 байта, 100 - 255 весят 3 байта) ...ответ в вопросе, перейдем к хранению данных в байтах:
Код:
MamFile: File of Byte;
Надеюсь этого хватит? ...если нет, то есть способ с вложением данных о текстуре, это отдельные файлы, текстового типа (TextFile) с именем файла текстуры, ...в них проходимость записана, и при считывании файла текстуры одновременно считываются и данные о текстуре и записываются в проходимость. Не хватит этого, вводите еще один байт на код текстуры, это уже 65536 видов текстур.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 31.03.2009, 20:07   #264
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
Хорошо

Огромное спасибо. Я думаю, этого достаточно. Осталось переварить информацию
Алекс Ялта вне форума Ответить с цитированием
Старый 01.04.2009, 12:32   #265
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение

Как записать на карту числа уже весом в 3 байта? (0 - 9 весят 1 байт, 10 - 99 весят 2 байта, 100 - 255 весят 3 байта) ...ответ в вопросе, перейдем к хранению данных в байтах:
Код:
MamFile: File of Byte;
То есть в текстовом файле карты lvl.txt нужно обозначать числа, разделяя их пробелом?

001 002 003 055 066 077
111 112 113 114 115 116
117 118 119 120 121 122

а потом связывать текстовый файл с файлом байтов (MamFile: File of Byte?

Код:
AssignFile(MamFile,'lvl.txt');
(Не бейте ногами сходу, если вопрос выглядит очень глупо. Просто очень тяжело усваивается)
Алекс Ялта вне форума Ответить с цитированием
Старый 01.04.2009, 15:27   #266
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Алекс Ялта
(Не бейте ногами сходу, если вопрос выглядит очень глупо. Просто очень тяжело усваивается)
Строгий выговор как минимум.

Если файл байтовый, значит он содержит байты, которые представляются в виде символов, каждый из которых может определять число от 0 до 255. Если открыть любой файл EXE в проводнике, то можно увидеть кучу "иероглифов" - это и есть представление чисел типа Byte.

Цитата:
Сообщение от Алекс Ялта
То есть в текстовом файле карты lvl.txt нужно обозначать числа, разделяя их пробелом?

001 002 003 055 066 077
111 112 113 114 115 116
117 118 119 120 121 122
Будем бить ногами ...нерационально до безумия. Никаких пробелов, и нулей, все в кучу, и на одну клетку один байт (или два). Примерно так:

[hщык$4KЏЂуU¬«@c

Заметно разницу в весе? ... 18 байт, ...у тебя 72 байта (переходы на строку тоже в счет), и при том, что карта мизерная совсем. Всегда следи за "весом" ресурсов, негоже раскидываться памятью, если в том нет надобности.
Значит все байты идут подряд, без пробелов, ...мы же четко знаем, что один байт - одна клетка, ненужны пробелы, будем выполнять команду чтения одного байта Read. Записываем в цикле:

Код:
for i:=1 to 20 do
  begin
    for j:=1 to 15 do
      begin
        Read(f, b);
// тут проверка массива текстур,
// если такая текстура уже загружена,
// ставим ее индекс в MapMas[i,j].Index
      end;
  end;
По поводу этого кода, ...тут не все просто, попробую упростить, и привести пример проверки массива текстур, ...чуть позже.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 01.04.2009 в 15:29.
Beermonza вне форума Ответить с цитированием
Старый 01.04.2009, 22:30   #267
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Уважаемый Beermonza, спасибо за разжевывание информации. С байтами я уяснил преимущества. Создал редактор карты и с его помощью записываю в одну строку байты в текстовый файл карты.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Код:
for i:=1 to 20 do
  begin
    for j:=1 to 15 do
      begin
        Read(f, b);
// тут проверка массива текстур,
// если такая текстура уже загружена,
// ставим ее индекс в MapMas[i,j].Index
      end;
  end;
По поводу этого кода, ...тут не все просто, попробую упростить, и привести пример проверки массива текстур, ...чуть позже.
Если будет время, приведите, пожалуйста, пример.

Последний раз редактировалось Алекс Ялта; 01.04.2009 в 22:34.
Алекс Ялта вне форума Ответить с цитированием
Старый 02.04.2009, 16:50   #268
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Подробно о заполнении банка текстур...

Сначала как всегда "на пальцах" немного теории. Цель - загрузить текстуры в банк, исходя из кода, считанного с файла, и не допустить дублирования, если в этом нет надобности. Логически все выглядит так. У нас есть некий файл карты, мы можем его "читать" по одному байту. У нас есть одномерный массив, в который мы будем записывать текстуры. Очевидно, что понадобится перебор банка текстур, с целью поиска уже существующей текстуры по коду карты. А если текстура так и не была найдена на переборе до ближайшей свободной ячейки банка, то значит нужно записать ее в эту первую свободную ячейку, после всех занятых. Чтобы долго не кувыркаться со стандартными командами, добавим в тип банка две записи Name и TexUses:
Код:
type
  TTexBank = packed record
    Tex:    TBitmap;     // Текстура клетки
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Name: Byte;          // Реальный код текстуры
    TexUses: Boolean;  // Используется ли ячейка
// --------------------------------------
// тут еще масса параметров текстуры
    DispX:  Byte;         // Смещение по-X
    DispY:  Byte;         // Смещение по-Y
// если есть анимация
    MaxFrame:  Byte;  // количество кадров
    Frame:       Byte;  // текущий кадр
// и еще, что нужно....
  end;
В начале каждого считывания карты, нужно пробежаться по всему массиву банка и стереть данные:
Код:
for t := 0 to 255 do
  begin
// Bitmap удален из памяти
    TexMas[t].Tex.Free;
// Подготовлено место
    TexMas[t].Tex := TBitmap.Create;
// Ячейка не используется
    TexMas[t].TexUses := False;
  end;
Теперь, как выглядит алгоритм заполнения текстурами банка:
Код:
for i:=1 to 20 do
  begin
    for j:=1 to 15 do
      begin
        Read(f, b);
// новый цикл проверки банка текстур, проверяет занятые ячейки
// работает, пока не встретит пустую ячейку, если встретил,
// значит не нашел текстуры.
        t := 0;
        while TexMas[t].TexUses do
          begin
// если нашлась нужная текстура
            if TexMas[t].Name = b then
              begin
// записываем условный индекс в массив карты
                MapMas[i,j].Index := t;
// переход
                GoTo M;            
              end;   
// счетчик
            Inc(t);
          end;

// если цикл поиска не нашел текстуру, то он остановился
// на свободной ячейке.
// привязка к текущей ячейке
        MapMas[i,j].Index := t;
// имя текстуры
        TexMas[t].Name := b;
// загрузка текстуры (каталог Textures в папке проекта)
        TexMas[t].Tex.LoadFromFile('Textures\'+IntToStr(b)+'.bmp');
// ячейка занята
        TexMas[t].TexUses := True;
        
// сюда переход, если текстура определилась
M:
      end;
  end;
Надеюсь ошибок нет, проверяйте, ...выложил код теоретически, без проверки, по аналогии работающего сложного кода.
С переходами GoTo работать просто, нужно только указать в процедуре, перед ее началом (begin) запись метки: Label M;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 05.04.2009, 13:57   #269
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

са сейчас мучаюсь пока ничего невышло если выйдет напишу как смастерил, по последнему посту вообще неполучаеться хотя подход правельный я всё понимаю но реализовать немогу программа не та.
щас пользуюсь просто вот таким масивом
Код:
map: array of array of byte;
он меня почти устраивает и проходимость реализую через: карту в карте 2 вида стен 1-ый:1, 2-ой:2 и в цикле когда строю текстуры если 1 то проходимость :=1 если 2ой то 0.
а в программе уже зависимость от проходимость про проверке след клетки
да вот мой цикл считавания:
Код:
 Reset(f);
  Read(f,MapW);
  Read(f,MapH);
  SetLength(map,MapW+2,MapH+2);
 for y:=1 to MapH do
    for x:=1 to MapW do
    begin
        read(f,map[x,y]);
 if map[x,y]=1 then
        proh[x,y]:=1;
короче есть 2 проги хочу или в одной сделать управление мышкой или во второй загрузку текстур с картой
вот что у мну получаеться
КОРОЧЕ МЕНЯ ВСЕ уже достало дайте простой пример проги чтобы просто загружалась карта пусть даже с 2 обьектами, любое управление 1 обьект фон 2 ой непроходимый так будет понятнее
Вложения
Тип файла: zip тут управление мышью.zip (454.1 Кб, 39 просмотров)
Тип файла: rar то что выходит.rar (228.4 Кб, 37 просмотров)
Тип файла: rar тут нужна карта с текстурами.rar (201.2 Кб, 42 просмотров)

Последний раз редактировалось IvaniuS; 05.04.2009 в 18:28. Причина: допишу
IvaniuS вне форума Ответить с цитированием
Старый 05.04.2009, 18:08   #270
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию Прозрачность спрайтовой анимации

Разбираюсь со способами вывода анимации на форму при помощи спрайтов, размещенных в едином Битмапе. У меня при выводе анимации каждый последующий кадр просто накладывается на предыдущий. Не могу понять как в таком случае затирать предыдущий кадр фоном? Код такой:
Код:
var
  Form1: TForm1;
  Buffer: Tbitmap;
  fon: Tbitmap;
  Expl: Tbitmap;
  boom: boolean;
  x,y:integer; // координаты размещения взрыва
  i:byte; // номер кадра

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Buffer:=Tbitmap.Create;
Buffer.Width:=400;
Buffer.Height:=300;
Buffer.Transparent:=true;
Buffer.TransparentColor:=clWhite;

Fon:=Tbitmap.Create;
Fon.LoadFromFile('pic/fon.bmp');

Expl:=Tbitmap.Create;
Expl.LoadFromFile('pic/expl.bmp');
expl.Transparent:=true;
x:=50;
y:=50;
i:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Buffer.Canvas.Draw(0,0,fon);

if boom then begin

Buffer.Canvas.CopyRect(bounds(100,100,36,36),Expl.Canvas,bounds(i*36,0,36,36));
//  (bounds(100,100,36,36) - 100,100: положение взрыва на картинке буфера
                           //36,36: размер области, в которую вставим, скопированный кусок
i:=i+1;
if i>9 then begin
i:=0;
boom:=false;
end;
end;
Buffer.Canvas.Draw(0,250,expl);
Form1.Canvas.Draw(0,0,Buffer);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if boom=false then boom:=true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Buffer.Free;
Fon.Free;
Expl.Free;
end;

end.
Вот исходник с битмапами:
Вложения
Тип файла: zip spritesAnim.zip (199.7 Кб, 62 просмотров)

Последний раз редактировалось Алекс Ялта; 05.04.2009 в 18:10.
Алекс Ялта вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07