С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
iMebius
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 2
1

Перерисовка эллипсов при движении по прямой

21.06.2015, 17:12. Просмотров 497. Ответов 3
Метки нет (Все метки)

У меня есть массив эллипсов, где я каждый перемещаю посредством потока (отдельный для каждого эллипса). Мне нужно избавиться от черный полосы "прошлых" эллипсов, которые были отрисованы на форме. Сейчас мой код ужасен до безобразия.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type
 El = class
   x, y : integer;
   size : integer;
 end;
 
type
  TMyThread = class(TThread)
  var
    El_num : integer;
    iParam : Integer;
    protected
    procedure Move(num : integer);
    procedure Execute; override;
    public
    constructor Create(iParam: Integer);
end;
Создание эллипсов.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
i: integer;
begin
n := 10;
SetLength(El_array, n);
for i := 0 to n do
  begin
    El_array[i] := El.Create;
    El_array[i].size := random(40);
    El_array[i].x := random(form1.width) - el_array[i].size - 1;
    El_array[i].y := random(form1.Height) - el_array[i].size - 1;
    //form1.Canvas.Ellipse(El_array[i].x, El_array[i].y, El_array[i].x + el_array[i].size, El_array[i].y + el_array[i].size);
    MyThread := TMyThread.Create(i);
  end;
timer1.Enabled := true;
//MyThread := TMyThread.Create(1);
end;
Движение эллипса:
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
procedure TMyThread.move(num: integer);
var
//count : integer;
n_x, n_y : integer;
 
{}
st : string;
k, b : real;
{}
begin
n_x := random(form1.width) - el_array[num].size - 1;
n_y := random(form1.Height) - el_array[num].size - 1;
if n_x = El_array[num].x then
   while n_x = El_array[num].x do
     begin
     n_x := random(form1.width) - el_array[num].size - 1;
     end;
 
st := SystemUr(el_array[num].x, n_x, el_array[num].y, n_y);
 
while El_array[num].x <> n_x do
  begin
  {with form1.Canvas do
  pen.Color:= form1.Color;
 
  form1.Canvas.Ellipse(El_array[num].x, El_array[num].y, El_array[num].x + el_array[num].size, El_array[num].y + el_array[num].size);
  sleep(3);
  with form1.Canvas do
  pen.Color := clBlack;
  }
    if El_array[num].x > n_x then
    El_array[num].x := El_array[num].x - 1;
    if El_array[num].x < n_x then
    El_array[num].x := El_array[num].x + 1;
 
    {form1.Caption := 'Num_Coord: ' + inttostr(el_array[num].x)+'; '+inttostr(el_array[num].y) + ' | ' +
    inttostr(n_x) + '; '+inttostr(n_y);
   }
    k := strtofloat(copy(st, 0, pos('|', st) - 1));
    b := strtofloat(copy(st, pos('|', st) + 1, length(st) - pos('|', st)));
 
    El_array[num].y := trunc((k * El_array[num].x + b));
 
    //form1.Canvas.Ellipse(El_array[num].x, El_array[num].y, El_array[num].x + el_array[num].size, El_array[num].y + el_array[num].size);
   {
    for count := 0 to Length(El_array) do
      begin
        form1.Canvas.Ellipse(El_array[count].x, El_array[count].y, El_array[count].x + el_array[count].size, El_array[count].y + el_array[count].size);
      end;   }
sleep(32);
  end;
end;
Перерисовка в таймере:
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Timer1Timer(Sender: TObject);
var
count : integer;
begin
for count := 0 to Length(El_array) do
      begin
        form1.Canvas.Ellipse(El_array[count].x, El_array[count].y, El_array[count].x + el_array[count].size, El_array[count].y + el_array[count].size);
      end;
end;
Я пробовал прям в потоке перерисовывать эллипс. На старом месте рисовал цветом формы, на новом черный, но у меня либо зависал(?) канвас, после чего временно ничего не отрисовывалось, либо проскакивали черные недоэллипсы, либо эллипс отрисовывался частично. Подскажите, пожалуйста!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2015, 17:12
Ответы с готовыми решениями:

Массив Эллипсов
Мне нужно создавать эллипс и запоминать каждую координату его в массиве.Суть...

Медленная перерисовка формы при движении картинки в ее области
Хотел спросить на пример если поместить на форму картинку и сделать чтоб она...

Составить блок-схему и нарисовать с помощью операторов языка движущуюся по прямой окружность уменьшающую радиус при движении
Составить блок-схему и нарисовать с помощью операторов языка движущуюся по...

При движении слайдера вверх или вниз должен срабатывать таймер, а при остановке движения - останавливаться
Добрый день.Такая проблема.....Нужно сделать такую вещь. При движении слайдера...

Баг при движении
в общем ситуация такова, при нажатии клавиши UP, НПС уходит одновременно вверх...

3
FIL
Модератор
3422 / 2556 / 728
Регистрация: 19.09.2012
Сообщений: 7,926
21.06.2015, 19:07 2
Поток тут особо не нужен (тем более для каждого эллипса свой).
В том же самом таймере можно сначала подвинуть все эллипсы, потом залить Канвас цветом фона, а затем отрисовать новые эллипсы.
0
iMebius
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 2
21.06.2015, 20:02  [ТС] 3
Спасибо, но.
1: сперва зависала форма надолго, чуть-чуть увеличил интервал таймера - теперь подвисает, мерцает и только потом отрисовка. (пробовал ставить двойную буфферизацию на форму).
2: после хочу превратить программку в некий симулятор, планы вообще грандиозны, поэтому я выбрал потоки. +опыт работы с потоками.
Если можно, хотелось бы как-нибудь решить с моим кодом (где-то переработать, где-то убрать\добавить что-то и т.д.). Заранее спасибо!
0
krapotkin
3494 / 3086 / 1063
Регистрация: 14.04.2014
Сообщений: 14,903
Записей в блоге: 15
21.06.2015, 23:02 4
пример анимации, таймера, перерисовки и т.д.
Анимация жука
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2015, 23:02

При Движении не заполняет
Здравствуйте, тухлыми помидорами плиз не бросать. Делаю с нуля, личный бюджет...

Мерцание при движении DirectX11
Двигаю камеру вправо или влево и при этом картинка ниче так мерцает (если что...

Мерцает PictureBox при движении
PictureBox движется по нажатию кнопки, по таймеру, на нем прозрачный фон, у...


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

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

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