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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2009, 09:55   #1
Гладиолус
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию Новогодняя анимация)

есть код с анимацией в виде падающих снежинок, я хотел сделать так чтобы до появления этих самых снежинок менялся фон, с задержкой, например, в 1 секунду, хотел использовать sleep,но прога просто запускается с этой задержкой(1 сек.), проблема куда правильно вставить эти стоки:
//----------------------------------------------
BitBlt(FBackBuffer->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,FON1->Canvas->Handle,0,0,SRCCOPY);
Sleep(1000);
BitBlt(FBackBuffer->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,FON2->Canvas->Handle,0,0,SRCCOPY);


//-------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
FBackBuffer=new Graphics::TBitmap();
FBackBuffer->Width=Screen->Width;
FBackBuffer->Height=Screen->Height;
FDesktop=new Graphics::TBitmap();
FDesktop->Width=Screen->Width;
FDesktop->Height=Screen->Height;
HDC hdc=GetDC(NULL);
BitBlt(FDesktop->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,hdc,0,0,SRCCOPY);
ReleaseDC(NULL,hdc);
FON1=new Graphics::TBitmap();
FON2=new Graphics::TBitmap();

FON1->LoadFromFile("C:\\Documents and Settings\\Администратор\\Рабочий стол\\vlad\\Cнегопад\\1.bmp") ;
FON2->LoadFromFile("C:\\Documents and Settings\\Администратор\\Рабочий стол\\vlad\\Cнегопад\\2.bmp") ;

FFlake=new Graphics::TBitmap();
FFlake->LoadFromFile(ExtractFilePath(Appli cation->ExeName)+"\\flake.bmp");
randomize();
for(int a=0;a<MAXF;++a)
{
FSnow[a].x=rand()%(FDesktop->Width-FFlake->Width);
FSnow[a].y=-rand()%FDesktop->Height;
}
BorderStyle=bsNone;
SetWindowPos(Handle,HWND_TOPMOST,0, 0,Screen->Width,Screen->Height,SWP_SHOWWINDOW);
Application->OnIdle=OnIdle;
FCount=0;
FFPS=0.0;
FTick=GetTickCount();
FStartCount=FTick;

}
//-----------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete FFlake;
delete FDesktop;
delete FBackBuffer;
Application->OnIdle=NULL;
SetWindowPos(Handle,HWND_NOTOPMOST, Left,Top,Width,Height,SWP_SHOWWINDO W);
}
//----------------------------------------------------------
void __fastcall TForm1::OnIdle(TObject *Sender, bool &Done)
{
int R_M_X[7]={1,-1,0,1,2,0,-1};
int R_M_Y[5]={1,2,3,1,2};
AnsiString s;
Done=false;
if (GetTickCount()>=FTick+40)
{
BitBlt(FBackBuffer->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,FON1->Canvas->Handle,0,0,SRCCOPY);
BitBlt(FBackBuffer->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,FON2->Canvas->Handle,0,0,SRCCOPY);
for(int a=0;a<MAXF;++a)
{
FSnow[a].x+=R_M_X[rand()%6];
FSnow[a].y+=R_M_Y[rand()%5];
if (FSnow[a].y>FDesktop->Height)
FSnow[a].y=-rand()%(FDesktop->Height/4);
if (FSnow[a].x<0)
FSnow[a].x=FDesktop->Width-FSnow[a].x;
else
if(FSnow[a].x+FFlake->Width>FDesktop->Width)
FSnow[a].x=FSnow[a].x-FDesktop->Width+FFlake->Width;
if(FSnow[a].y>=FFlake->Height)
TransparentBlt(FBackBuffer->Canvas->Handle,FSnow[a].x,FSnow[a].y,FFlake->Width,FFlake->Height,FFlake->Canvas->Handle,0,0,FFlake->Width,FFlake->Height,FFlake->Canvas->Pixels[0][0]);
}
FCount++;
if(GetTickCount()>=FStartCount+1000 )
{
FFPS=(float)(GetTickCount()-FStartCount)*FCount/1000.0;
FStartCount=GetTickCount();
FCount=0;
}
FBackBuffer->Canvas->TextOut(1,1,Format("FPS: %.3f",ARRAYOFCONST((FFPS))));
BitBlt(Canvas->Handle,0,0,FBackBuffer->Width,FBackBuffer->Height,FBackBuffer->Canvas->Handle,0,0,SRCCOPY);
FTick=GetTickCount();
}
}
Гладиолус вне форума Ответить с цитированием
Старый 20.12.2009, 10:59   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Оформите пожалуйста код через специальный тег [ CODE ] ... [ / CODE ]...
И объясните поподробнее что требуется получить...

