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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2011, 09:11   #1
nikitinign
 
Регистрация: 30.08.2011
Сообщений: 8
По умолчанию Mortal Kombat в C++ Builder 2010 - первые шаги

Здравствуйте. Вот решил попробовать написать игру типа Mortal Kombat
и заодно выяснить, можно ли с помощью стандартной библиотеки сделать что то стоящее (хотя бы такого качества http://flash-online-games.ru/stuff/d...mbat/6-1-0-263) или лучше использовать какую ни будь другую библиотеку (или вообще использовать какой ни будь движок). На скорую руку набросал в максе пнг , потому претензии по графики не принимаю, сначала надо качественное управление сделать, а потом рисовать.
Я все же хочу поставить определенную точку с перемещением и идти дальше. Мне ни как не удавалось нормально останавливать перемещение в цикле в FormKeyUp, а в циклах do {
последовательность операторов
} while (условие);
while (условие) оператор;
нет границ да и с ними мне кажется не проще. Если делать перемещение только в таймере без цикла (как обычно делают) то оно будет дерганным. Жарил кашу, и вдруг подумал, а чего бы не соединить таймер и цикл, и само перемещение получилось бы достаточно плавным и без проблем останавливается, и как раз мне подойдет , когда с прыжками начну возиться. Но тут один косяк - , без анимации все ОК, но при включение в цикл анимации кадры загружаются в реальном времени, а перемещение в 10 раз медленнее, можно добавить Sleep(10); ,но тогда чем дольше держишь кейдаун – тем позже происходит остановка перемещения и анимации (да и там такой дисбаланс во времени происходит). Можно поставить 2 таймера, на один перемещение в цикле, во втором анимация – но тогда начинает тормозить. Вот если бы можно было считать перемещение в одном времени, а анимацию в другом, тогда бы все получилось. Подскажите пожалуйста, можно ли это как то сделать , или существует другой путь?
Вот файл http://zalil.ru/31621299
nikitinign вне форума Ответить с цитированием
Старый 30.08.2011, 09:56   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Уважаемый! Первые шаги нужно начинать с консолек и простеньких приложений не содержащих графики. Компьютерная графика, - это вообще высший пилотаж. Куда Вы полезли!
Цитата:
Можно поставить 2 таймера, на один перемещение в цикле, во втором анимация – но тогда начинает тормозить.
Конечно будет тормозить если время таймера меньше времени прорисовки, он ждёт до второго срабатывания. Впрочем графику никто на таймерах не делает.
В DirectX применяется двухбуферная система отображения. Кадр рисуется на одной поверхности, а затем переключается и рисуется на другой.
С шейдерами работает быстрее, но это такой геморрой...
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 30.08.2011 в 10:01.
Smitt&Wesson вне форума Ответить с цитированием
Старый 30.08.2011, 12:26   #3
nikitinign
 
Регистрация: 30.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Уважаемый! Первые шаги нужно начинать с консолек и простеньких приложений не содержащих графики.
Я имел ввиду первые шаги – как геймплэй без ИИ.
Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Впрочем графику никто на таймерах не делает.
Вот тут ( http://www.cyberforum.ru/graphics/thread93716.html ) есть примеры. Мне интереснее что можно сделать стандартным путем не подключая иные библиотеки (DirectX,Open GL). Посоветуйте пожалуйста, что можно улучшить в этом коде
Код:
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
if( Where !=0 )     //Если задано направление
  {

  if( Where==3)             //Если задано движение вправо
  {             // Устанавливаем соответствующие имя  анимации
  for(int i=1;i<13;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
				  {Sleep(20);
				   x+=5;
				   Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
									 // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
		  Dude->LoadFromFile("n"+String(i)+".bmp");       //Загружаем новый кадр анимации под номером i
			 Canvas->Draw(x,y,Dude);
				   dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
				  dump->Canvas->Draw(x,y,Dude);
				  dump->Canvas->Draw(b,c,bb);              //Выводим на форму
				  Canvas->Draw(0,0,dump);	// Делаем это для небольших пауз между кадрам
				   }                   //Увеличиваем положение по x-координата не 5
  }
остальное в файле
nikitinign вне форума Ответить с цитированием
Старый 30.08.2011, 13:12   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Ну, например так можно:

Код:
__fastcall TFormMain::TFormMain(TComponent* Owner): TForm(Owner)
{
    Application->OnIdle = IdleLoop;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::IdleLoop(TObject*, bool &done)
{
// Здесь операторы самой игры.
}
Операторы, находящиеся в IdleLoop, выполняются в бесконечном цикле без тайминга.
При этом комп реагирует на все нажатия кнопок и т.д.
А отсюда я взял алгоритм перерисовки изображения.
Вложения
Тип файла: rar EarthPng.rar (159.5 Кб, 12 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 30.08.2011 в 13:19.
Smitt&Wesson вне форума Ответить с цитированием
Старый 30.08.2011, 22:18   #5
nikitinign
 
Регистрация: 30.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Ну, например так можно:

Код:
__fastcall TFormMain::TFormMain(TComponent* Owner): TForm(Owner)
{
    Application->OnIdle = IdleLoop;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::IdleLoop(TObject*, bool &done)
{
// Здесь операторы самой игры.
}
Операторы, находящиеся в IdleLoop, выполняются в бесконечном цикле без тайминга.
При этом комп реагирует на все нажатия кнопок и т.д.
Спасибо, но только в отличие от обычного таймера тут перемещение (или цикл команд) запускается - останавливается и опять запускается ( как бы сделает шаг, подумает, а потом уже идет), так же как вообще без таймера. Можно ли без остановки запустить команду?
nikitinign вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Первые шаги в Perl Phantom Perl 8 17.08.2018 18:18
первые шаги в с++ ploik Общие вопросы C/C++ 2 16.07.2010 23:35
Первые шаги php Syltan PHP 2 02.01.2010 14:06
Первые шаги trave1er Общие вопросы C/C++ 2 10.09.2008 20:32
Эмуляторы Mortal Kombat 5 Deadly Alliance для ПК Илюха Свободное общение 3 29.07.2008 21:14