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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2008, 21:03   #101
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Хочу сделать маленькое дополнение, в кач-ве заполнителя ячеек карты в простых играх можно применить обычный byte.
В программе эта карта будет иметь вид:
map: array of array of byte;
В файле карта будет иметь вид:
001012200...
003012200...
041015500...
...
Тип byte позволяет иметь до 256-ти различных видов "заполнителя" карты, чего в аркаде хватает с головой, обычно хватает и десяти. Если все же их больше десяти, то в файле массив будет иметь несколько другой вид, нужен разделитель - пробел.
0 10 12 0 1 2 2 0 0...
0 15 3 0 1 22 2 0 0...
0 4 1 0 1 5 5 0 0...
...

В заключение приведу реальный уровень из реальной игры Диггер (не оригинал, ремейк)
Цитата:
#1

0xxxgxxxxx0000M
0xxDDxxDxx0xgxx
0gxDDxxDxx0xxxx
0xxDDgxDgx0xDDD
0xxDDxxDxx0xDDD
00xDDxxDxx0xDDD
x0xxxxgxgx0xxxx
x0000xxxxx0xxxx
Dxxx0xxxxx0xxxD
DDxx000*000xxDD
Из этой же игры, уровень для другого режима игры
Цитата:
#1

MonstrMax=3
MonstrGun=0
MonstrRed=0
LifeStart=5345
LifePer=599
CherryStart=2000
CherryPer=356
SlowStart=2890
SlowPer=1234
TeleportStart=8800
TeleportPer=888
Fon=00.bmp

DDxxxxMxxxxxxDxxxxDD
Dxxxxg0gxxxxxDxxxxxD
xggxxx0xxxxxxDxxxggx
xxxxxx0xxxxxxDxxxxxx
xxxxxx0xxxxxxDxxxxxx
DDDDDD00000000000000
xxxxxx0DDDDDD0xxxxxx
xxxxxx0DDDDDD0xxxxxx
*0000000000000DDDDDD
xxxxxxDxxxxxx0xxxxxx
xxxxxxDxxxxxg0gxxxxx
xggxxxDxxxxxx0xxxggx
DxxxxxDxxxxxx0xxxxxD
DDxxxxDxxxxxxMxxxxDD
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 10.06.2008, 21:20   #102
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
// тип модели уровня
Type
TGameMap = object
//-----------------
TGTexture: TBitmap; {текстура}
TGMove: Byte; {проходимость: 1 - нельзя, 0 - можно}
//-----------------
end;
А не лучше сделать указатель на текстуру? Ведь если на карте много клекток с одинаковой текстурой, трава например, незачем в каждом объекте хранить ее копию.

p.s. А-а, все, увидел: MapMas[x,y].TGTexture:=brg;
По сути тот же указатель. Битмап будет просто ссылаться на другой битмап (здесь на brg).

Продолжение (про карту of byte)
Как же загружать картинки при такой карте? Очень просто. Создаем массив битмапов, или же используем стандартный контрол TImageList. Загружаем в него картинки так, чтобы их нумерация совпала с элементами карты. Т.е. если у нас трава в карте это 0, то и картинка с травой тоже должна иметь индекс 0.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 10.06.2008 в 21:35.
mutabor вне форума Ответить с цитированием
Старый 11.06.2008, 10:15   #103
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

L_M, заказывали пример, вот, получите и распишитесь. Небольшая игра по типу лабиринта, если усовершенствовать.
Управление: left,up,right,down.
Цель: добраться до конца уровня к маленькому квадратику.
Будет время, выложу пример аркады, в которой прыгать нужно, в этом же стиле. Как прикрутить картинки, тебе уже рассказали.
Вложения
Тип файла: rar game.rar (6.3 Кб, 254 просмотров)
Kostia вне форума Ответить с цитированием
Старый 11.06.2008, 12:22   #104
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Вот и второй пример поспел к раздаче. игра похож на предыдущую, только теперь она похожа на стандартную игру на Nokia, где мячик прыгает.
Управление: left,right,space.
Цель: добраться до маленького квадратика.

Офф-топ: я завтра уезжаю на две недели, не теряйте. =)
Вложения
Тип файла: rar game.rar (7.0 Кб, 249 просмотров)

Последний раз редактировалось Kostia; 11.06.2008 в 12:30.
Kostia вне форума Ответить с цитированием
Старый 11.06.2008, 22:08   #105
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

Спасибо всем. А про TImageList объясните: что такое, зачем использовать(а не массив), как пользоваться. И почему модель уровня описана как объект, а не например просто запись?
Упс...
L_M вне форума Ответить с цитированием
Старый 11.06.2008, 23:26   #106
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

TImageList это и есть массив, никаких особых преимуществ он не даст, просто один из способов. Польза есть в обоих случаях, в первом научишься использовать TImageList (он пригодится в прикладных программах), во втором научишься создавать динамические массивы, в частности из битмапов (тоже полезно =).
Как пользоваться написано в справке и в книгах по Дельфи. Не отходите от темы )
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 12.06.2008, 17:24   #107
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от L_M Посмотреть сообщение
... И почему модель уровня описана как объект, а не например просто запись?
Это я вырезал кусочек из своего кода, так было нужно, ...можете описать как угодно, packed record.

