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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2008, 21:23   #51
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Лучше создавать собственный класс...
Можно компонент. Разницы в принципе нет.
zetrix вне форума Ответить с цитированием
Старый 04.02.2008, 21:46   #52
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

А по подробнее...
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 05.02.2008, 15:43   #53
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Счастье Поворот

Стоп, стоп, стоп!
Лубышев, про клоны Image забудьте раз и на всегда. Пример был дан для демонстрации, применим в аркаде, квесте, может в РПГ от части, все в любительском режиме, но никак не для стратегий.
Вообще, сначала стоит подумать о ресурсоёмкости игры, если проба своих сил, то можете попробовать клон, но не советую. В основе простейшей 2D игры - один объект отображения графики. Начните с того, что создайте Image, назовите его Screen, растяните на размер формы или как угодно, и с помощью Canvas можете делать клоны чего угодно куда угодно в этот Screen. Почему Canvas?

1. Топик говорит сам за себя, проще канвы нет ничего.
2. Для стратегии Canvas подойдет в виду статичности объектов.

Заинтересовались? спрашивайте...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

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

Цитата:
Сообщение от Лубышев Посмотреть сообщение
Тут уже рассматривался пример движения оъекта при нажатии на кнопки с клавиатуры, а если одновременно нажаты влево и вверх?
или пользователь пользуется "перекатом"(не отпуская жмет на другую кнопку. а потом первую отпускает)
Создаешь четыре переменные типа boolean, на каждую клавишу по одной.
Назови их например LeftPressed, UpPressed ну и дальше в таком роде. Это будут флаги обозначающие нажата данная клавиша или нет.
При запуске они изначально все будут false (как и все глобальные boolean если их не инициализировать). Нам это подходит, так что пока их не трогаем.
Теперь пишем обработчики событий нажатия клавиши и отпускания. OnKeyDown и OnKeyUp.
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
// 37 - 40 это коды стрелок
if key = 37 then LeftPressed:=true;
if key = 38 then UpPressed:=true;
if key = 39 then RightPressed :=true;
if key = 40 then DownPressed :=true;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key = 37 then LeftPressed:=false;
if key = 38 then UpPressed:=false;
if key = 39 then RightPressed :=false;
if key = 40 then DownPressed :=false;
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 вне форума Ответить с цитированием
Старый 10.02.2008, 19:48   #55
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

mutabor спасибо! Я так думаю уроки и надо было с этого начинать. Чтож за такая игра, когда нельзя одновременно нажать на две кнопки.

Что-то тело как то непонятно движеться, что-то не то я делаю. а есть готовый рабочий пример?

Beermonza, не могли бы вы расказать более подробно об том, что вы говорили? могли бы вы дать маленький примерчик, чтобы я все понял.
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 11.02.2008, 16:52   #56
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Счастье Подробно

Начните с главного.

- Стратегия - это игра с действиями на карте;
- Карта - это клетки с объектами на них;
- Информационный скелет карты - двумерный массив.

Начинайте создавать игру со "скелета" карты (анализ ПО, сбор данных, типизация, ТЗ и пр. предшествующие пункты плана создания игры вы уже должны были проделать). Тип массива может быть выбран совершенно любым, ...вы должны обдумать каким образом можно представить данные, отвечающие за тот или иной объект.
Допустим, вы решили представлять некоторый объект (например, дом) числом, то массив у вас будет Word типа, поскольку видов объектов в стратегиях большое множество. Но, вам совершенно не удобно использовать такой код. Попробуете сделать таблицу на все 65536 значений, где за каждым числом закреплен рисунок? ...вряд ли!, ...да и тип Byte, вам тоже не подходит. Что же делать?
Давайте вспомним, что каждая ячейка массива может быть не только вместилищем одного типа данных, но и массивом записей или объектов, которые мы можем сами прописать, и указать нужный их тип. Вот так можно представить упрощенный массив объектов, для простой демонстрации:

Код:
Type
  TGameObject = object
    TGOBitmap:    TBitmap; // картинка объекта
    TGOName:      String;   // название объекта в игре
    TGODispX:     Word;     // смещение картинки по-X
    TGODispY:     Word;     // смещение картинки по-Y
  end;
Теперь мы будем использовать этот тип для двумерного массива (ограничим карту 100х100):

