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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2009, 18:29   #381
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Размер карты 100х100 пикселей вы имели ввиду?
Как я понимаю карту лучше измерять в ячейках. Каждая ячейка занимает определенное кол-во пикселей (это константа).И каждый элемент массива (100х100) несёт в себе значение (код или название) определенного объекта в игре. Например 1 - дерево, 2 - дом и.т.д.
Цитата:
то есть объект можно поставить в абсолютно любую клетку (317; 526);
Никаких проблем нет, просто ставим в значение элемента матрицы необходимый код объекта. Процедура рисования по коду определяет изображение и рисует его в координатах этой ячейки.Как вычислить координату ячейки ты уже привел.
Как подвинуть камеру? - просто вычитаем из полученной координаты объекта координату камеры.
Вадим Буренков вне форума Ответить с цитированием
Старый 26.11.2009, 18:33   #382
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

(130.000; 0) - а что с такой координатой делать или даже если ещё больше значение будет? Использовать тип для координат LongInt просто? А если вообще не записывать объекты все подряд, а только те, которые есть на карте?
Ну, у меня сейчас вот так отрисовывается:
Код:
begin
  _2DEraseBuffer;
  _2DDraw(0,0,bg);
  Player.Animation[CurAnim].DrawAnimation(Player.Position.X,
                                         Player.Position.Y); // Рисуем анимацию игрока
  Inc(Player.Animation[CurAnim].FrameNumber); // Увеличиваем кадр анимации
  Collisions; // Коллизии
  _2DDrawScreen(0,100,Canvas);
end;
А вот создание подложки...
Код:
procedure TMainForm.CreateBG;
var
  i,j: byte;
begin
  bg.Canvas.FillRect(Rect(0,0,800,400));
  for i := 0 to MapResX do
   for j := 0 to MapResY do
    if Map.ObjMatrix[i + Map.sx, j + Map.sy] <> - 1 then
      bg.Canvas.Draw(i * sPoint, j * sPoint,
                    GameObjects[Map.ObjMatrix[i + Map.sx,j + Map.sy]].Bitmap);
end;

Последний раз редактировалось Манжосов Денис :); 26.11.2009 в 18:35.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 26.11.2009, 18:52   #383
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
(130.000; 0) - а что с такой координатой делать или даже если ещё больше значение будет?
Ты какую игру делаешь?Вспомни какие размеры карты в героиIII.Мне кажется там нет карт 130000 на 13000 ячеек!!!
Вадим Буренков вне форума Ответить с цитированием
Старый 26.11.2009, 18:59   #384
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Так...Внимательно почитай мой пост первый, когда я только спросил как реализовать систему хранения файла отличную от моей в старой игре! Вот тип
Код:
type
  TMatrix = record
    PosX, PosY: longint;
    TypeObject: byte;
  end;
Видишь? Отлично! PosX = 130.000 по X, по Y - 0! Массив:
Код:
matrix: array of TMatrix;
Каждый раз, как добавляем объект на карту увеличиваем длину массива на 1! Вот про такую систему я говорю.
Блин, я от ответов только путаюсь сильней
И как мне сделать игровую камеру, чтобы она рисовала объекты от начала экрана?

Последний раз редактировалось Манжосов Денис :); 26.11.2009 в 19:05.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 26.11.2009, 19:06   #385
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Я же напечатал:
Цитата:
Допустим, карта имеет размер 100х100 клеток
Не совсем понимаю, что требуется получить?

Карта не измеряется в экранных пикселях, ...клетка - это типичное название элементарной поверхности в игре. В математическом виде, клетка - одна ячейка матрицы, у которой есть координата i и j, номера i в матрице располагаются по столбцам, j - по строкам. Пример, вот карта игры 7х7:

j,i 1 2 3 4 5 6 7
1 0 0 0 0 0 0 0
2 0 3 0 0 0 0 0
3 0 0 0 0 0 0 0
4 0 0 0 2 0 0 0
5 0 0 0 0 0 0 0
6 0 1 0 0 0 0 0
7 0 0 0 0 0 9 0

...так выглядит математическая модель карты. А вот так она записана в файле, теоретически:

770000000030000000000000002000000000001000000000090

...разумеется в файле в виде символов кодовой страницы.
Если у вас размер тайла (одной элементарной клетки, ее текстуры) 50х50 пикселей на экране, то полная графическая поверхность будет 350х350 пикселей.

