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

Движение по синусоиде

15.05.2011, 20:58. Показов 8308. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, пожалуйста, как реализовать движение спрайта по синусоиде? Сейчас движется только горизонтально. (Спрайт движется по форме, меняя скорость)

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x,y;
int N=0;
Graphics::TBitmap *back=new Graphics::TBitmap();
Graphics::TBitmap *myxa1=new Graphics::TBitmap();
Graphics::TBitmap *myxa2=new Graphics::TBitmap();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TRect badRect;
badRect=Rect(x,y,x+myxa1->Width,y+myxa1->Height);
Canvas->CopyRect(badRect, back->Canvas,badRect);
x+=2;
if (x>ClientWidth)
{
x=-20;
y=random(ClientHeight-100);
Timer1->Interval=random(20)+10;
}
if (N>10) Canvas->Draw(x,y,myxa1);
else Canvas->Draw(x,y,myxa2);
N++;
if (N>20) N=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
back->LoadFromFile("3.bmp");
ClientWidth=back->Width;
ClientHeight=back->Height;
myxa1->LoadFromFile("1.bmp");
myxa2->LoadFromFile("2.bmp");
myxa1->Transparent=true;
myxa2->Transparent=true;
x=-20;
y=20;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Canvas->Draw(0,0,back);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2011, 20:58
Ответы с готовыми решениями:

Движение по синусоиде
Разработать программу, моделирующую движение шарика по синусоиде. При ударе о стену шарик должен...

Движение по синусоиде
У меня есть вращающийся прямоугольник, как сделать так, чтобы он при этом еще и двигался по...

Движение спрайта по синусоиде
Подскажите, пожалуйста, как реализовать движение спрайта по синусоиде? Сейчас движется только...

Вращение и движение по синусоиде звезды
Нужно нарисовать такую фигурку. что бы она двигалась по синусоиде и вращалась вокруг центра(((...

6
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
15.05.2011, 21:06 2
Х используй так же, как использовал раньше.
Формула будет иметь следующий вид
C++
1
y = Sin(x)*10+250;
  • 10 - это будет размах твоей синусоиды
  • 250 - это смещение(средняя линия вокруг которой будет прыгать синусоида)

Добавлено через 1 минуту
Цитата Сообщение от Y2Jerk Посмотреть сообщение
int x,y;
int N=0;
Graphics::TBitmap *back=new Graphics::TBitmap();
Graphics::TBitmap *myxa1=new Graphics::TBitmap();
Graphics::TBitmap *myxa2=new Graphics::TBitmap();
На будущие, так делать не рекомендуется, помещая переменные, объекты в private или public класса формы.
1
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 16
15.05.2011, 21:17  [ТС] 3
pomkalk, спасибо, попробую.
0
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
15.05.2011, 21:32 4
Скинь мне еще картинки твои сюда.
1
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 16
15.05.2011, 21:53  [ТС] 5
pomkalk, скинул в личку.
 Комментарий модератора 
Все общение по теме - исключительно в теме, никаких личок.
0
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
15.05.2011, 22:57 6
У меня твой проект так и не загрузился, ну да ладно.
Если я все правильно понял, что должно было получиться, то так

У формы нужно поставить свойство DoubleBuffered = True; что бы не было мерцаний.
Сначала в классе формы в раздел private создаем переменные
C++
1
2
3
4
5
6
private:    // User declarations
    Graphics::TBitmap *back;
    Graphics::TBitmap *myxa1;
    Graphics::TBitmap *myxa2;
    int x,y,n,d;
public:     // User declarations
Далее в конструкторе формы делаем "преднастройки"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    //Мы уже здесь создаем экземпляр класс и все парамметры
    this->back = new Graphics::TBitmap();
    this->back->LoadFromFile("d:\\3.bmp");
    this->myxa1 = new Graphics::TBitmap();
    this->myxa1->LoadFromFile("d:\\1.bmp");
    this->myxa1->Transparent = True;
    this->myxa2 = new Graphics::TBitmap();
    this->myxa2->LoadFromFile("d:\\2.bmp");
    this->myxa2->Transparent = True;
 
    //y равен половине экрана примерно
    y = (int)(this->Height / 2);
    //x равер ровно столько что бы скрыть ее с экрана
    x = -(this->myxa1->Width);
    //счетчик
    n = 0;
    //скорость
    d = 2;
}
Я тут немного "усовершенствовал", теперь как фон можно ставить маленькую картинку, и от разместит ее по всей поверхности формы, для этого в OnPaint Формы добавим след. код
C++
1
2
3
4
5
6
void __fastcall TForm1::FormPaint(TObject *Sender)
{
for (int i=0;i<this->Width;i+=this->back->Width)
    for (int j=0;j<this->Height;j+=this->back->Height)
        this->Canvas->Draw(i,j,this->back);
}
Теперь собственно сам таймер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//устанавливаем x
x+=d;
//Расчитываем y
y = (int)(Sin(x/10)*(this->Height/10)+(this->Height/2));
//ставим интервал
this->Timer1->Interval = Random(20)+20;
//проверяем условие, если долетела до конца, значит летим обратно, и снова вперед
if ((x+this->myxa1->Width)>this->ClientWidth) d = -2;
else if (x<0) d = 2;
//Вызвываем перерисовку формы.
this->Repaint();
//Расуем муху, как у тебя было раньше
if (this->n>10) this->Canvas->Draw(this->x,this->y,this->myxa1);
else this->Canvas->Draw(this->x,this->y,this->myxa2);
this->n++;
if (this->n>20) this->n=0;
}
Добавлено через 45 секунд
Поиграй с парамметрами у y, что бы добиться нужного результата
1
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 16
15.05.2011, 23:37  [ТС] 7
pomkalk, большое спасибо за помощь! Сейчас буду пробовать!

Добавлено через 32 минуты
Сделал, все получилось! Большое спасибо!
0
15.05.2011, 23:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2011, 23:37
Помогаю со студенческими работами здесь

Движение по синусоиде
Есть анимация солнечной системы. Земля вращается вокруг Солнца, а Луна вокруг Земли. Нужно сделать...

Движение круга по синусоиде
Помогите нарисовать круг,движущийся по синусойде. Заранее спасибо

Движение окружности по синусоиде
Построить анимацию для окружности, передвигающейся по синусоиде. Радиус окружности равен 3, центр...

Движение обьекта по синусоиде
В моей программе содержится обьект который создается и перемещается по заданным координатам. А по...


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

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