Код:
Var
  GameMapMas: array[0..100, 0..100] of TGameObject
Заполняется этот массив в начале игры (загрузка карты), ...затем по мере строительства объектов в самой игре, т.е. тут вы должны четко себе представлять как все происходит в стратегиях, создать процедуры на все случаи изменения карты. Это происходит простым заполнением подмассива в массиве карты:

Код:
GameMapMas[j,i].TGOBitmap:={указатель на картинку, массив текстур};
GameMapMas[j,i].TGOName:={указатель на имя объекта, массив текстур};
GameMapMas[j,i].TGODispX:={указатель на смещение картинки, массив текстур};
GameMapMas[j,i].TGODispY:={указатель на смещение картинки, массив текстур};
i,j -это координаты объекта на карте. Массив текстур уже одномерный, но также содержит в каждой ячейке множество объектов. Тут следует подумать, какие сопутствующие данные, кроме текстуры, вам понадобятся, ...это и тип, подтип, имя, смещение, состояние (вариант текстуры для разных состояний объекта в игре: дом целый, дом сломанный.)

Отображение объектов игры через Canvas

Как применить Canvac вы уже наверное знаете, но тем не менее, уточню. У нас есть экран игры Screen - это объект Image, есть скелет карты - массив GameMapMas, нужно их совместить вот такой строкой:

Код:
Screen.Canvas.Draw((j*MX)-GameMapMas[j,i].TGODispX,  
                             (i*MY)-GameMapMas[j,i].TGODispY,
                             GameMapMas[j,i].TGOBitmap);
MX, MY - это масштаб карты по-X и по-Y в пикселах. Применять эту строку можно в цикле, например, когда идет загрузка карты, или дискретно, на координаты мыши, где следует отобразить объект.

Это только одна сторона медали, так же серьезно следует взяться за задний план карты - это поверхность, как ее нужно отображать, и что она из себя представляет? ...может это просто фон одного цвета, а может и мозаика из разных кусочков - тип грунта и пр. Прежде чем что-то рисовать канвой, следует вернуть назад участок заднего плана, как это будет происходит, зависит от вашего выбора.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

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

Цитата:
Попробуете сделать таблицу на все 65536 значений, где за каждым числом закреплен рисунок? ...врятли!
А зачем таблица? Вот способ если кроме рисунка ничего хранить не надо:

array of array of word + TImageList

TImageList.Draw(canvas,x,y,map[mapx,mapy]);
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.02.2008, 15:11   #58
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
А зачем таблица? Вот способ если кроме рисунка ничего хранить не надо:

array of array of word + TImageList

TImageList.Draw(canvas,x,y,map[mapx,mapy]);
Про таблицу - это сарказм, ...любой способ имеет право на жизнь.

Для начала можно попробовать и просто картинку, ...только это будет графический редактор, или что-то в роде одноразовой аппликации. Все равно придется думать над хранением других данных, кроме картинки, и при том с как можно простым алгоритмом параллельного использования.

Советую отказаться от использования объектов, если в них нет нужды, ...ведь нам нужен сам факт хранения картинок в ОЗУ, давайте делать это напрямую в массив, и выводить рисунок из памяти сразу в объект отображения без посредников. Обратите внимание на то, что в цикле прорисовки кадров в скором времени, когда игра будет совершенствоваться, появится множество процедур, ...тут идет борьба за каждую команду, за правильность выполнения последовательности, ...мы должны будем даже отказаться от привычного умножения (*) и деления (/), заменив их сдвигами.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

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

Цитата:
Сообщение от Beermonza Посмотреть сообщение
...тут идет борьба за каждую команду, за правильность выполнения последовательности, ...мы должны будем даже отказаться от привычного умножения (*) и деления (/), заменив их сдвигами.
когда все становится настолько серьезно, пора вспоминать о двух графических библиотеках, мы все знаем как они называются
конечно, если не делать сдвиги ради самих сдвигов

p.s. 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 вне форума Ответить с цитированием
Старый 14.02.2008, 17:33   #60
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Не буду спорить, ...начинающие выберут метод полегче, если он их устраивает. Давайте не будем ссылаться на две библиотеки , ...и без них можно обходиться и довольно быстро все отрисовывать.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 15:54.
Beermonza вне форума Ответить с цитированием
Ответ


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

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

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


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