Главная страница
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.069 c
15-1177619556
iZEN
2007-04-27 00:32
2007.05.27
Sun OpenSolaris 10 (раздаётся бесплатно)


15-1176885879
pogi
2007-04-18 12:44
2007.05.27
Вакансия: Проектировщик-программист Delphi


2-1178525432
RomanLN
2007-05-07 12:10
2007.05.27
При переносе БД на другой комп, не находит алис


15-1177492057
Novice
2007-04-25 13:07
2007.05.27
dot NET


2-1178708349
Belorus
2007-05-09 14:59
2007.05.27
TShiftState