Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 17:55   #1
ZET78
Пользователь
 
Регистрация: 02.05.2010
Сообщений: 60
По умолчанию Анимация

Доброго времени суток, кто может подсказать, как сделать так, чтоб при перемещении объекта он не дергался, т.е. когда он меняет свои координаты, он не мерцал, а все было плавно???
собственно вот код:
Код:
include <vcl.h>
#include <math.h>
#include <windows.h>
#pragma hdrstop

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


}
    int * coorE=new int [1];
    int * coorU=new int [1];
void coordinates(double fi,double r,int * coor ){
delete [] coor;
coor = new int [1];
coor[0]=ceil(r*cos((M_PI * fi) /180.0));
coor[1]=ceil(r*sin((M_PI * fi) /180.0));}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Graphics::TBitmap * mgr= new Graphics::TBitmap;
mgr->LoadFromFile("osn.bmp");
Form1->Canvas->Draw(1, 1 , mgr);
   Graphics::TBitmap * gr= new Graphics::TBitmap, * sun= new Graphics::TBitmap, *earth= new Graphics::TBitmap, * jupiter= new Graphics::TBitmap, * io = new Graphics::TBitmap,*uni= new Graphics::TBitmap;
    gr->LoadFromFile("1.bmp");
    Form1->Canvas->Draw(1, 1, gr);
    sun->LoadFromFile("2.bmp");
    uni->LoadFromFile("3.bmp");
    earth->LoadFromFile("5.bmp");                     int i=10;
    Form1->Canvas->Draw(200, 150 , sun);

    jupiter->LoadFromFile("6.bmp");
    int k=950;
    bool f=false;
    int * coorE=new int [1];
    int * coorU=new int [1];
   double fi=0;
    coordinates(fi,200,coorE);
    coordinates(fi*0.1,700,coorU);
       Form1->Canvas->Pen->Color=clRed;

 //  Form1->Canvas->MoveTo(coorE[0]+300,coorE[1]+200);
  //  Form1->Canvas->LineTo(coorU[0]+200, coorU[1]+211);
    Form1->Canvas->Draw(coorE[0]+200, coorE [1] +150 , earth);
    Form1->Canvas->Draw(coorU[0]+200, coorU[1]+150 , jupiter);
    Form1->Canvas->Pen->Color=clWhite;
Form1->Canvas->Brush->Color=clBlack;
int x=coorU[0]+200,y=coorU[1]+211;
for (x;x>coorE[0]+265;x--){
 Sleep(10);         if (f==false){
 Canvas->Pixels[x][(coorE[1]+200 - coorU[1]-211)*(x-coorU[0]-200)/(coorE[0]+300-coorU[0]-300) + coorE[1]+200] = clBlack;  f=true;}
 else {Canvas->Pixels[x][(coorE[1]+200 - coorU[1]-211)*(x-coorU[0]-200)/(coorE[0]+300-coorU[0]-300) + coorE[1]+200] = clYellow;  f=false;}}
 for (x=coorU[0]+200;x>coorE[0]+265;x--){
 Sleep(10);
 Canvas->Pixels[x][(coorE[1]+200 - coorU[1]-211)*(x-coorU[0]-200)/(coorE[0]+300-coorU[0]-300) + coorE[1]+200] = clBlack;  }

    Canvas->TextOutA(550,700," Кратчайший путь ") ;
        Sleep(1000) ;
    io->LoadFromFile("8.bmp");
      Form1->Canvas->Draw(550,700, io);

    for ( double fi = 0; fi<=180; fi+=1){
    coordinates(fi,200,coorE);
    coordinates(fi*0.1,700,coorU);
    Form1->Canvas->Draw(coorE[0]+200, coorE [1] +150 , earth);
    Form1->Canvas->Draw(coorU[0]+200, coorU[1]+150 , jupiter);
    Sleep(10);
    Form1->Canvas->Draw(coorE [0]+200, coorE [1] +150 ,uni);
    Form1->Canvas->Draw(coorU[0]+200, coorU[1]+150 , uni);}
      Canvas->Font->Size = 24;
    Canvas->Font->Color = RGB(255, 255, 255);
Canvas->Brush->Style = bsClear;
      delete [] coorE;
      delete [] coorU;
     Canvas->Font->Name = "Times New Roman";
 // область вывода текста
// не закрашивать
 Canvas->TextOutA(550,100,"Юпитер удаляется от земли");
                Canvas->TextOutA(550,140,"Время затмений, расчитанное ремером в таблицах ");
                Canvas->TextOutA(550,180,"не соответствует результатам измерений");
                Canvas->TextOutA(550,220,"Свету требуется все больше времени, чтобы ");
                           Canvas->TextOutA(550,260,"достичь земли, затмения видны позже.");
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
   Graphics::TBitmap * mgr= new Graphics::TBitmap;
mgr->LoadFromFile("sn.bmp");
Form1->Canvas->Draw(1, 1 , mgr);
}
//---------------------------------------------------------------------------
а вот ссылка на сам проект, если кто знает в чем проблема, не могли бы объяснить: http://rghost.ru/1717492
ZET78 вне форума Ответить с цитированием
Старый 26.05.2010, 20:48   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Необходимо использовать двойную буферизацию.
Вкратце - сначала рисуем все объекты на т.н. "буфер" - невидимую картинку (напр., на TBitmap), затем когда рисование их всех завершено, копируем все содержимое буфера на Form1 (с помощью CopyRect).
Более подробно - поищите по форуму. В частности, в разделе "Создание и обсуждение игр" двойная буферизация обсуждалась довольно часто.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 26.05.2010, 21:00   #3
ZET78
Пользователь
 
Регистрация: 02.05.2010
Сообщений: 60
По умолчанию

Гром спасибо
ZET78 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация Madsqui Microsoft Office Excel 3 30.05.2010 23:53
Анимация Belazur Мультимедиа в Delphi 3 09.12.2009 22:36
Анимация nimf Общие вопросы Delphi 6 07.08.2009 10:21
Анимация SanekIrk Общие вопросы Delphi 2 15.08.2008 21:57
Анимация SanekIrk Общие вопросы Delphi 11 08.08.2008 15:24