Примерчик хороший Писано в С++ Builder 2007. На форме TButton, TTimer и TImage, с именами по умолчанию.
| Код | //---------------------------------------------------------------------------
#include <vcl.h> #include <math.h> #pragma hdrstop #include "Main_SimplAnimation.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TAnime *Anime; //--------------------------------------------------------------------------- short int cadr = 0; // номер кадра short int H=30; // длина ноги и руки short int Xpos = 3 * H; // координата опорной ноги short int Ypos = 120; // "земля" short int Hmen = 30; // высота тела short int Rhead = 10; // радиус головы short int revers = 1; // направление движения short int L = H * 1.41; // длина ноги short int Ncadr=16; // число кадров на шаг //--------------------------------------------------------------------------- __fastcall TAnime::TAnime(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TAnime::Draw() { float Angl = M_PI/4*(1+(2.*cadr)/(Ncadr-1)); short int Yb = Ypos-H*sin(Angl); short int Yt = Yb-Hmen; short int X = Xpos-revers*H*cos(Angl);
Image1->Canvas->MoveTo(X-(Xpos-X),Ypos); Image1->Canvas->LineTo(X,Yb); // нога if (cadr != Ncadr / 2-1) Image1->Canvas->LineTo(Xpos,Ypos); // другая нога Image1->Canvas->MoveTo(X,Yb); Image1->Canvas->LineTo(X,Yt); // туловище short int X1 = X - revers * (Yb-Ypos); Image1->Canvas->MoveTo(X1,Yt+5-(Xpos-X)); Image1->Canvas->Ellipse(X1-Rhead / 2,Yt+5-(Xpos-X)-Rhead / 2,X1+Rhead / 2,Yt+5-(Xpos-X)+Rhead / 2); Image1->Canvas->LineTo(X,Yt+5); // рука if (cadr != Ncadr / 2-1) { Image1->Canvas->Ellipse(X1-Rhead / 2,Yt+5+(Xpos-X)-Rhead / 2,X1+Rhead / 2,Yt+5+(Xpos-X)+Rhead / 2); Image1->Canvas->LineTo(X1,Yt+5+(Xpos-X)); // другая рука } Image1->Canvas->Ellipse(X-Rhead,Yt-2*Rhead,X+Rhead,Yt); Image1->Canvas->Rectangle(X-Rhead,Yt-2*Rhead-4,X+Rhead,Yt-2*Rhead-1); // шляпа } //--------------------------------------------------------------------------- void __fastcall TAnime::Button1Click(TObject *Sender) { DoubleBuffered = true; Timer1->Enabled = ! Timer1->Enabled; } //--------------------------------------------------------------------------- void __fastcall TAnime::FormCreate(TObject *Sender) { Image1->Canvas->MoveTo(0,Ypos+3); Image1->Canvas->Pen->Width = 4; Image1->Canvas->LineTo(Image1->ClientWidth,Ypos+3); // земля Image1->Canvas->Pen->Width = 1; Image1->Canvas->Pen->Mode = pmNotXor; Timer1->Interval = 600 / Ncadr; Draw(); } void __fastcall TAnime::Timer1Timer(TObject *Sender) { Draw(); cadr = (cadr+1) % Ncadr; if (cadr == 0) if ((Xpos < Image1->Picture->Width-revers*3*H) && (Xpos>-revers*3*H)) Xpos += revers*H*1.41; else revers = -revers; Draw(); } //---------------------------------------------------------------------------
|
|