Не вижу смысла использовать ImageList, чтобы оставить его пустым, и при запуске заполнять эго картинками, ...или может загрузить картинки сразу и хранить в EXE? , побойтесь Бога.

Вот такой вариант мной применялся до недавнего времени:

Код:
Var
  Tex: TBitmap;
  i, n: Byte;
  TexMas: array[1..255] of TBitmap;
...

procedure TForm1.LoadTexture;
begin
// n определяется сразу, если вы точно знаете сколько будет текстур
// у меня было считывание из системного файла.
  for i:=1 to n do
    begin
      Tex:=TBitmap.Create;
      Tex.LoadFromFile(IntToStr(i)+'.bmp');

      {тут были манипуляции с текстурами}

      TexMas[i]:=Tex;
    end;
end;
Теперь при построении уровня узнаем индекс и выдергиваем из массива текстур нужную картинку.
Почему модель описана собственным типом? Конечно, то, что было показано - упрощенный вариант, ...а бывает, что можно не только проходить или нет, но и проходить с потерями, например если в клетке стоит огонь, или вода, ...в общем параметров может быть очень много (у меня 48).

Цитата:
Сообщение от mutabor
...Тип byte позволяет иметь до 256-ти различных видов "заполнителя" карты, чего в аркаде хватает с головой, обычно хватает и десяти. Если все же их больше десяти, то в файле массив будет иметь несколько другой вид, нужен разделитель - пробел.
0 10 12 0 1 2 2 0 0...
0 15 3 0 1 22 2 0 0...
0 4 1 0 1 5 5 0 0...
Разделителей не нужно, если использовать тип Byte как положено, ...это 0-255 символов латинского, русского алфавитов, включая числа и символы. Т.е. нужно задействовать кодировку ASCI, с одним условием, что символ под кодом 26 применять не следует, он означает "конец файла", если в цикле будут считываться символы, то на символе Chr(26) файл будет закрыт преждевременно.
Так вот, при этой системе размер файла будет в разы меньшего объема, и плюс, нужно считывать подряд байт за байтом. Вот что может быть в файле:

кЩxХС®AТ•Ф
—dЌmҐEzA•˜№
UbJЃм•мп/¤
Л**@UMCtmЇ

...а теперь представьте как это выглядит с пробелами и по 2-3 байта на одну клетку карты. Никаких прочих алгоритмов писать не нужно, просто банальное read. Вот пример считывания карты с текстового файла:
Код:
Var
  c: Char;
  MapFile: TextFile;
...
AssignFile(MapFile, 'map.txt');
Reset(MapFile);
While not EOF(MapFile) do
  begin

    // тут условия как рассчитывать размеры двумерного массива
    // каким образом придаются значения x и y, сразу, или же из этого же файла

    Read(MapFile, c);
    MapMas[x,y].TGTexture:=TexMas[Ord(c)];
  end;
CloseFile(MapFile);
...
Если заметите ошибки в коде отметьте, приходилось упрощать готовый сложный код.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:16.
Beermonza вне форума Ответить с цитированием
Старый 12.06.2008, 19:15   #108
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Ошибок нет, просто дополню до рабочего варианта
Код:
Var
  c: Char;
  MapFile: TextFile;
  w: integer; //ширина карты
  i: integer; //счетчик
...
AssignFile(MapFile, 'map.txt');
Reset(MapFile);
i:=0;
While not EOF(MapFile) do
  begin
    Read(MapFile, c);
    MapMas[i mod w, i div w].TGTexture:=TexMas[Ord(c)];
    Inc(i);
  end;
CloseFile(MapFile);
...
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 12.06.2008 в 19:18.
mutabor вне форума Ответить с цитированием
Старый 12.06.2008, 22:12   #109
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Отлично! Идем дальше, ...уровень построить можно, Kostia показал метод управления "персонажем", ...показываем методы выполнения анимации, конкретно система (как загружать картинки и куда выше было показано), смело несколько вариантов, чтобы видеть сходства и различия, причем помним, что анимация на прыжки и передвижения отдельная, там же и прочие типы.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.06.2008, 15:34   #110
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

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

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

Я делал отдельными файлами, на то время с другими способами у меня были некоторые проблемы =) Грузил их в массив, и потом в таймере крутил, нужно скорость смены спрайта так расчитать чтобы было похоже что персонаж идет, а не семенит ногами на месте или чешет семимильными шагами. Для этого или подобрать интервал таймера, или же использовать счетчик.
Код примерно такой:
Код:
var
sprites: array of TBitmap;
i: integer; //счетчик
n: integer; //номер спрайта

//Timer
begin
Inc(i);
{тут код получения номера спрайта на основании счетчика
и направления движения}

//вывод нужного спрайта на экран в нужном месте
Draw(x, y, sprites[n]);
end;
Вот спрайты движения медведя влево, сам делал из мультика:

The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


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

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

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


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