Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

DelphiX --- Движение спрайта   Найти похожие ветки 

 
bulavkin   (2006-06-27 21:16) [0]

Вот пример в котором я двигаю спрайт слева направо по горизонтали

procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
var
i: integer;
begin
if not DXDraw.CanDraw then exit;
DXDraw.Surface.Fill( 0 );
for i:=0 to 700 do
  begin
  DXImageList.Items.Find("hero.bmp").Draw(DXDraw.Surface, i, 0, 0);
  DXDraw.Flip;

  end;
end;

Все работает, но есть у этого примера недостаток:
за спрайтом остается шлейф смазанный.
Откуда он берется и как от него избавиться?
Спасибо!


 
MeF Dei Corvi ©   (2006-06-27 21:34) [1]


> Откуда он берется и как от него избавиться?

Не делать его? Объясните мне, что делает вышенаписанный код? Я понимаю его так:
1) каждый цикл отрисовки мы очищаем экран
2) далее выводим на него 700 копий "hero.bmp" сдвинутых на 1 пиксель вправо...
Отсюда мы получаем, что избавиться от шлейфа можно только понял код.


 
bulavkin   (2006-06-27 22:01) [2]


> MeF Dei Corvi ©   (27.06.06 21:34) [1]
>
> > Откуда он берется и как от него избавиться?
>
> Не делать его? Объясните мне, что делает вышенаписанный
> код? Я понимаю его так:
> 1) каждый цикл отрисовки мы очищаем экран
> 2) далее выводим на него 700 копий "hero.bmp" сдвинутых
> на 1 пиксель вправо...
> Отсюда мы получаем, что избавиться от шлейфа можно только
> понял код.

Корень ошибки мне понятен, спасибо.

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

В данном примере я пытался сделать следующие:
1. Отрисовать картинку на заднем плане
2. Поменять буфера местами (чо бы сделать картинку видимой)
3. Очистить заздий план (буфер)
4. Отрисовать на заднем плане картинку но со сдвигов на 1 пиксель вправо

Если Вас не затруднит подскажите правельное решение.


 
n85sergey ©   (2006-06-27 23:52) [3]

попробуй так

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if Key = VK_LEFT then dec(x);
if Key = VK_RIGHT then inc(x);
end;

procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
var
i: integer;
begin
if not DXDraw.CanDraw then exit;
DXDraw.Surface.Fill( 0 );
DXImageList.Items.Find("hero.bmp").Draw(DXDraw.Surface, x, y, 0);
DXDraw.Flip;
end;


 
bulavkin   (2006-06-28 00:57) [4]


> n85sergey ©   (27.06.06 23:52) [3]

Большое Вам спасибо.
Разобрался...


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw.CanDraw then Exit;
DXDraw.Surface.Fill(0);
DXImageList.Items.Find("hero.bmp").Draw(DXDraw.Surface, x, y, 0);
DXDraw.Flip;
inc(x);
end;



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.044 c
15-1177597836
ProgRAMmer Dimonych
2007-04-26 18:30
2007.05.27
Уже обыскался...


1-1175194336
dreamse
2007-03-29 22:52
2007.05.27
Как запустить ярлык созданый с сетевого подключения ?


2-1178726622
Strate
2007-05-09 20:03
2007.05.27
Не могу понять почему это работает :)


9-1151909678
bulavkin
2006-07-03 10:54
2007.05.27
DelphiX --- И СНОВА КАРТА


15-1177681986
oldman
2007-04-27 17:53
2007.05.27
Почти восемь вечера уже... Где Пупкин?