Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
1

Как сделать анимацию ?

05.06.2013, 02:04. Просмотров 1903. Ответов 13
Метки нет (Все метки)

Доброго всем времени суток. Я в Buildere C++ новичок. Прошу помощи, битый час мучаюсь, не могу сделать анимацию по координатам заданным по формулам и чтобы эта анимация начиналась после нажатия "кнопки" и останавливалась в заданной точке, которая, как я уже написал выше, определяется по формулам.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int t,g = 10;
double a,b,c,d,x,y;
for (t=0;t<10;t++){
a = StrToInt(Edit1->Text);
b = StrToInt(Edit2->Text);
Edit3->Text = c;
c = b*cos(a);
Edit4->Text = d;
d = b*sin(a);
Edit5->Text = x;
x = c*t;
Edit6->Text = y;
y = (d*t)-((g*t^2)/2);
Timer1->Enabled = true;
Image1->Left = x;
Image1->Top = y;
}
}

Как сделать анимацию ?


Пробовал двигать Shape и Image - не получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2013, 02:04
Ответы с готовыми решениями:

Как лучше сделать анимацию шлейфа в canvas?
Опыта с билдером и вообще программированием у меня практически нет, так что...

Сделать небольшую анимацию (искуственно)
Нужно решить задачку с крутящейся монеткой. Моё немного глупое решение это...

можно ли как то к программе прикрепить анимацию?
типа гиф(сразуже анимированую картинку) а то как то надоело по одному кадру...

Надо сделать так если программа запущена с параметром -admin тогда написать доступ открыт. Как это сделать?
Надо сделать так если программа запущена с параметром -admin тогда написать...

В чём можно красиво нарисовать 2d анимацию?
Извиняюсь если заезжаная тема и таких тем было оч много просьба посоветовать...

13
LK
Заблокирован
05.06.2013, 05:08 2
Очень много про то, как двигать:
Программа "Путеводитель по учебному заведению"
0
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
05.06.2013, 09:59  [ТС] 3
Цитата Сообщение от LK Посмотреть сообщение
Очень много про то, как двигать:
Программа "Путеводитель по учебному заведению"
Спасибо, но я там не нашел или даже не понял как связать с моей проблемой.
Посидел покумекал и добавил в код вместо:
"Image1->Left = x;"
"Image1->Top = y;"

вставил:
"Shape1->Left = Shape1->Left + x; // х - это конечное значение формулы, куда должен пойти шарик.
"Shape1->Top = Shape1->Top + y; // у - тоже самое.

Shape задвигался анимировано, но он уходит в бесконечность, а не в конкретную точку (x;y).
Почему ?
0
LK
Заблокирован
05.06.2013, 12:17 4
задайте максимальные желаемые/допустимые значения точек
0
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
05.06.2013, 12:22  [ТС] 5
Цитата Сообщение от LK Посмотреть сообщение
задайте максимальные желаемые/допустимые значения точек
Прошу прощения за такие вопросы, но как это сделать?
0
LK
Заблокирован
05.06.2013, 12:42 6
в общем случае что-нибудь типа этого
C++
1
2
3
4
5
6
if (Shape1->Left+x == Form->Left+Form->Width) { // или Form->Left+500, например
  Shape1->Left = 0;
  // или return;
  // или Abort;
  // или любым другим доствным вам способом останавливаете движение
}
0
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
05.06.2013, 13:42  [ТС] 7
Спасибо за помощь!
Сделать не получилось, опыта не хватает, либо понимая простых вещей.
0
LK
Заблокирован
05.06.2013, 17:37 8
архив с программой прикрепить можете?

Добавлено через 3 часа 33 минуты
Движение шарика по прямой и по эллипсу
Я написал программу движения шарика по прямой. Теперь мне надо тоже самое движение, но по траектории эллипса с неподвижным шариком в центре.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x,y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  PaintBox1->Canvas->Ellipse(x,y,x+50,y+50);
  PaintBox1->Canvas->Pen->Color=clBlack;
  x++;
  y++;
  PaintBox1->Canvas->Ellipse(x,y,x+50,y+50);
  PaintBox1->Canvas->Pen->Color=clBtnFace;
  if(x>PaintBox1->Width) {
    x=PaintBox1->Left;
    y=PaintBox1->Top;
  }
  if(y>PaintBox1->Height) {
    y=PaintBox1->Top;
    x=PaintBox1->Left;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  x=PaintBox1->Left;
  y=PaintBox1->Top;
  Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Form1->Timer1->Enabled=false;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  Form1->Timer1->Enabled=true;        
}
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "math.h"
...
int x,y;
int a,b,cntrx,cntry;
double alpha;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  PaintBox1->Canvas->Pen->Color=clBtnFace;
  PaintBox1->Canvas->Ellipse(x-25,y-25,x+25,y+25);
  x = cntrx + floor(a*cos(alpha));
  y = cntry + floor(b*sin(alpha));
  PaintBox1->Canvas->Pen->Color=clBlack;
  PaintBox1->Canvas->Ellipse(x-25,y-25,x+25,y+25);
  alpha += 0.1;
  if (alpha >= 2*M_PI)
    alpha = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  x = PaintBox1->Width/2;
  y = PaintBox1->Height/3;
  a = 100;
  b = 100;
  alpha = 0;
  cntrx = PaintBox1->Width/2;
  cntry = PaintBox1->Height/2;
  Form1->Timer1->Enabled = true;
}
Как сделать, чтобы в центре этой анимации был неподвижный шарик?
C++
1
PaintBox1->Canvas->Ellipse(cntrx-25,cntry-25,cntrx+25,cntry+25);
схема, не для копипейста, не проверял
консультации и техническая поддержка не предоставляются
0
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
05.06.2013, 18:22  [ТС] 9
программа.rar

