Конференция "Игры" » Движок для квеста и квест без движка [Delphi, Windows]
 
  • mr.sokolOFF © (25.09.07 19:01) [0]
    Без долгих предисловий начну свою трагическую историю...
      Начали мы с товарищем недавно делать квест. Сюжет, графика (2D ala "Петька и Ко") - это не проблема, а вот код... Я перебрал множество бесплатных конструкторов вроде WME, однако, почему-то они мне показались все малофункциональными и я решил изобрести в очередной раз велосипед...)
      Так вот, в чём же суть вопроса... ВОЗМОЖНО ЛИ НАПИСАТЬ ДВУХМЕРНЫЙ КВЕСТ БЕЗ ИСПОЛЬЗОВАНИЯ КАКИХ-ЛИБО ДВИЖКОВ (то бишь - чистый код...)? Я так подозреваю, что возможно (хотя и очень неудобно и вообще...).

      Собственно, кое-какие наработки уже есть, однако, тут же возникают интересные и многочисленные проблемы с, например, TImage, который, при перемещении по экрану (посредством изменения Top и Left) как-то странно обновляется... Короче, это его обновление очень уж заметно невооружённому глазу. Никакие Application.ProcessMessages не помогают. ЧТО ДЕЛАТЬ?!
  • antonn © (25.09.07 19:05) [1]

    >   Так вот, в чём же суть вопроса... ВОЗМОЖНО ЛИ НАПИСАТЬ
    > ДВУХМЕРНЫЙ КВЕСТ БЕЗ ИСПОЛЬЗОВАНИЯ КАКИХ-ЛИБО ДВИЖКОВ (то
    > бишь - чистый код...)?

    тут, наверное, какое то недопонимание...
    движок - это совокупность высокоуровневых средств для работы с низкоуровневыми операциями (грубо говоря). Он обычно чистый код:) Или речь о GDI?

    TImage - это значит, что все хуже, чем кажется на первый взгляд:) Нужно рисовать на TBitmap в памяти все объекты, а потом его выводить одним махом на форму.
  • mr.sokolOFF © (25.09.07 19:10) [2]
    <TImage - это значит, что все хуже, чем кажется на первый взгляд:) Нужно <рисовать на TBitmap в памяти все объекты, а потом его выводить одним <махом на форму.

    Короче, думаю, ясно, что я ужасный программист... Я имел в виду компонент Image. А изображения в него я гружу в начале работы программы

    <движок - это совокупность высокоуровневых средств для работы с <низкоуровневыми операциями (грубо говоря). Он обычно чистый код:) Или <речь о GDI?

    Движок - это некая система, облегчающая выполнения многих операций. Например, в квестовых движках "хождение" основного персонажа прописано изначально. По крайней мере, я так думаю =))))

    А ведь всё дело именно в этой ходьбе! Предполагается, что наш главгерой будет не только ходить, но и летать. Так что...
  • antonn © (25.09.07 22:36) [3]
    рекомендую сначаа поделать игры попроще - Питона, сокобана :)
    серьезно:)
  • MOO (25.09.07 22:59) [4]

    > mr.sokolOFF ©

    ну тык движок и есть чистый код. По твоему, как движки пишут? С бубном и волшебной палочкой?
  • Хелпер (26.09.07 04:43) [5]

    > mr.sokolOFF ©   (25.09.07 19:01)

    Лучше плюнь на TImage. Это одна картинка выводится на нём туда-сюда, а если их будет целая куча, да ещё с анимациями, то это будут одни сплошные тормоза.

    В крайнем случае глянь демки от G32: http://sourceforge.net/projects/graphics32
    Там более менее со скоростью нормально.

    И думаешь люди от хорошей жизни 3D графику выдумали?

    Она позволяет хранить в видеопамяти все твои картинки, и выводить их без лишних тормозов.

    И, наконец, главный вопрос, с которого вообще то нужно начинать. Кто будет рисовать персонажей со всеми анимациями и бэки?
  • antonn © (26.09.07 12:23) [6]

    > В крайнем случае глянь демки от G32: http://sourceforge.
    > net/projects/graphics32
    > Там более менее со скоростью нормально.
    >
    > И думаешь люди от хорошей жизни 3D графику выдумали?
    >
    > Она позволяет хранить в видеопамяти все твои картинки, и
    > выводить их без лишних тормозов.

    ой да ладно, хватит и обычных TBitmap :)
  • Dark Lord © (26.09.07 16:34) [7]
    Самый простой способ для вывода 2Д графики - это рисовать на Canvas
    Сначала всю сцену рисуешь в Bitmap, который хранится в памяти и равен размерам элемента, на который выводится изображение.
    Затем на экран одним махом выводишь уже готовую картинку.
    Все эти процедуры по копированию картинок туда-сюда можно весьма просто реализовать через функцию BitBlt.  Думаю, с ней вопросов не возникнет. Она весьма хорошо описана в помощи.
  • Shirson. (26.09.07 17:19) [8]
    >mr.sokolOFF ©   (25.09.07 19:01)
    > Собственно, кое-какие наработки уже есть, однако, тут же возникают интересные и многочисленные проблемы с, например, TImage, который, при перемещении по экрану (посредством изменения Top и Left) как-то странно обновляется...


    Ты грузишь картинку в контейнер (TImage), у которого офигенная избыточность, для твоих нужд. Потом ты этот контейнер начинаешь мурыжить по форме, вызывая лавину сообщений об обновлении и переисовки на форме и самом TImage.
    Если таким образом делать мультипликацию, то уже на паре-тройке TImage всё встанет колом.

    Метода создания движущегося изображения придумана аниматорами, в тех лохматых годах, когда даже кино было не мультимедийным :) Однако принципы эти действуют и по сей день.

    Итак, берётся картника, которая будет фоном.
    Берётся картинка которая будет двигаться.
    Берётся картника, которая будет выполнять роль "закулисного" вместилища. Её еще называют back buffer.
    Далее, на back buffer копируется изображение фона.
    Потом, в нужном месте, копируется картинка, которая двигается.
    Затем, back buffer копируется на "экран".
    Следующий цикл -
    На back buffer копируется изображение фона.
    В нужном месте, копируется картинка, которая двигается.
    back buffer копируется на "экран".
    Следующий цикл - ...

    Как это реализуется в двоём случае.
    Я пишу самый примитивный вариант, чтобы было предельно просто и понятно. Потом, когда разберёшься с этим, сам поймёшь, как и что улучшить.

    На форму ложишь таймер, и устанавливаешь интервал 10.
    Объявляешь 3 глобальных TBitmap:
    Фон
    "Персонаж"
    задний буфер.

    На событие создания формы
    Создаёшь все три битмапа.
    Битмапу заднего буфера задаёшь размеры сцены.
    Грузишь в битмап фона картинку фона из файла (loadfromfile)
    Грузишь в битмап персонажа картинку, которая должна двигаться.

    На событие таймера
    Копируешь на битмап заднего буфера картинку фона (canvas.draw)
    Копируешь на битмап заднего буфера картинку персонажа в нужных координатах.
    Копируешь на канвас формы битмап заднего буфера.

    Всё. Запускаешь и смотришь.

    Если картинка фона меньше по размерам чем задний буффер, то последний придётся принудительно очищать.
  • PixelShader © (26.09.07 18:23) [9]
    Можно использовать готовый движок, если не хочешь изучать какой-то GAPI и писать свой. Та тот же ДелфиХ(или Asphyre) для такой игры покатит.
  • mr.sokolOFF © (26.09.07 18:37) [10]

    > рекомендую сначаа поделать игры попроще - Питона, сокобана
    > :)
    > серьезно:)


    Игры попроще? Мною уже был реализован толковый "Компьютерщик")) Толку, конечно, от него - как от тетриса, но всё же...


    > ну тык движок и есть чистый код. По твоему, как движки пишут?
    >  С бубном и волшебной палочкой?


    Вполне вероятно, что я некоректно выразился: ну разумеется, движок - это и есть чистый код. Однако. Мой, пусть и небольшой, опыт делания всяких аркад говорит от том, что для реализации всяких "леталок" в любом движке гораздо больше удобных средств, нежели это творить стандартными средствами дельфи. Скажем, в том же двиге LKI Creator уже сразу существует тип "игровой объект", который имеет массу интересных параметров, вроде "скорость", "кол-во хитпоинтов" и пр. Мысль, надеюсь, ясна.


    > И думаешь люди от хорошей жизни 3D графику выдумали?


    Думаю, на данном этапе нам будет сложновато реализовывать ещё и 3д))

    >
    > И, наконец, главный вопрос, с которого вообще то нужно начинать.
    >  Кто будет рисовать персонажей со всеми анимациями и бэки?
    >


    В принципе, мог бы и я, но, слава богу, есть толковый 2д\3д-художник, который с радостью согласился. Другое дело, что он-то действительно толковый, а вот я...))


    > Самый простой способ для вывода 2Д графики - это рисовать
    > на Canvas


    Спасибо большое, Dark Lord, за идею - как-то я сразу об этом и не подумал... Насколько Я понимаю, в качестве cancas'а можно использовать даже саму форму? Или я в очередной раз говорю бред?))

    Ну и напоследок - самое главное.

    Shirson, спасибо большое)) Мало того, что подсказал и развил идею, так ещё и предоставил псевдокод)) Всё работает! Я весьма удивлён...
    Конечно, глупая затея - обходить стороной движки и конструкторы. Может, я всё же образумлюсь... Но пока - всё отлично!) С перемещением, по крайней мере. Анимацию ещё попробовать не удалось...
  • mr.sokolOFF © (26.09.07 18:38) [11]

    > Можно использовать готовый движок, если не хочешь изучать
    > какой-то GAPI и писать свой. Та тот же ДелфиХ(или Asphyre)
    > для такой игры покатит.


    Просто всё дело-то в том, что я уже пробовал для этих целей переделать LKI Creator... Однако, обнаружились невиданные глюки))) Но всё же спасибо за совет... Движок - это однозначно - более правильный вариант, нежели заниматься такой вот ерундой...
  • mr.sokolOFF © (26.09.07 18:53) [12]
    Хотя... Только что вот обнаружил интересную вещь (типа, глюк).

    Создаю я, значит, TBitMap. Гружу в него картинку. Реализую затем её на форму. Сворачиваю форму. Снава разворачиваю - картинки уж нет. Короче, если хоть какое-то стороннее окно (тот же Winamp, например) перекрывает форму - нарисованное в области перекрывания сразу исчезает.

    Вопрос: Как быть?
  • Dib@zol © (26.09.07 19:31) [13]
    Поётся на мотив оды: ОпенДжыЕль, ОпенДжыЕель, ОпенДжыыЕееееель!!! =)

    > Реализую затем её на форму
    А по теме: может ты не так "реализуешь"? Выводи прямо на DC окна и 90% вероятности будет тебе щастье...
  • ANTPro © (26.09.07 19:31) [14]
    > [12] mr.sokolOFF ©   (26.09.07 18:53)
    > Вопрос: Как быть?

    Используй стронний 2D движок.
  • красотка (С) (26.09.07 19:40) [15]
    элементарно ватсон.
    Отлавливать события и выполнять перерисовку.
  • Shirson © (26.09.07 19:44) [16]
    mr.sokolOFF если ты один раз вывел картинку на канву формы, она там проживёт до первого сообщения о перерисовке, которое приходит при перекрытии формы чем-либо или при разворачивании формы.
    Если посмотреть внутрь коспонентов, они рисуются. Просто сделано это хитрым способом, с завязкой на события по перерисовке. Потому, компоненты "хорошо выглядят" при всяческих пертрубациях с формой.
    В игре такой подход не самый правильный. Если речь идёт про игру с динамичной графикой. Для "Компутерщика" бы прокатило :)

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

    >Мой, пусть и небольшой, опыт делания всяких аркад говорит от том, что для реализации всяких "леталок" в любом движке гораздо больше удобных средств, нежели это творить стандартными средствами дельфи. Скажем, в том же двиге LKI Creator уже сразу существует тип "игровой объект", который имеет массу интересных параметров, вроде "скорость", "кол-во хитпоинтов" и пр. Мысль, надеюсь, ясна.

    Сначала сам сделай хоть одну игру в динамике. Полностью сам. Когда поймёшь, что к чему и как, когда появится свой стиль и своё понимание, как лучше всего делать, тогда и выбирай из готовых движков.
    Много времени надо? Нет, не очень, зато результат будет. А если сразу за движки браться, то а) ничему толком не научишься и б) всё заглохнет из-за непонимания сути процесса построения игр.
    Т.е. и время потеряно и результата нет.
  • mr.sokolOFF © (26.09.07 19:53) [17]

    > Для этого можно использовать таймер, как самый лёгкий путь.


    А нелёгкий?)) Просто циклами обойтись, н-р? Или и то, и то?
  • Dark Lord © (26.09.07 20:03) [18]
    Я кстати, тоже абсолютно согласен, что особенно на первых порах важно игру написать от "А" до "Я". Когда опыта много и не хочется возиться с тем, чтобы что-то опять в тысячный раз писать с нуля, можно и движок чей-то взять. Тем более, что если движок действительно функциональный, то в нем еще и разобраться надо. А это тоже непросто. Мне проще лично написать с нуля, чем разобрать чужой код. Особенно когда он сложный и большой. Да и вообще - а зачем вы игру делаете? Ты именно? Если ты не получаешь удовольствия от самого процесса создания - значит и делать ее не стоит. А смысл находя удовольствие в самом процессе написания игры пытаться нарыть готовый движок? Давайте тогда вообще сразу чей-то код полностью стырим, заменим ресурсы простнапросто и скажем что это мой новый супер хит! В чем же тогда прикол?
  • mr.sokolOFF © (26.09.07 20:10) [19]
    2Dark Lord
      Разумеется, делается это всё ради удовольствия. Всегда хотел быть девелопером)) Да и программирование мне дико нравится. Раз рисовать не умею - чего ж ещё делать?))
      А насчёт движка - я полагаю просто, что моего уровня (простирающегося лишь, как писал выше, до создания всяких "Компьютерщиков" и прочих "Туалетных империй") не хватает для написания "с нуля". Однако... Будем пробовать с нуля))
  • mr.sokolOFF © (26.09.07 20:48) [20]
    2Dib@zol ©

    Form.Canvash.Draw(...) - так и есть всё...
  • Shirson © (26.09.07 20:53) [21]

    > mr.sokolOFF ©   (26.09.07 19:53) [17]
    > А нелёгкий?)) Просто циклами обойтись, н-р? Или и то, и то?

    Лёгкий в понимании. Некоторые движки имеют раздельные таймеры для обсчёта игрового тика и для обновления экрана.
    Можно условно-бесконечным циклом с подсчётом тиков процессора (удобно и просто).


    >А насчёт движка - я полагаю просто, что моего уровня (простирающегося лишь, как писал выше, до создания всяких "Компьютерщиков" и прочих "Туалетных империй") не хватает для написания "с нуля".


    Чушь. Если в игре нет динамического формирования сцены, это не значит, что она плохая. Тот же "Компьютерщик", по функционалу и наполнению, послождее  динамической змейки может быть. Просто РАЗНЫЙ тип задач.

    Так что пробуй. Когда сделаешь полностью готовую игру, получшь непередаваемые ощущения. А начать лучше всего со звейки, тут я с Антоном Андреевичем [3] полностью согласен. Не шибко сложно, чтобы отпугнуть, и вполне себе с наполнением всякими фишками.

    Если что - спрашивай, всегда ответим.
  • antonn © (26.09.07 21:21) [22]

    > Form.Canvash.Draw(...) - так и есть всё...

    ыыы, не стоит, юзай canvas.copyrect() или BitBlt() для вывода буферного битмапа на форму. Больше никаких граней соприкосновения с формой быть не должно (ну нежелательно), все нужно рисовать на буферном битмапе.


    > А начать лучше всего со звейки, тут я с Антоном Андреевичем
    > [3] полностью согласен.

    ура, я знаменит! %))
  • Shirson © (26.09.07 22:58) [23]

    > antonn ©   (26.09.07 21:21) [22]
    > ура, я знаменит! %))

    Нет, я просто знаю как тебя зовут :)
  • mr.sokolOFF © (29.09.07 21:20) [24]
    Ламерский вопрос но... Как очистить canvash? По идее, для этого должна служить команда "Free", однако, при ней программа вылетает с ошибкой... а без очистки никакая анимация не идёт...

    И это при том, что сам канваш создан и картинка на форме нормально рисуется...
  • antonn © (29.09.07 23:39) [25]
    не надо чистить канвас (вопрос странный - залить другим цветом - canvas.fiilrect()), надо использовать tbitmap
  • PixelShader © (30.09.07 11:50) [26]
    Free в Делфи - это вызов деструктора. Отсюда и AV. antonn дело говорит, юзай или TBitmap или HDC.
  • PixelShader © (30.09.07 11:57) [27]
    Схема примерно такая :
    DrawBackground();
    DrawGameObjects();
    DrawGUI();
    и ничего очищать не придеться. причем лучше это делать не в ОнПэйнт, а использовать так называемый мертвый цикл. Как вариант можно использовать компонент TTimer и его ивент OnTimer.
  • mr.sokolOFF © (30.09.07 12:55) [28]
    Погоди-ка. Даже если делать так... Всё равно всё тормозит при перемещении объекта по экрану (не очень сильно, но заметно всё)! Так какой смысл был городить этот огород?
  • PixelShader © (30.09.07 12:59) [29]
    Смысл в том что идет непрерывная перерисовка экрана. При анимации старый кадр спрайта будет оставаться как мусор если этого не делать. А тормозит из-за того что ты используешь Canvas\TBitmap и тд. Если хочешь чтоб не тормозило, то пиши на DirectDraw\D3D\OpenGL\ASM =) А мертвый цикл обработки логики и рендера это один из базовых приемов организации игр.
  • mr.sokolOFF © (30.09.07 13:00) [30]
    Ну ... ЭЭ... DirectDraw... Мне до подобного ещё 20 лет расти в уровне...
  • PixelShader © (30.09.07 13:02) [31]
    Та это тебе так кажется. Почитай книгу Михаила Краснова. Там все очень доступно и понятно описано.
  • mr.sokolOFF © (30.09.07 13:16) [32]
    А название почётче?..) что-то со словом "DirectX"?)
  • antonn © (30.09.07 15:04) [33]
    можно и с Tbitmap, вопрос только как его юзать:)
    код давай:)
  • PixelShader © (30.09.07 16:15) [34]
    Михаил Краснов. DirectX. Графика в проектах Delphi .
  • someOne (30.11.08 03:20) [35]
    Кста, движки типа Asphyre - не сильно быстрее GDI... Максимум в 1.5-2 раза Если грамотно GDI использовать - результат не хуже.
  • AlmazVit (19.05.10 21:33) [36]
    Используй функции формы alphablend:=true; and alphablendValue:=от1 до 255 так как тип byte  это функции отрисовки формы, 255 полная отрисовка ну чем меньше тем прозрачние, иногда помогает решить такие проблемы как твоя устонови 250 визуально незаметно а ефект моргание может исчезнуть
  • brother © (24.05.10 05:43) [37]
    Когда-то делал подобное:
    http://brotherirk.narod.ru/download/Quest2.rar
    разбирайся)
  • @!!ex © (24.05.10 08:40) [38]
    Теме сто лет в обед...
    Если кому-то что-то и нужно было, то оооочень давно.
  • brother © (24.05.10 09:02) [39]
    я уже понял( но мало ли)
  • MacTepCnupTa (18.04.11 21:54) [40]
    А я воспользуюсь) Правда я вряд ли в этом разберусь)
  • KilkennyCat © (24.04.11 16:37) [41]

    > Используй функции формы alphablend:=true; and alphablendValue:
    > =от1 до 255 так как тип byte  это функции отрисовки формы,
    >  255 полная отрисовка ну чем меньше тем прозрачние, иногда
    > помогает решить такие проблемы как твоя устонови 250 визуально
    > незаметно а ефект моргание может исчезнуть

    какой ужас!
 
Конференция "Игры" » Движок для квеста и квест без движка [Delphi, Windows]
Есть новые Нет новых   [118232   +41][b:0.001][p:0.001]