Как реализовать прыжок персонажа?

Пишу для практики игру, которая выскакивает в хроме, когда интернета нет. Есть две вещи, которые не получается реализовать в коде. 1. Прыжок(нужно, чтобы при нажатии на стрелку вверх прыгал). Мне нужно сделать так, чтобы он начал двигаться вверх, потом остановился и начал обратно двигаться вниз. 2. Если персонаж сталкивается с кактусом, то движение прекращается, начинается смена образов на статичные. Но вот я сделала сравнение по одной координате, но теперь понимаю, что нужно по-другому, как не понимаю. Буду очень благодарна, если поможете хотя бы с прыжком))
#include <vcl.h>
#pragma hdrstop
 
#include "dino1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
Graphics::TBitmap*dino1 = new Graphics::TBitmap();
Graphics::TBitmap*dino2 = new Graphics::TBitmap();
Graphics::TBitmap*dino3 = new Graphics::TBitmap();
Graphics::TBitmap*dino4 = new Graphics::TBitmap();
Graphics::TBitmap*Kaktus1 = new Graphics::TBitmap();
Graphics::TBitmap*Kaktus4 = new Graphics::TBitmap();
 int x=100, y=150;
 int a=600, b=150;
 int flag = 1;
 int rd; //0-дино не прыгает, 1-дино прыгает
 TRect aRect;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
 
{       dino3->LoadFromFile("dino3.bmp");
        dino3->Transparent=true;
 
        Kaktus1->LoadFromFile("Kaktus1.bmp");
        Kaktus1->Transparent=true;
 
        Kaktus4->LoadFromFile("Kaktus4.bmp");
        Kaktus4->Transparent=true;
 
        dino1->LoadFromFile("dino1.bmp");
        dino1->Transparent=true;
 
        dino2->LoadFromFile("dino2.bmp");
        dino2->Transparent=true;
 
        dino4->LoadFromFile("dino4.bmp");
        dino4->Transparent=true;
 
 
 
        Timer1->Interval = 10;
        Timer2->Interval = 20;
 
        rd=0; //дино не прыгает
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    Canvas->Draw(x,y,dino1);
    aRect=Rect(0,250,10000,255);   //земля полоска
    Canvas->Brush->Color=clPurple;
    Canvas->FillRect(aRect);
 
    Canvas->Draw(a,b,Kaktus1); //кактус 1
 
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{     //таймер для динозаврика
      if(x+55!=a)   //если только по этой координате, то будет останавливаться даже в прыжке с кактусом
 
      {
 
      if(1 == flag)
      {
        //стереть картинку
        //переместить картинку
        //загрузить одну картинку
        Canvas->Brush->Color=Form1->Color;
        Canvas->FillRect(Rect(x,y,x+100,y+100));
        Canvas->Draw(x,y,dino2);
        flag = 0;
      }
      else
      {
        //стереть картинку
        //переместить картинку
         //загрузить другую картинку
                Canvas->Brush->Color=Form1->Color;
                Canvas->FillRect(Rect(x,y,x+100,y+100));
                Canvas->Draw(x,y,dino1);
                flag = 1;
                 }             }
 
      else
      {
           Canvas->Brush->Color=Form1->Color;
           Canvas->FillRect(Rect(x,y,x+100,y+100));
           Canvas->Draw(x,y,dino3);
 
         }
 
        if(rd!=0)
        {
           if(rd==1)
           {
               Canvas->Brush->Color=Form1->Color;
               y=x*x;
               Canvas->FillRect(Rect(x,y,x+100,y+100));
               Canvas->Draw(x,y,dino4);
 
                }
 
 
                }
 
}
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
     if(rd!=0)  //прыжок
     return;
 
   if(Key==VK_UP)
    rd=1;
 
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
//таймер для кактуса
        if(a!=x+55)
         {
                Canvas->Brush->Color=Form1->Color;
                Canvas->FillRect(Rect(a,b,a+100,b+100));
                a=a-1;
                Canvas->Draw(a,b,Kaktus1);    }
        else
        {
                Canvas->Brush->Color=Form1->Color;
                Canvas->FillRect(Rect(a,b,a+100,b+100));
                Canvas->Draw(a,b,Kaktus4);
 
                }
}
//---------------------------------------------------------------------------
5 ответов

Хотя я и не знаю, что вам нужно, я понял, что вам нужен бегемотик в виде динозавра, который может ходить влево-вправо, прыгать, не выходить за грани и сталкиваться с кактусом. Всё это я реализовал проще некуда! Бегемотик управляется стрелочками на клавиатуре. Вот исходник


Image1->Top а возможна данная реализация в битовых образах? или придется все же задавать прорисовку в таймере при нажатии клавиши вверх?


Лучше использовать один таймер и внутри писать: если зажата стрелка вверх, вызываем функцию vverh() и так же с другими. Только вот с многозадачностью проблемы будут. Если разные потоки, всеравно к одной картинке одновременно нельзя дать разные команды, как я помню. Вылезет ошибка наподобие ошибка доступа


Разные таймеры т к движение объектов должны быть с разными скоростями.


а возможна данная реализация в битовых образах?
Возможна для тех, у кого есть опыт работы с битовыми образами.