Вторник, 26 Ноября 2024, 14:14

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Mortal Kombat в C++ Builder 2010 - первые шаги
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 а заканчиваться где попало, или надо как то по другому сделать?
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг