Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 25.11.2013
Сообщений: 11
1

Анимация квадрата

26.11.2013, 12:11. Показов 3721. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, уважаемые)

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

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

для реализации самого квадрата, чтобы не париться, взял объект типа Shape

ставлю таймер, в таймере задаю две переменные: одна - минимальный размер сторон, т.е. единица, вторая - максимальный размер, который в эдите пишет пользователь

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

если возможно, то хотя бы пример черновой можно, ну или принцип на словах, как это сделать
а то правда что-т не ожидал в этом сложности, а тут на тебе...

заранее, огромнейшее спасибо тому или тем, кто объяснит бестолковому студенту факультета ВТ то, что он должен был узнать еще на 2-м курсе)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2013, 12:11
Ответы с готовыми решениями:

Анимация движения изображения квадрата по графику на Canvas
Нужна помощь...в создании как бы анимации с помощью Сanvas, которая будет идти по траектории...

Координаты квадрата
У квадрата ABCD на плоскости известны координаты двух противоположных вершин – точек А и С. Найти...

чертеж квадрата
написать программу, по теме классы, чтобы при нажатии кнопки Button программа чертила квадрат.

Анимация. Два квадрата двигаются в противоположном направлении и отталкиваются от стенок синего квадрата
Два квадрата двигаются в противоположном направлении и отталкиваются от стенок синего квадрата:

15
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
26.11.2013, 12:27 2
ну будет у тебя 1 переменная, которая будет задавать размер грани.
И по таймеру ее изменяй, тоесть либо вычитай от нее, либо прибавляй, число которое ты будешь вычитать или прибавлять и задаст скорость твоей анимации.
Определись с размерами квадрата, т.е. его минимальный и максимальный размер. И через if применяй другой цикл.

Добавлено через 3 минуты
Цитата Сообщение от mrkormaks Посмотреть сообщение
взял объект типа Shape
так как с ним не работал, переменных может быть больше.
0
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
26.11.2013, 12:30 3
mrkormaks, выложите код, пожалуйста.
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
26.11.2013, 12:30 4
Самый простой и глупый способ быстро все это сделать через свойства объекта
Height Integer Высота объекта
Width Integer Ширина объекта
0
Практикантроп
4838 / 2724 / 532
Регистрация: 23.09.2011
Сообщений: 5,791
26.11.2013, 12:43 5
Можно менять знак приращения в крайних точках__
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   static int delta = 4; // ïðèðîñò ðàçìåðà
   int Rmin=2, Rmax=Edit1->Text.ToInt(), w=Shape1->Width ;
   if (w+delta > Rmax || w+delta < Rmin) delta = 0 - delta;
   Shape1->Width = w+delta ;
}
1
1 / 1 / 0
Регистрация: 25.11.2013
Сообщений: 11
26.11.2013, 13:18  [ТС] 6
это, судя по всему в корне неверно, да?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int MaxRaz;
MaxRaz = StrToInt(Edit1->Text);
 
for (int k = MaxRaz; k>=1; k--)
        {
          Shape1->Height = k;
          Shape1->Width = k;
                if (k=1)
                        {
                          for (k=1; k<=MaxRaz; k++)
                                {
                                  Shape1->Height = k;
                                  Shape1->Width = k;
                                }
                        }
        }
        
}
0
Практикантроп
4838 / 2724 / 532
Регистрация: 23.09.2011
Сообщений: 5,791
26.11.2013, 13:22 7
Цитата Сообщение от mrkormaks Посмотреть сообщение
это, судя по всему в корне неверно, да?
Если "это" работает как вам нужно - то верно!
0
1 / 1 / 0
Регистрация: 25.11.2013
Сообщений: 11
26.11.2013, 13:24  [ТС] 8
да в том-то и дело, что прога виснет, хотя ошибки все исправил
и кажется по логике все верно...

но не пашет(
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
26.11.2013, 13:28 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int MaxRaz;
MaxRaz = StrToInt(Edit1->Text);
for (int k = MaxRaz; k>=1; k--)
 {
Shape1->Height = k;
Shape1->Width = k;
 if (k==1)
{
for (int i=1; i<=MaxRaz; i++)
 {
 Shape1->Height = i;
 Shape1->Width = i;
 }
 }
}
}
может так ?
0
Практикантроп
4838 / 2724 / 532
Регистрация: 23.09.2011
Сообщений: 5,791
26.11.2013, 13:31 10
Да логикой тут и не пахнет...
Вам нужно в обработчике таймера один шажок делать по изменению размеров, а не циклы запускать.
Я вам написал рабочий пример; если нужно, чтоб квадрат не сдвигался, добавьте Shape1->Left -= delta/2.
0
1 / 1 / 0
Регистрация: 25.11.2013
Сообщений: 11
26.11.2013, 13:40  [ТС] 11
что-то не то все равно >_<

Добавлено через 1 минуту
nick42, понял вроде как работает, но он всего лишь один раз изменяет размер, а как его уменьшить до точки?
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
26.11.2013, 13:42 12
Измени значение этой переменной на отрицательное
C++
1
 static int delta = 4; // прирост размера
1
1 / 1 / 0
Регистрация: 25.11.2013
Сообщений: 11
26.11.2013, 13:45  [ТС] 13
всем спасибо))) заработало))))))
0
Практикантроп
4838 / 2724 / 532
Регистрация: 23.09.2011
Сообщений: 5,791
26.11.2013, 13:49 14
ну и хорошо
0
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
26.11.2013, 14:16 15
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
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    static int delta = 2;
    int Rmin=2, Rmax=Edit1->Text.ToInt(), w=Shape1->Width ;
    if (w+delta > Rmax || w+delta < Rmin)
        delta = 0 - delta;
    Shape1->Width = w+delta ;
    Shape1->Height= w+delta ;
    Shape1->Left -= delta/2 ;
    Shape1->Top -=  delta/2 ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (Timer1->Enabled)
    {
        Button1->Caption="Start";
        Timer1->Enabled=false;
    }
    else
    {
        Button1->Caption="Stop";
        Timer1->Enabled=true;
    }
}
0
88 / 74 / 10
Регистрация: 26.07.2013
Сообщений: 545
28.11.2013, 16:33 16
- Вот я попробовал и немного "облагородил". Можете попробовать и Вы!
Вложения
Тип файла: rar Vers_0.rar (24.4 Кб, 42 просмотров)
0
28.11.2013, 16:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2013, 16:33
Помогаю со студенческими работами здесь

Анимация квадрата, вращающегося по центру экрана
Нужно на canvas сделать анимацию, чтобы квадрат вращался по центру экрана. Проблема не знаю как...

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Напишите, пожалуйста, программу, через процедуру, максимально просто в PascalABC.net.

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Напишите код в C++ Пожалуйста :confusion:

В центре каждого квадрата матрицы поместить сумму остальных элементов квадрата
Напишите пожалуйста решение программы!Очень срочно!СПАСИБО! На побочной диагонали разместить суммы...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru