c++ builder - ruch kulki

0

Mam do napisania program, w ktorym pionowy prostokąt ma sie przesunąc w kierunku kulki, uderzyc w nią a następnie kulka ta ma sie potoczyc dalej i sie zatrzymac. Wiem tylko ze mam uzyc timera, wstawic kilka objektów, ktore mają po kolei sie pojawiac, co bedzie wyglądało jakby kulka ta sie toczyla.
Nie mam pojecia jak to napisac i prosze o jakakolwiek wskazowke.

0

Napisz czego konkretnie nie wiesz.

0

nie wiem jak napisac w kodzie, zeby objekty(kilka okregow ulozonych w lini prostej) po kolei byly widoczne, a te poprzednie znikaly. Ma to byc taka jakby animacja.

0

moze lepiej podam gg - 4473137

0

Potrzebuje ruszajacych sie kulek, fajnie jakby sie od siebie odbijaly, ale to ambicja na pozniej.
Na razie, jak widac, mam ich stworzonych 4.

Problem: w momencie gdy zaczynaja sie ruszac mam tylko 4 zmienne (x1,x2,y1,y2) w związku z czym moje 4 kulki robia sie w jedna.
Slyszalam, ze problem mozna rozwiazac uzywajac macierzy, ale nie mam pojecia jak sie za to zabrac. Czy moglabym prosic o pomoc?

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent
Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

int x1,x2,x3,y1,y2,y3;
int vx=1;
int vy=1;

void clean()
{
Form1->PaintBox1->Canvas->Brush->Color=clSkyBlue;
Form1->PaintBox1->Canvas->FillRect(TRect(0,0,Form1->PaintBox1->Width,Form1->PaintBox1->Height));
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
x1=50;
y1=50;
x2=100;
y2=100;
x3=50;
y3=60;
clean();
PaintBox1->Canvas->Brush->Color=clRed;
for(int i=1;i<5;i++)
{
PaintBox1->Canvas->RoundRect(x1,y1,x2,y2,x3,y3);
x1=-x1+445;
x2=-x2+445;
y1=y1+34;
y2=y2+34;
}
Form1->Timer1->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject Sender)
{
y1+=vy
10;
x1+=vx10;
y2+=vy
10;
x2+=vx*10;
clean();
PaintBox1->Canvas->Brush->Color=clRed;

PaintBox1->Canvas->RoundRect(x1,y1,x2,y2,x3,y3);

if(x2>Form1->PaintBox1->Width) vx=-vx;
else if(y2>Form1->PaintBox1->Height) vy=-vy;
else if(x1<0) vx=-vx;
else if(y1<0) vy=-vy;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DoubleBuffered=true;
}
//---------------------------------------------------------------------------

0

Nie lepiej zamiast rysowanej kulki użyć TShape (Shape = stCircle) i rzesuwać go po formie.

0

O to chodzi?

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

struct { double x,y,r,vx,vy; TColor clr; } Balls[]=
  {
    {50,50,25,10,8,clRed},
    {250,250,30,-10,12,clOlive},
    {350,150,40,13,-7,clGreen},
  };
const unsigned BallCount=sizeof(Balls)/sizeof(*Balls);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
  {
   DoubleBuffered=true;
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
  {
   unsigned W=PaintBox1->Width,H=PaintBox1->Height;
   PaintBox1->Canvas->Brush->Color=clSkyBlue;
   PaintBox1->Canvas->FillRect(TRect(0,0,W,H));
   PaintBox1->Canvas->Pen->Style=psClear;
   for(unsigned i=0;i<BallCount;++i)
     {
      PaintBox1->Canvas->Brush->Color=Balls[i].clr;
      double r=Balls[i].r,x=Balls[i].x,y=Balls[i].y;
      PaintBox1->Canvas->Ellipse((int)(x-r),(int)(y-r),(int)(x+r),(int)(y+r));
     }
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
  {
   unsigned W=PaintBox1->Width,H=PaintBox1->Height;
   for(unsigned i=0;i<BallCount;++i)
     {
      double r=Balls[i].r,w=W-r,h=H-r;
      Balls[i].x+=Balls[i].vx;
      Balls[i].y+=Balls[i].vy;
      if(Balls[i].x<r)      { Balls[i].x=r; Balls[i].vx=-Balls[i].vx; }
      else if(Balls[i].x>w) { Balls[i].x=w; Balls[i].vx=-Balls[i].vx; }
      if(Balls[i].y<r)      { Balls[i].y=r; Balls[i].vy=-Balls[i].vy; }
      else if(Balls[i].y>h) { Balls[i].y=h; Balls[i].vy=-Balls[i].vy; }
     }
/*
   for(unsigned a=0;a<BallCount;++a)
     {
      double ar=Balls[a].r,ax=Balls[a].x,ay=Balls[a].y;
      double avx=Balls[a].vx,avy=Balls[a].vy,ar3=ar*ar*ar;
      for(unsigned b=a+1;b<BallCount;++b)
        {
         double br=Balls[a].r,bx=Balls[b].x,by=Balls[b].y;
         double bvx=Balls[b].vx,bvy=Balls[b].vy,br3=br*br*br;
         double x=ax-bx,y=ay-by,len=sqrt(x*x+y*y);
         if(len<ar+br)
           {
            double ex=avx*avx*ar3+bvx*bvx*br3,ey=avy*avy*ar3+bvy*bvy*br3;

            Balls[a].vx+=sqrt(ex*br3/(ar3*(ar3+br3)));
            Balls[a].vy+=sqrt(ey*br3/(ar3*(ar3+br3)));
            Balls[b].vx+=sqrt(ex*ar3/(br3*(ar3+br3)));
            Balls[b].vy+=sqrt(ey*ar3/(br3*(ar3+br3)));
            x=Balls[a].vx+Balls[b].vx;
            y=Balls[a].vy+Balls[b].vy;
            double L=sqrt(x*x+y*y)/(ar+br-len);
            Balls[a].x+=L*Balls[a].vx;
            Balls[a].y+=L*Balls[a].vy;
            Balls[b].x+=L*Balls[b].vx;
            Balls[b].y+=L*Balls[b].vy;
           }
        }
     }
*/
   PaintBox1->Invalidate();
  }
//---------------------------------------------------------------------------

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.