Достиг такого результата, что шарик бесконечно удаляется и слишком быстро. Желательно, чтобы он шел плавно к назначенной точке и там остановился.
0
LK
Заблокирован
06.06.2013, 01:07 10
Цитата Сообщение от Troubleqwerty Посмотреть сообщение
Достиг такого результата
- и вы утверждаете, что это:
int t;
double a,b,c,d,x,y;
for (t=0;t<10;t++){
a = StrToInt(Edit1->Text); // в переменной double, а не int
b = StrToInt(Edit2->Text); // в переменной double, а не int
Edit3->Text = c; // сперва присваиваете значение, а уже потом инициализируете переменную ?
c = b*cos(a);
Edit4->Text = d; // сперва присваиваете значение, а уже потом инициализируете переменную ?
d = b*sin(a);
Edit5->Text = x; // сперва присваиваете значение, а уже потом инициализируете переменную ?
x = c*t; // в первой итерации умножаете переменную на 0 ? и каким будет результат ?
Edit6->Text = y; // сперва присваиваете значение, а уже потом инициализируете переменную ?
y = (d*t)-(10*(t^2)/2);
// ...
- у вас работало ? у меня - неа .

На форму добавлены Button2 и Label7, свойства прописаны в конструкторе формы.
При старте анимации шейп перемещается в координаты 0,0.
Движение завершается при достижении границ формы. В зависимости от вводимых значаний следует оперировать свойствами компонентов:
C++
1
2
3
4
5
  if (S.x >= Form1->Left+Form1->ClientWidth-Shape1->Width/2-12 || // если достигнута правая грань
//      S.x >= Form1->Left || // если достигнута левая грань
      S.y >= Form1->Top+Form1->ClientHeight-Shape1->Height/2-12) // || // если достигнута нижняя грань
//      S.y >= Form1->Top) // если достигнута верхняя грань
  {
При завершении анимации эдиты обнуляются.
Остальное - интуитивно понятно .

Unit1.cpp Проект RAD XE, в ВСВ6 не откроется, код следует перенести ручками.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TForm1*Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  Timer1->Interval = 100;
  Button1->Caption = "Start";
  Button2->Caption = "Stop";
  Button2->Left = Button1->Left;
  Button2->Top = Button1->Top+Button1->Height+6;
  Button2->Height = Button1->Height;
  Button2->Width = Button1->Width;
  Label7->Left = Label1->Left;
  Label7->Top = Label2->Top+Label2->Width+12;
  Label7->Caption = "Shape1 Top = ";
  Shape1->Left = Form1->ClientWidth/2-Shape1->Width/2; // выравнивание по центру формы
  Shape1->Top = Form1->ClientHeight/2-Shape1->Height/2; // выравнивание по центру формы
  Form1->Caption = "Как сделать анимацию ?";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Shape1->Left = 8;
  Shape1->Top = 8;
  Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  int t=-1;
  double a,b,c,d,x,y;
  AnsiString str1,str2;
//
  a = Edit1->Text.ToDouble();
  b = Edit2->Text.ToDouble();
  c = b*cos(a);
  d = b*sin(a);
  x = c*t;
  y = (d*t)-(10*(t^2)/2);
//
  Shape1->Left =Shape1->Left+x;
  Shape1->Top = Shape1->Top+y;
//
  TPoint P,S;
  P.x = 0;
  P.y = 0;
  S = Shape1->ClientToScreen(P);
//
  if (S.x >= Form1->Left+Form1->ClientWidth-Shape1->Width/2-12 || // если достигнута правая грань
//      S.x >= Form1->Left || // если достигнута левая грань
      S.y >= Form1->Top+Form1->ClientHeight-Shape1->Height/2-12) // || // если достигнута нижняя грань
//      S.y >= Form1->Top) // если достигнута верхняя грань
  {
    Timer1->Enabled = false;
    Edit1->Text = 0;
    Edit2->Text = 0;
    Edit3->Text = 0;
    Edit4->Text = 0;
    Edit5->Text = 0;
    Edit6->Text = 0;
    Edit1->SetFocus();
  }
  Edit3->Text = FloatToStrF(c,ffNumber,7,2);
  Edit4->Text = FloatToStrF(d,ffNumber,7,2);
//  Edit5->Text = FloatToStrF(x,ffNumber,7,2);
//  Edit6->Text = FloatToStrF(y,ffNumber,7,2);
  Edit5->Text = FloatToStrF(Shape1->Left,ffNumber,7,2);
  Edit6->Text = FloatToStrF(Shape1->Left,ffNumber,7,2);
//
  str1 = S.x;
  str2 = S.y;
  Form1->Caption = "Shape X = "+str1+" : Shape Y = "+str2;
  Label7->Caption = "Shape1 Top = "+IntToStr(Shape1->Top);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Timer1->Enabled = false;
  Edit1->Text = 0;
  Edit2->Text = 0;
  Edit3->Text = 0;
  Edit4->Text = 0;
  Edit5->Text = 0;
  Edit6->Text = 0;
  Edit1->SetFocus();
//  Shape1->Left = Form1->ClientWidth/2-Shape1->Width/2; // выравнивание по центру формы
//  Shape1->Top = Form1->ClientHeight/2-Shape1->Height/2; // выравнивание по центру формы
  Shape1->Left = 8;
  Shape1->Top = 8;
  Label7->Caption = "Shape1 Top = ";
  Form1->Caption = "Как сделать анимацию ?";
}
//---------------------------------------------------------------------------
enjoy
1
Миниатюры
Как сделать анимацию ?   Как сделать анимацию ?   Как сделать анимацию ?  

Как сделать анимацию ?  
Вложения
Тип файла: zip animated_bullet.zip (1.04 Мб, 35 просмотров)
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
06.06.2013, 02:56  [ТС] 11
Я не знаю как, но она работала) Наверно компилятор косячный скачал)
А вообще хочу выразить БОЛЬШОЕ СПАСИБО! Выручили так выручили! Я бы наверно так и не понял в чем дело
0
LK
Заблокирован
06.06.2013, 04:49 12
пожалуйста, это было не сложно
0
Troubleqwerty
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 9
08.06.2013, 00:46  [ТС] 13
Цитата Сообщение от LK Посмотреть сообщение
пожалуйста, это было не сложно
LK, здравствуйте ещё раз. Опять обращаюсь к вам за помощью от безысходности Сразу скажу, эта программа была для зачёта, препод мягко говоря забраковал ваш код и пришлось немного подкорректировать его, потому что многие элементы оказались не нужны. Так вот, получился такой код. Всё работает, в первое окошко вводим угол, во второе вводим скорость. Шарик аккуратно двигается, если ввести значения 45 и 20, начинает двигаться по параболе, всё как и нужно. Но есть одно НО. Шарик при движении продолжает уходить за пределы формы. Как сделать так, чтобы доходя до краёв формы, движение останавливалось или же продолжалось в пределах формы и шарик тем самым не уходил из виду. Из-за этого перпод программу не принимает, а я уже весь день просидел и сколько всего перечитал и перепробовал, но никак не получается, голова уже кругом Если вас не затруднит, пожалуйста, подкорректируйте код или же подскажите что и куда вставить или изменить. И посмотрите пожалуйста, правильно ли все-таки программа работает или нет

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
double t;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Form1->SetBounds(0, 0, Screen->Width, Screen->Height);
Timer1->Interval = 100;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Shape1->Brush->Color=clRed;
 
t=0;
Timer1->Enabled = true;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
double a,b,c,d,x,y;
 
 
 
//
a = Edit1->Text.ToDouble();
b = Edit2->Text.ToDouble();
a=3.14*a/180;
c = b*cos(a);
d = b*sin(a);
x = c*t;
y =-((d*t)-(10*(t*t)/2));
//
Shape1->Left =x;
Shape1->Top =y+300;
//
    TPoint P,S;
    P.x = 0;
    P.y = 0;
    S = Shape1->ClientToScreen(P);
//
    if (S.x >= Form1->Left+Form1->ClientWidth-Shape1->Width/2-12 || // если достигнута правая грань
//          S.x >= Form1->Left || // если достигнута левая грань
            S.y >= Form1->Top+Form1->ClientHeight-Shape1->Height/2-12) // || // если достигнута нижняя грань
//          S.y >= Form1->Top) // если достигнута верхняя грань
 
{
Timer1->Enabled = false;
 
}
   t=t+0.5;
   Timer1->Enabled = 50;
 
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Shape1->Brush->Color=clBlue;
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
Для наглядности прикреплю файл с сохранённым проектом.
0
Вложения
Тип файла: rar buil c++.rar (4.0 Кб, 11 просмотров)
LK
08.06.2013, 05:19     Как сделать анимацию ?
  #14

Не по теме:

Передайте от меня вашему преподу, что кардинально изменять ТЗ для завершенной разработки, как минимум, плохой вкус.

0
08.06.2013, 05:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 05:19
Привет! Вот еще темы с ответами:

Отобразить на форме анимацию графика циклоиды
Построить циклоиду на форме в Builder С ++. уравнения X=r*t-r*sin(t),...

Windows-приложение, которое выполняет анимацию изображения.
Помогите написать Windows-приложение, которое выполняет анимацию изображения. ...

Каким способом лучше всего и быстрее выводить анимацию?
обычно делаю таким вот способом Graphics::TBitmap Transparent = 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru