Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
OffTime
0 / 0 / 1
Регистрация: 14.11.2008
Сообщений: 6
1

Движение и вращение мячика в Image

25.06.2009, 12:14. Просмотров 3989. Ответов 2
Метки нет (Все метки)

Задание: написать программу движение мячика под углом 45градусов(не принципиально) по объекту image и его вращение.
вращение такое: разделить шарик на 3 сектора и менять сектора цветами.
реализация 1-й таймер двигает сам шарик второй таймер меняет цвета в секторах.

движение сделал через приватную процедуру "sharik" можно ли перенести из нее все просто тупо в первый таймер? как я понял разницы в этом нет... так ли это?

проблема заключается в том, что не пойму как сделать вращение, то есть как разделить шарик на сектора... насколько понимаю использовать нужно floodfill и brush, вот только где? и как...
Delphi
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
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Timer3: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
  private
    { Private declarations }
    procedure sharik();
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
 dx,dy,vX,vY,w,h : integer;  
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  dx:=3; dy:=2;
  vx:=5; vy:=2;
end;
procedure TForm1.sharik;
begin
     Image1.Canvas.Pen.Color := clWhite;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.Canvas.Pen.Color := clBlack;
       dy:= dy+vy;   dx:=dx+vx;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
           // Что бы шарик не вылетал за границы поля по ширине
           // Если X координата шарика больше ширины формы - ширины самого
           //шарика то
       if   dx > image1.Width - 40 then
       begin
            Image1.Canvas.Pen.Color := clWhite;  // что бы закрасить лишние
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);//обрывки от шарика
            //X координата шарика присвоит значение ширина формы - ширина
            //шарика
               dx:=image1.Width -40  ;
               vx:=-vx;
            end
               // Здесь по аналогии только работаем с Y координатой
            else if dx < 0 then
               begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
              dx:= 0;
              vx:= - vx;
       end;
              if   dy > image1.Height - 40 then
       begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
               dy:=image1.Height -40  ;
               vy:=-vy;
               end
            else if dy < 0 then
               begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
              dy:= 0;
              vy:= - vy;
      end;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
 sharik;
end;
end.
заранее благодарен за ответ

Добавлено через 41 минуту 11 секунд
Цитата Сообщение от OffTime Посмотреть сообщение
вращение такое: разделить шарик на 3 сектора и менять сектора цветами.

заранее благодарен за ответ
не понял как редактировать...
количество секторов тоже не принципиально

Добавлено через 15 часов 10 минут 2 секунды
пока что вот такая штука громоздкая получилась но работает норм, осталась проблема переключения цветов... не пойму как ее вставить во второй таймер...
Delphi
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
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
 
  private
    { Private declarations }
 
 
  public
    { Public declarations }
 
  end;
 
var
  Form1: TForm1;
 dx,dy,vX,vY,w,h ,cx,cy : integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  dx:=3; dy:=2;
  vx:=5; vy:=2;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
       Image1.Canvas.Pen.Color := clWhite;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.Canvas.Pen.Color := clBlack;
       dy:= dy+vy;   dx:=dx+vx;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.canvas.LineTo(w,h)   ;
     Image1.canvas.MoveTo(dx+1,dy+19)  ;  Image1.canvas.lineto(dx+40,dy+19);
     Image1.canvas.MoveTo(dx+20,dy+1)  ;  Image1.canvas.lineto(dx+20,dy+40);
     Image1.canvas.MoveTo(0,0)  ;
       Image1.canvas.brush.Color:=clYellow;
       Image1.Canvas.FloodFill(dx+10, dy+10, clBlack, fsBorder);
       Image1.canvas.brush.Color:=clGreen;
       Image1.Canvas.FloodFill(dx+15, dy+30, clBlack, fsBorder);
       Image1.canvas.brush.Color:=clBlue;
       Image1.Canvas.FloodFill(dx+35, dy+16, clBlack, fsBorder);
       Image1.canvas.brush.Color:=clRed;
       Image1.Canvas.FloodFill(dx+30, dy+29, clBlack, fsBorder);
       Image1.canvas.brush.Color:=clWhite;
           // Что бы шарик не вылетал за границы поля по ширине
// Если X координата шарика больше ширины формы - ширины самого //шарика то
       if   dx > image1.Width - 40 then
            begin
            Image1.Canvas.Pen.Color := clWhite;  // что бы закрасить лишние
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);//обрывки от шарика
            //X координата шарика присвоит значение ширина формы - ширина
            //шарика
               dx:=image1.Width -40  ;
               vx:=-vx;
               end
               // Здесь по аналогии только работаем с Y координатой
            else if dx < 0 then
               begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
              dx:= 0;
              vx:= - vx;
            end;
              if   dy > image1.Height - 40 then
            begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
               dy:=image1.Height -40  ;
               vy:=-vy;
               end
            else if dy < 0 then
               begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
              dy:= 0;
              vy:= - vy;
            end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
end;
end.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2009, 12:14
Ответы с готовыми решениями:

Вращение Canvas в Image
Помогите пожалуйста с поворотом Canvas в Image, и если это возможно убрать фон...

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

Движение картинки (Image)
Помогите реализовать следующие: - Нужно что бы картинка двигалась справа...

Движение круга на image
Я хочу на компоненте image создать двигающий круг. Но у меня это не получается,...

Движение Image по центру
Image должна двигаться по форме вслед за курсором, При чем саму Image я...

2
fenix-10
15 / 15 / 3
Регистрация: 12.03.2009
Сообщений: 91
28.06.2009, 20:32 2
вот возможное решение твоей проблемы, только все делается в обном таймере
Delphi
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    image1: TImage;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
 
  private
    { Private declarations }
 
 
  public
    { Public declarations }
 
  end;
 
var
  Form1: TForm1;
 dx,dy,vX,vY,w,h ,cx,cy : integer;
 pic:tbitmap;
 alfa:integer=0;
 d1,f1,d2,f2,d3,f3,d4,f4:integer;
 b:real;
 
implementation
{$R *.dfm}
 
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
pic.Destroy;   //уничтожение картинки - чобы в памяти не висела
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  dx:=3; dy:=2;
  vx:=2; vy:=1;
  pic:=tbitmap.Create;      //невидимая картинка - для устранения
  pic.Width:=image1.Width;  // эффекта мерцания
  pic.Height:=image1.Height;
 
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 
if alfa<=360 then alfa:=alfa+1 else alfa:=0;   //угол поворота шарика
 
b:=(alfa+90)*0.01745;      //
d1:=round(20*sin(b));      //
f1:=round(20*cos(b));      //
                           //
b:=(alfa+270)*0.01745;     //
d2:=round(20*sin(b));      //
f2:=round(20*cos(b));      //
                           /////// определение координат для линий пересечения
b:=(alfa)*0.01745;         //
d3:=round(20*sin(b));      //
f3:=round(20*cos(b));      //
                           //
b:=(alfa+180)*0.01745;     //
d4:=round(20*sin(b));      //
f4:=round(20*cos(b));      //
 
with pic.Canvas do       // рисование на невидимой картинке
   begin
   FillRect(Rect(0,0,image1.Width,image1.Height)); //заливка
 
       Brush.Color:=clBtnface;
 
       dy:= dy+vy;   dx:=dx+vx;
       Ellipse(dx,dy,40+dx,40+dy);     //шарик
 
       moveto(dx+20+d1,dy+20+f1); lineto(dx+20+d2,dy+20+f2);    // линии персечения
       moveto(dx+20+d3,dy+20+f3); lineto(dx+20+d4,dy+20+f4);    //
 
       brush.Color:=clYellow;                               //
       d1:=round(10*sin(alfa*0.01745+0.8));                 //
       f1:=round(10*cos(alfa*0.01745+0.8));                 //
       FloodFill(dx+20+d1,dy+20+f1, clBlack, fsBorder);     //
                                                            //
       brush.Color:=clGreen;                                //
       d1:=round(10*sin((alfa+90)*0.01745+0.8));            //
       f1:=round(10*cos((alfa+90)*0.01745+0.8));            //
       FloodFill(dx+20+d1,dy+20+f1, clBlack, fsBorder);     //
                                                            ////// сектора
       brush.Color:=clBlue;                                 //
       d1:=round(10*sin((alfa+180)*0.01745+0.8));           //
       f1:=round(10*cos((alfa+180)*0.01745+0.8));           //
       FloodFill(dx+20+d1,dy+20+f1, clBlack, fsBorder);     //
                                                            //
       brush.Color:=clRed;                                  //
       d1:=round(10*sin((alfa+270)*0.01745+0.8));           //
       f1:=round(10*cos((alfa+270)*0.01745+0.8));           //
       FloodFill(dx+20+d1,dy+20+f1, clBlack, fsBorder);     //
 
       brush.Color:=clWhite;
 
// изменение направления при ударах о стены
       if   dx > pic.Width - 40 then
            begin
               dx:=pic.Width -40  ;
               vx:=-vx;
               end
            else if dx < 0 then
               begin
              dx:= 0;
              vx:= - vx;
            end;
              if   dy > pic.Height - 40 then
            begin
               dy:=pic.Height -40  ;
               vy:=-vy;
               end
            else if dy < 0 then
               begin
              dy:= 0;
              vy:= - vy;
            end;
   end;
 
image1.Canvas.Draw(0,0,pic);      //привязка картинки к канве image
 
end;
end.[COLOR=black][/COLOR]
3
OffTime
0 / 0 / 1
Регистрация: 14.11.2008
Сообщений: 6
29.06.2009, 01:38  [ТС] 3
спасибо конечно, многое понял,
но к нужному впемени у меня уже был свой вариант решения...
Delphi
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
(clRed, clGreen, clPurple, clBlue, clWhite, clGray, clFuchsia, clTeal,
clNavy, clRed, clLime, clTeal, clYellow, clMaroon, clAqua, clBlack);
 
 dx,dy,vX,vY,w,h ,cx,cy : integer;
    yx,yy,gx,gy,bl,yl,rd : integer;
     c: integer;
     cM,cL,cO,cP,n: integer;
 
