Главная страница
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.48 MB
Время: 0.091 c
15-1177419938
NoNameUser
2007-04-24 17:05
2007.05.27
Анкета


2-1178445164
Loop
2007-05-06 13:52
2007.05.27
Сортировка TreeView


2-1178433546
Doom-2
2007-05-06 10:39
2007.05.27
новое подключение Flash или ZIV


11-1160134748
Thaddy
2006-10-06 15:39
2007.05.27
tip to reduce memory when inactive.


6-1163789476
__Nick__
2006-11-17 21:51
2007.05.27
Webbrowser+рисунок.png