Объявления некоторых переменных нету... Обязательно делать в Билдере?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 20.12.2009, 11:24   #3
Гладиолус
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

Код:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
FBackBuffer=new Graphics::TBitmap();
FBackBuffer->Width=Screen->Width;
FBackBuffer->Height=Screen->Height;
FDesktop=new Graphics::TBitmap();
FDesktop->Width=Screen->Width;
FDesktop->Height=Screen->Height;
HDC hdc=GetDC(NULL);
BitBlt(FDesktop->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,hdc,0,0,SRCCOPY);
ReleaseDC(NULL,hdc);
FON1=new Graphics::TBitmap();
FON2=new Graphics::TBitmap();

FON1->LoadFromFile("C:\\Documents and Settings\\Администратор\\Рабочий стол\\vlad\\Cнегопад\\1.bmp") ;
FON2->LoadFromFile("C:\\Documents and Settings\\Администратор\\Рабочий стол\\vlad\\Cнегопад\\2.bmp") ;

FFlake=new Graphics::TBitmap();
FFlake->LoadFromFile(ExtractFilePath(Appli cation->ExeName)+"\\flake.bmp");
randomize();
for(int a=0;a<MAXF;++a)
{
FSnow[a].x=rand()%(FDesktop->Width-FFlake->Width);
FSnow[a].y=-rand()%FDesktop->Height;
}
BorderStyle=bsNone;
SetWindowPos(Handle,HWND_TOPMOST,0, 0,Screen->Width,Screen->Height,SWP_SHOWWINDOW);
Application->OnIdle=OnIdle;
FCount=0;
FFPS=0.0;
FTick=GetTickCount();
FStartCount=FTick;

}
//-----------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete FFlake;
delete FDesktop;
delete FBackBuffer;
Application->OnIdle=NULL;
SetWindowPos(Handle,HWND_NOTOPMOST, Left,Top,Width,Height,SWP_SHOWWINDO W);
}
//----------------------------------------------------------
void __fastcall TForm1::OnIdle(TObject *Sender, bool &Done)
{
int R_M_X[7]={1,-1,0,1,2,0,-1};
int R_M_Y[5]={1,2,3,1,2};
AnsiString s;
Done=false;
if (GetTickCount()>=FTick+40)
{
BitBlt(FBackBuffer->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,FON1->Canvas->Handle,0,0,SRCCOPY);
BitBlt(FBackBuffer->Canvas->Handle,0,0,FDesktop->Width,FDesktop->Height,FON2->Canvas->Handle,0,0,SRCCOPY);
for(int a=0;a<MAXF;++a)
{
FSnow[a].x+=R_M_X[rand()%6];
FSnow[a].y+=R_M_Y[rand()%5];
if (FSnow[a].y>FDesktop->Height)
FSnow[a].y=-rand()%(FDesktop->Height/4);
if (FSnow[a].x<0)
FSnow[a].x=FDesktop->Width-FSnow[a].x;
else
if(FSnow[a].x+FFlake->Width>FDesktop->Width)
FSnow[a].x=FSnow[a].x-FDesktop->Width+FFlake->Width;
if(FSnow[a].y>=FFlake->Height)
TransparentBlt(FBackBuffer->Canvas->Handle,FSnow[a].x,FSnow[a].y,FFlake->Width,FFlake->Height,FFlake->Canvas->Handle,0,0,FFlake->Width,FFlake->Height,FFlake->Canvas->Pixels[0][0]);
}
FCount++;
if(GetTickCount()>=FStartCount+1000 )
{
FFPS=(float)(GetTickCount()-FStartCount)*FCount/1000.0;
FStartCount=GetTickCount();
FCount=0;
}
FBackBuffer->Canvas->TextOut(1,1,Format("FPS: %.3f",ARRAYOFCONST((FFPS))));
BitBlt(Canvas->Handle,0,0,FBackBuffer->Width,FBackBuffer->Height,FBackBuffer->Canvas->Handle,0,0,SRCCOPY);
FTick=GetTickCount(); 
}
}


все переменные обьявлены, просто содержатся они в UNIT1.h? вот его содержимое:
Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
const int MAXF=666;
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:	// User declarations
        Graphics::TBitmap *FBackBuffer, *FDesktop, *FFlake,*FFON1,*FFON2,*FFON3,*FFON4,*FFON5,*FFON6;
        TPoint FSnow[MAXF];
        DWORD FTick, FCount, FStartCount;
        float FFPS;
        void __fastcall OnIdle(TObject *Sender, bool &Done);
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
мне нужно чтобы бы менялся фон, который рисуется на форме, картинками 1.bmp и 2.bmp , типа анимации , не обязательно постоянно, а хотя бы чтобы 1 раз, но с заданным промежутком времени(а то слишком быстро). Фон у меня рисуется, но только последняя картинка, так что анимации не получается, не могу понять в какое место программы вставлять рисование, мб надо создать новый обработчик....

Да, делать нужно на с++ билдере 6, потому что проходим именно его(((
Гладиолус вне форума Ответить с цитированием
Старый 20.12.2009, 12:03   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Билдера у меня нету, но Делфи практически то же самое...

Переделал под Делфи - вроде что-то рисуется... Только следы от рисунка остаются (надо бы очищать форму) и иногда снежинки как бы "застревают" в правой части экрана... Да и новые появляются как-то слишком низко (думаю лучше их "появлять" где-нибудь вверху)...
Цитата:
мне нужно чтобы бы менялся фон, который рисуется на форме
Хм... То есть не очищать экран нужно, а рисовать снежинки поверх картинки?



UpDate:

А, понял... Не нужно очищать, просто у меня 1.bmp и 2.bmp были 64х64...
Можно увидеть эти 1.bmp, 2.bmp и flake.bmp?

Ещё можно сделать полупрозрачные снежинки... ^__^
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 20.12.2009 в 12:29. Причина: UpDate
DomiNick вне форума Ответить с цитированием
Старый 20.12.2009, 12:45   #5
Гладиолус
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

на самом деле файлов фона больше, но мне хотя бы на примере этих 2-х, а прозрачность не надо, мне бы фон менять научиться...)
Изображения
Тип файла: bmp flake2.bmp (198 байт, 121 просмотров)
Тип файла: bmp 2.bmp (659.2 Кб, 118 просмотров)
Тип файла: bmp 1.bmp (1.88 Мб, 131 просмотров)
Гладиолус вне форума Ответить с цитированием
Старый 20.12.2009, 13:18   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

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

Может так: FON1 (синий квадрат) растягивается на всю форму, а остальное уже просто рисуется в нужных координатах? Или всё растягивать...
Нужно чтоб ёлочка то появлялась, то пропадала?

А для чего нужен FDesktop? Он же фактически ничего не делает.....
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 20.12.2009 в 13:44.
DomiNick вне форума Ответить с цитированием
Старый 20.12.2009, 13:59   #7
Гладиолус
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

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

"чтоб ёлочка то появлялась, то пропадала.."
-я лично хотел заменить ее уже наряженной елочкой, т.е. фон3.bmp, но мне для примера пойдет любая анимация

а FDesktop...ну раньше он копировал картинку с раб. стола, и я его оставил что много не переписывать...

Последний раз редактировалось Гладиолус; 20.12.2009 в 14:00. Причина: очепятки
Гладиолус вне форума Ответить с цитированием
Старый 20.12.2009, 15:13   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Я бы просто растягивал изображение как нужно в самой программе...

Убрал этот FDesktop и сделал несколько мелких изменений (надеюсь в билдере у формы есть ClientWidth и ClientHeight)...
Ввёл счётчик "int i;"... Пять кадров выводится первый фон, пять кадров второй, и так по кругу...

Примерно так пойдёт (вариантов-то по идее можно много разных придумать)?:
Код:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
      FBackBuffer=new Graphics::TBitmap();
      FBackBuffer->Width=Screen->Width;
      FBackBuffer->Height=Screen->Height;
      FON1=new Graphics::TBitmap();
      FON2=new Graphics::TBitmap();
      FON1->LoadFromFile("C:\\Documents and Settings\\Администратор\\Рабочий стол\\vlad\\Cнегопад\\1.bmp") ;
      FON2->LoadFromFile("C:\\Documents and Settings\\Администратор\\Рабочий стол\\vlad\\Cнегопад\\2.bmp") ;
      FFlake=new Graphics::TBitmap();
      FFlake->LoadFromFile(ExtractFilePath(Application->ExeName)+"\\flake.bmp");
      randomize();
      i=0; // глобальная
      for(int a=0;a<MAXF;++a)
      {
            FSnow[a].x=rand()%(ClientWidth-FFlake->Width);
            FSnow[a].y=-rand()%ClientHeight;
      }
      Application->OnIdle=OnIdle;
      FCount=0;
      FFPS=0.0;
      FTick=GetTickCount();
      FStartCount=FTick;
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
      delete FFlake;
      delete FBackBuffer;
      Application->OnIdle=NULL;
}

void __fastcall TForm1::OnIdle(TObject *Sender, bool &Done)
{
      int R_M_X[7]={1,-1,0,1,2,0,-1};
      int R_M_Y[5]={1,2,3,1,2};
      AnsiString s;
      Done=false;
      if (GetTickCount()>=FTick+40)
      {
            if (i<5)
            {
                  StretchBlt(FBackBuffer->Canvas->Handle,0,0,ClientWidth,ClientHeight,FON1->Canvas->Handle,0,0,FON1->Width, FON1->Height,SRCCOPY);
                  ++i;
            }
            else
            {
                  StretchBlt(FBackBuffer->Canvas->Handle, 0, 0, ClientWidth, ClientHeight, FON2->Canvas->Handle, 0, 0, FON2->Width, FON2->Height, SRCCOPY);
                  if (i<10)
                        ++i;
                  else
                        i=0;
            }
            for(int a=0;a<MAXF;++a)
            {
                  FSnow[a].x+=R_M_X[rand()%6];
                  FSnow[a].y+=R_M_Y[rand()%5];
                  if (FSnow[a].y>ClientHeight)
                        FSnow[a].y=rand()%(ClientHeight/8);
                  if (FSnow[a].x<0)
                        FSnow[a].x=ClientWidth-FSnow[a].x;
                  else
                        if(FSnow[a].x+FFlake->Width>ClientWidth)
                              FSnow[a].x=FSnow[a].x-ClientWidth+FFlake->Width;
                  if(FSnow[a].y>=FFlake->Height)
                        TransparentBlt(FBackBuffer->Canvas->Handle,FSnow[a].x,FSnow[a].y,FFlake->Width,FFlake->Height,FFlake->Canvas->Handle,0,0,FFlake->Width,FFlake->Height,FFlake->Canvas->Pixels[0][0]);
            }
            FCount++;
            if(GetTickCount()>=FStartCount+1000 )
            {
                  FFPS=(float)(GetTickCount()-FStartCount)*FCount/1000.0;
                  FStartCount=GetTickCount();
                  FCount=0;
            }
            FBackBuffer->Canvas->TextOut(1,1,Format("FPS: %.3f",ARRAYOFCONST((FFPS))));
            BitBlt(Canvas->Handle,0,0,FBackBuffer->Width,FBackBuffer->Height,FBackBuffer->Canvas->Handle,0,0,SRCCOPY);
            FTick=GetTickCount(); 
      }
}
Переделывал вручную из Делфи, надеюсь опечатков не наплодил...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 20.12.2009, 16:37   #9
Гладиолус
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

ща потестил немнога, блин пасиб большое
-это то что нужно, со снежинками тока чет не то - все разом идут, но думаю это устранимо :о)
Гладиолус вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
анимация shad0w Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 13.12.2020 11:02
Анимация Belazur Мультимедиа в Delphi 3 09.12.2009 22:36
Анимация в С++ Streb Общие вопросы C/C++ 28 07.06.2009 19:07
анимация Juffin Общие вопросы Delphi 2 26.05.2009 20:04
Анимация Rembo Софт 6 02.12.2007 18:31