implementation
 
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
    cM:=10 ;cL:=11 ;cO:=12 ;cP:=13 ;
 
  dx:=3; dy:=2;
  vx:=5; vy:=2;
   Image1.Canvas.Pen.Color := clWhite;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.Canvas.Pen.Color := clBlack;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
    //   Image1.canvas.LineTo(w,h)   ;
     Image1.canvas.MoveTo(dx+1,dy+19)  ;  Image1.canvas.lineto(dx+40,dy+19);
     Image1.canvas.MoveTo(dx+20,dy+1)  ;  Image1.canvas.lineto(dx+20,dy+40);
     Image1.canvas.MoveTo(0,0)  ;
       Image1.canvas.brush.Color:=clWhite;
 
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
       Image1.Canvas.Pen.Color := clWhite;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.Canvas.Pen.Color := clBlack;
       dy:= dy+vy;   dx:=dx+vx;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.canvas.LineTo(w,h)   ;
     Image1.canvas.MoveTo(dx+1,dy+19)  ;  Image1.canvas.lineto(dx+40,dy+19);
     Image1.canvas.MoveTo(dx+20,dy+1)  ;  Image1.canvas.lineto(dx+20,dy+40);
     Image1.canvas.MoveTo(0,0)  ;
        Image1.canvas.brush.Color:=Colors[cM];
       Image1.Canvas.FloodFill(dx+10, dy+10, clBlack, fsBorder);
       Image1.canvas.brush.Color:=Colors[cL];
       Image1.Canvas.FloodFill(dx+35, dy+16, clBlack, fsBorder);
       Image1.canvas.brush.Color:=Colors[cO];
       Image1.Canvas.FloodFill(dx+30, dy+29, clBlack, fsBorder);
       Image1.canvas.brush.Color:=Colors[cP];
       Image1.Canvas.FloodFill(dx+15, dy+30, clBlack, fsBorder);
            Image1.canvas.brush.Color:=clWhite;
           // Что бы шарик не вылетал за границы поля по ширине
// Если X координата шарика больше ширины формы - ширины самого //шарика то
       if   dx > image1.Width - 40 then
            begin
            Image1.Canvas.Pen.Color := clWhite;  // что бы закрасить лишние
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);//обрывки от шарика
            //X координата шарика присвоит значение ширина формы - ширина
            //шарика
               dx:=image1.Width -40  ;
               vx:=-vx;
               end
               // Здесь по аналогии только работаем с Y координатой
            else if dx < 0 then
               begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
              dx:= 0;
              vx:= - vx;
            end;
              if   dy > image1.Height - 40 then
            begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
               dy:=image1.Height -40  ;
               vy:=-vy;
               end
            else if dy < 0 then
               begin
            Image1.Canvas.Pen.Color := clWhite;
            Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
              dy:= 0;
              vy:= - vy;
            end;
 
end;
 
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Image1.Canvas.Pen.Color := clWhite;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
       Image1.Canvas.Pen.Color := clBlack;
       Image1.Canvas.Ellipse(0+dx,0+dy,40+dx,40+dy);
     Image1.canvas.MoveTo(dx+1,dy+19)  ;  Image1.canvas.lineto(dx+40,dy+19);
     Image1.canvas.MoveTo(dx+20,dy+1)  ;  Image1.canvas.lineto(dx+20,dy+40);
     Image1.canvas.MoveTo(0,0)  ;
     cM:=cM+1; cL:=cL+1;cO:=cO+1;cP:=cP+1;
  if cM>13 then
  begin cM:=10
  end;
    if cL>13 then
  begin cL:=10
  end;
   if cO>13 then
  begin cO:=10
  end;
   if cP>13 then
  begin cP:=10
  end;
      Image1.canvas.brush.Color:=Colors[cM];
       Image1.Canvas.FloodFill(dx+10, dy+10, clBlack, fsBorder);
       Image1.canvas.brush.Color:=Colors[cL];
       Image1.Canvas.FloodFill(dx+35, dy+16, clBlack, fsBorder);
       Image1.canvas.brush.Color:=Colors[cO];
       Image1.Canvas.FloodFill(dx+30, dy+29, clBlack, fsBorder);
       Image1.canvas.brush.Color:=Colors[cP];
       Image1.Canvas.FloodFill(dx+15, dy+30, clBlack, fsBorder);
           Image1.canvas.brush.Color:=clWhite;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
vx:= vx+5;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  vy:= vy+5;
end;
end.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2009, 01:38

Движение компонента Image по форме
Помогите составить программу. Компонент Image(картинка) должна сама двигаться...

Движение Image при нажатии стрелок на клавиатуре
Здравствуйте. Помогите пожалуйста. У меня есть Image1 я хочу что бы при нажатии...

Надо что бы при нажатии на какой либо Image с картинкой, картинка перекидывалась в пусто Image, а Image на который нажали исчезал.
Имеется 4 Image в 3 из них находятся картинки, а 4 пустой. Надо что бы при...


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

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

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