Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подрагивание картинки, проблемы с 2д графикой 
:(
    Опции темы
СЭНСЭЙ
Дата 11.9.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Всем привет.
Делаю такое в делфи:

Код

var
  Form1: TForm1;
  b1,b2,b3,back,level:tbitmap;
  i:integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
back:=tbitmap.Create;back.Height:=126;back.Width:=120;
level:=tbitmap.Create;level.Height:=252;level.Width:=240;

back.LoadFromFile('back.bmp');

BitBlt(level.Canvas.Handle,0,0,120,126,back.Canvas.Handle,0,0,SrcCopy);
BitBlt(level.Canvas.Handle,120,0,120,126,back.Canvas.Handle,0,0,SrcCopy);
BitBlt(level.Canvas.Handle,0,126,120,126,back.Canvas.Handle,0,0,SrcCopy);
BitBlt(level.Canvas.Handle,120,126,120,126,back.Canvas.Handle,0,0,SrcCopy);
ImageList2.AddMasked(level,clwhite);
ImageList2.Draw(image1.Canvas,0,10,0);
i:=-19;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//if i<128 then
image1.canvas.Brush.Color:=clbtnface;
image1.Canvas.FloodFill(0,0,clblack,fsBorder);
ImageList2.Draw(image1.Canvas,i,0,0);
i:=i+1;
if i=0 then i:=-19;
form1.Repaint;
end;


вобщем я загружаю шаблон фона, размножаю его и эмулирую как бы плавно смещающийся рисунок.
Все работает но image1 в котором происходит этот процесс подрагивает - по нему пробегают иногда полосы.
Таймер стоит на 10 млск.

Подскажите как от этого можно избавиться или как это можно реализовать другими способами.

П.С. хочу сделать 2д игру типа ниндзя рюкена
почитал разные сайты по библиоткам и компонентам для работы с графикой, но пока что хочу попробовать
что то сделать стандартными функциями.
PM MAIL   Вверх
Alexeis
Дата 11.9.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



СЭНСЭЙ, стандартная двойная буферизация решит проблему. Рисовать сначала на невидимом битмапе, затем его выводить на экран одной операцией.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
СЭНСЭЙ
Дата 13.9.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Ок!
Пробую!

Добавлено через 9 минут и 53 секунды
А какой операцией выводить?
PM MAIL   Вверх
Alexeis
Дата 13.9.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Вот пример
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    BackBuf : TBitmap;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  BackBuf := TBitmap.Create;
  BackBuf.Width := ClientWidth;
  BackBuf.Height := ClientHeight;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  BackBuf.Width := ClientWidth;
  BackBuf.Height := ClientHeight;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Draw(ClientRect.Left, ClientRect.Top, BackBuf);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  BackBuf.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  BackBuf.Canvas.Brush.Color := clWhite;
  BackBuf.Canvas.FillRect(ClientRect);
  BackBuf.Canvas.LineTo(Random(500), Random(500));
  Invalidate;
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
СЭНСЭЙ
Дата 13.9.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



переделал
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+1;
if i=0 then i:=-19;
invalidate;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(0,i,buf);
end;


но пробегающие полосы по рисунку не исчезли
PM MAIL   Вверх
СЭНСЭЙ
Дата 13.9.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



нашел такой пример в нете
http://delphiworld.narod.ru/base/plane_fly.html
попробовал - тоже самое
фон у меня 240х252 bmp
рисунок 64х64 bmp

PM MAIL   Вверх
AntonN
Дата 13.9.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



простой пример двойной буферизации, в принципе понятно где надо рисовать и как выводить.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  buffere.zip 6,52 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 13.9.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



  А еще момент вспомнил, лучше если отключить сообщение WM_ERASEBKG. В принципе и иногда чистка фона и создает мерцание. Нужно вернуть ненулевой результат.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
СЭНСЭЙ
Дата 14.9.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



я вобщем понял - вставлять рисунок в имейдж - гнилое дело.
Я просто bitblt'ом на канву формы в цикле копировал и все работает прекрасно.
Пример с copyrect тоже работает отлично, но я не нашел в 6м делфи компонента PaintBox1.
Его можно описать но в меню компонентов его нет.
PM MAIL   Вверх
AntonN
Дата 14.9.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



СЭНСЭЙ, есть он там, вкладка System


--------------------
user posted image
PM MAIL WWW   Вверх
СЭНСЭЙ
Дата 15.9.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Ага уже нашел, спасибо!!! )
PM MAIL   Вверх
Alexeis
Дата 15.9.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(СЭНСЭЙ @  14.9.2009,  17:00 Найти цитируемый пост)
Я просто bitblt'ом на канву формы в цикле копировал и все работает прекрасно.

  Функция Draw вызывает BitBlt, но так что разницы почти никакой. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
yogin
Дата 9.10.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Хехе) позвольте сэкономить вам пару десятков строк)
у формы есть параметр .DoubleBuffered, дак вот поставте его в TRUE  smile 
PM MAIL   Вверх
Alexeis
Дата 9.10.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(yogin @  9.10.2009,  09:56 Найти цитируемый пост)
у формы есть параметр .DoubleBuffered, дак вот поставте его в TRUE

  Не уверен что это даст точно такой же эффект. DoubleBuffered проводит кастомную отрисовку компонентов на форме, но далеко не всех, только наследников TWinControl при том что каждому контролу явно присвоено DoubleBuffered. TImage как и прочие неоконные компоненты не реагируют ни как на это событие и будут отрисованы после всего так как если бы DoubleBuffered не был включен совсем.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.