Вот так хранить карту довольно рационально. Почему столько нулей и зачем их хранить? ...вспомним, что поверхность просто усеяна текстурами, и причем разными, ...записать пропуск проще, чем строить систему списка, к тому же она не сожмется потом, а последовательный массив сожмется, и довольно прилично.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.11.2009, 19:11   #386
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Beermonza, Вадим, вы мне говорите, о том, о чём я уже знаю. У меня всё это в игре реализовано. Вопрос был в другом, ну да ладно, буду сам находить ответ. Спасибо.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 26.11.2009, 19:13   #387
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
(130000; 0) - а что с такой координатой делать или даже если ещё больше значение будет?
Рискну предположить, что на экран такое по любому не влезет, это фрагмент карты, начиная с клетки по-Х: 130000 и на размер экрана. Если тайл 50х50, сколько клеток влезает на экран 1024 по-горизонтали? ...21 клетка. Значит на экране показан фрагмент карты с по-Х: 130000 до 130021. Вот и рисуем в цикле по диапазону StartX to StartX+ScreenLenX, т.е. 21-у клетку в 50х50 пикселей каждая. Это систем плавающей камеры, спрашивал, нужно ли объяснять.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 26.11.2009 в 19:19.
Beermonza вне форума Ответить с цитированием
Старый 27.11.2009, 13:56   #388
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Цитата:
Сообщение от Манжосов Денис :) Посмотреть сообщение
Решил перевести систему координат в своём игровом проекте, и возникла куча вопросов. У каждого объекта есть координата (50*m; 50*n), где m и n - элементы массива. Массив динамический: matrix: array of array of smallint;
В-общем, не стоит говорить и спрашивать насчёт этой системы хранения карты, отрисовки на экран и создания "подложки" (Спасибо, Beermonza, метод всё-таки действительно помог). Поговорим о новом способе.
Итак. Теперь карта (лучше говорить матрица) объектов представляет из себя такую структуру:
Код:
type
  TMatrix = record
    Position: TPoint; // Координаты объекта
    ObjectType: smallint; // Тип объекта (1 - дерево, 2 - камень, 3 - цветок ...)
  end;
var
  matrix: array of array of TMatrix; // Двумерный динамический массив карты
И вот здесь начинаются трудности. Во первых, как рисовать всё это на экран, ведь координаты могу быть такими (135000; 10). Я думаю, что можно пользоваться какими-то формулами, которые переведут координаты для отрисовки... Второе, как хранить все координаты в файле. Вот так:
Код:
for i := 0 to LengthX do  // Длина массива
 for j := 0 to LengthY do 
  Writeln(F, Matrix[i,j].TypeObject, Matrix[i,j].Position.X, Matrix[i,j].Position.Y);
?
Если вы располагаете информацией насчёт этого, напишите пожалуйста в этой теме подробный ответ, буду очень благодарен. Спасибо.
Слишком просто для игры на такой большой карте. Вот моя структура из моего проекта (rpg):

Код:
type
  TMapCell = record
    Tile      : Integer;
    Index     : Integer;
    ID        : Integer;
    SKeySchema: Integer;
    Count     : Integer;
    IsVisible : Boolean;
  end;

  TMap = record
    Cells: array[1..MAP_WIDTH,1..MAP_HEIGHT] of TMapCell;
    LocalMapLeft, LocalMapTop: Integer;
  end;

  TMapCity = array[0..AddMapWidth, 0..AddMapWidth] of TMapCell;

  TGameMap = array[1..MaxDungeonLevel] of TMap;

  TDesk=array [0..LOCAL_MAP_WIDTH,0..LOCAL_MAP_HEIGHT] of Integer;
И сохраняется все это, как сейв, со структурой, в обычный текстовый файл
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты

Последний раз редактировалось apromix; 27.11.2009 в 14:00. Причина: :)
apromix вне форума Ответить с цитированием
Старый 27.11.2009, 15:13   #389
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Мы все говорим об одной и той же математической модели карты - матрице. Но, математическая матрица содержит в своих ячейках по определению числа - в данном случае индексы. Так намного проще обращаться к одним и тем же объектам, и записывать в файл только эти индексы, или по иному - код объекта, однобайтный или составной.
Размер файла уменьшается в разы, ...кроме того мы экономим ОЗУ, храня каждый объект в единственном экземпляре. Если потребуется изменить объект "на лету", то достаточно сменить его ресурс в банке, один раз, не бегая по карте и не меняя его во всех клетках карты, где он находится.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 27.11.2009, 15:27   #390
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

В моём проекте есть массив двумерный x на y. Ячейка несёт в себе значение текстуры, которую нужно вывести на экран. Есть массив текстур:
Код:
TGameObject = record
  Blocked: integer; // Препятствие ли объект
  Bitmap: TBitmap; // Картинка объекта
  ... // ещё несколько параметров
end;
GameObjects: array [1..n] of TGameObject;
Вообще, я уже забил на систему, где объекты могут располагаться в любой части карты, в любой координаты.
Beermonza, а как у Вас в игре хранится файл карты? Объекты можно ставить, где угодно или есть наименьший размер ячейки, к примеру 10?

Последний раз редактировалось Beermonza; 27.11.2009 в 15:38.
Манжосов Денис :) вне форума Ответить с цитированием
Ответ


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

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

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


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