nikotinign | Дата: Понедельник, 29 Августа 2011, 21:37 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Здравствуйте. Вот решил попробовать написать игру типа Mortal Kombat и заодно выяснить, можно ли с помощью стандартной библиотеки сделать что то стоящее (хотя бы такого качества http://flash-online-games.ru/stuff/d...mbat/6-1-0-263) или лучше использовать какую ни будь другую библиотеку (или вообще использовать какой ни будь движок). На скорую руку набросал в максе пнг , потому претензии по графики не принимаю, сначала надо качественное управление сделать, а потом рисовать. Я все же хочу поставить определенную точку с перемещением и идти дальше. Мне ни как не удавалось нормально останавливать перемещение в цикле в FormKeyUp, а в циклах do { последовательность операторов } while (условие); while (условие) оператор; нет границ да и с ними мне кажется не проще. Жарил кашу, и вдруг подумал, а чего бы не соединить таймер и цикл, и само перемещение получилось бы достаточно плавным и без проблем останавливается, и как раз мне подойдет , когда с прыжками начну возиться. Но тут один косяк - , без анимации все ОК, но при включение в цикл анимации кадры загружаются в реальном времени, а перемещение в 10 раз медленнее, можно добавить Sleep(10); ,но тогда чем дольше держишь кейдаун – тем позже происходит остановка перемещения и анимации (да и там такой дисбаланс во времени происходит). Можно поставить 2 таймера, на один перемещение в цикле, во втором анимация – но тогда начинает тормозить. Вот если бы можно было считать перемещение в одном времени, а анимацию в другом, тогда бы все получилось. Подскажите пожалуйста, можно ли это как то сделать , или существует другой путь? вот код Code #include <vcl.h> #pragma hdrstop #include "Unit2.h" #include <math.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; Graphics::TBitmap *Dude; int x=225,y=85; // Координаты нашего обьекта Graphics::TBitmap *bb; int b=5,c=85; Graphics::TBitmap* dump=new Graphics::TBitmap; int AnimStep=1; //Кадр анимации String Anim="n"; int Where=0; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if( Key == VK_LEFT) Where=1; if( Key == VK_RIGHT) Where=3; if( Key == VK_UP) Where=5; if( Key == VK_DOWN) Where=2; } //--------------------------------------------------------------------------- void __fastcall TForm2::FormCreate(TObject *Sender) { Dude=new Graphics::TBitmap; Dude->LoadFromFile("n1.bmp"); Dude->Transparent=true; bb=new Graphics::TBitmap; bb->LoadFromFile("n1.bmp"); bb->Transparent=true; dump->Width=Width; dump->Height=Height; dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height)); } //--------------------------------------------------------------------------- void __fastcall TForm2::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { Where=0; Dude->LoadFromFile("n1.bmp"); //Загружаем кадр "простоя" обьекта } //--------------------------------------------------------------------------- void __fastcall TForm2::Timer1Timer(TObject *Sender) { if( Where !=0 ) //Если задано направление { if( Where==3) //Если задано движение вправо { // Устанавливаем соответствующие имя анимации for(int i=1;i<11;i++) // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации { // Делаем это для небольших пауз между кадрами Application->ProcessMessages(); // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации Dude->LoadFromFile("n"+String(i)+".bmp"); //Загружаем новый кадр анимации под номером i Canvas->Draw(x,y,Dude); x+=5; 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 } if( Where==1){ for(int i=1;i<11;i++) // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации { // Делаем это для небольших пауз между кадрами Application->ProcessMessages(); // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации Dude->LoadFromFile("n"+String(i)+".bmp"); //Загружаем новый кадр анимации под номером i Canvas->Draw(x,y,Dude); x-=5; 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); // Делаем это для небольших пауз между кадрам } } if (x<b+65) { x = b + 65; for(int i=1;i<33;i++) // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации { b-=1; 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); } } if( Where==5) //Вверх { y-=5; } if( Where==2) //Вниз { y+=5; } } 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); } вот файл http://zalil.ru/31621299
Сообщение отредактировал nikotinign - Понедельник, 29 Августа 2011, 21:41 |
|
| |
Apati | Дата: Вторник, 30 Августа 2011, 09:00 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Загружай в массив все кадры анимации через FormCreate, а потом в цикле рендери Canvas->Draw(x,y,Dude[i]);
|
|
| |
nikotinign | Дата: Вторник, 13 Сентября 2011, 21:25 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Quote (Apati) Загружай в массив все кадры анимации через FormCreate, а потом в цикле рендери Canvas->Draw(x,y,Dude[i]); Если я все правильно понял, можно сделать в блокноте такой массив 123456789123456789123456789 и каждой цифре присвоить кадр, но тогда перемещение будет начинаться всегда с местоположения 1 а заканчиваться где попало, или надо как то по другому сделать?
|
|
| |