Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 11.09.2009, 01:05   #1
spamer
Software Developer
Профессионал
 
Аватар для spamer
 
Регистрация: 19.12.2008
Адрес: Ukraine, Kremenchug
Сообщений: 2,075
Репутация: 1142

skype: denis.piskunov.ua
По умолчанию Движение фона и объекта на Canvas

Парни помогите. Хочу сделать что бы двигался фон, а на фоне стоял объект (не подвижный, но создавая эффект что он движется). Вот что у меня получается
Код:

var
  Form1: TForm1;
  Buffer, Fon, Pic : TBitmap;
  x,y, xs,ys : Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
xs := 450;
ys := 500;
  Buffer := TBitmap.Create;
  Fon := TBitmap.Create;
  Pic := TBitmap.Create;
  Fon.LoadFromFile('Fon.bmp');
  Pic.LoadFromFile('picture.bmp');

  Buffer.Width := Fon.Width;
  Buffer.Height := Fon.Height;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  y := y + 3;
  ys := ys - 3;
  Fon.Canvas.Draw(xs,ys,Pic);
  Buffer.Canvas.Draw(x,y,Fon);
  Form1.Canvas.Draw(0,0,Buffer);
end;

Оно движется вроде как надо, но фон начинает плыть (тоесть не повторяется он). Уже мучаюсь несколько дней.
Прикрепляю вложение, что бы было более понятно что я хочу.
Вложения
Тип файла: rar prim.rar (702.4 Кб, 20 просмотров)
__________________
Будь проще и люди к тебе потянутся
spamer вне форума   Ответить с цитированием
Старый 11.09.2009, 03:05   #2
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Адрес: Диаспар
Сообщений: 218
Репутация: 76

icq: 587990746
Хорошо

Я использовал дополнительный буфер для копирования части изображения наверх "вручную". Не судите строго, оно работает:
Код:

Var
  Buffer, Fon, Pic, Buf1 : TBitmap; // Дополнительный буфер Buf1

procedure TForm1.FormCreate(Sender: TObject);
begin
  xs := 450;
  ys := 500;

  Buffer := TBitmap.Create;
  Fon := TBitmap.Create;
  Pic := TBitmap.Create;
  Buf1 := TBitmap.Create;
  Pic.Transparent := TRUE;
  Pic.TransparentColor := clBlack;
  Fon.LoadFromFile('Fon.bmp');
  Pic.LoadFromFile('picture.bmp');

  Buffer.Width := Fon.Width;
  Buffer.Height := Fon.Height;
  Buf1.Width := Fon.Width;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  y := y + 3;
  Buffer.Canvas.Draw(x, y, Fon);
  Buf1.Height := y;
  Buf1.Canvas.Draw(0, -(Fon.Height - y), Fon);
  if y >= Fon.Height then
   y := 0; 
  Buffer.Canvas.Draw(0, 0, Buf1);
  Buffer.Canvas.Draw(xs, ys, Pic);
  Form1.Canvas.Draw(0, 0, Buffer);
end;

Олвин вне форума   Ответить с цитированием
Старый 11.09.2009, 08:24   #3
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,842
Репутация: 6832
По умолчанию

Предложу свой вариант:
Код:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var    f,k:TBitmap;  kx,ky,yf:integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 f:=TBitmap.Create;
 f.Width:=940;
 f.Height:=640;
 f.LoadFromFile('fon.bmp');

 k:=TBitmap.Create;
 k.Width:=940;
 k.Height:=640;
 k.LoadFromFile('picture.bmp');

 yf:=0;     kx:=100; ky:=100;
end;

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

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 inc(yf);
 if yf=Height then yf:=0;

 BitBlt(Form1.Canvas.Handle,0,yf,f.Width,f.Height,f.Canvas.Handle,0,0,SRCCOPY);
 BitBlt(Form1.Canvas.Handle,0,yf-f.Height,f.Width,f.Height,f.Canvas.Handle,0,0,SRCCOPY);

 BitBlt(Form1.Canvas.Handle,kx,ky,k.Width,k.Height,k.Canvas.Handle,0,0,SRCPAINT);

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const kk=20;
begin
 case key of
  VK_left:dec(kx,kk);
  VK_right:inc(kx,kk);
  VK_up:dec(ky,kk);
  VK_down:inc(ky,kk);
 end;
end;

end.

__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 11.09.2009, 14:50   #4
spamer
Software Developer
Профессионал
 
Аватар для spamer
 
Регистрация: 19.12.2008
Адрес: Ukraine, Kremenchug
Сообщений: 2,075
Репутация: 1142

skype: denis.piskunov.ua
По умолчанию

Олвин и Stilet спасибо большое. Буду теперь продолжать работу

Добавлено:
Stilet, сори не могу добавить отзыв. Пишет вот такое:
Вы должны добавить отзыв кому-то ещё, прежде чем сможете снова добавить его Stilet.
__________________
Будь проще и люди к тебе потянутся
spamer вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение объекта на форме по щелчку мыши Dux Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 08.12.2008 07:35
Движение объекта по синусоиде? Roberto Помощь студентам 10 14.05.2008 17:00
Движение объекта по кругу Roberto Помощь студентам 2 06.05.2008 15:44
движение точки на Canvas st01en Общие вопросы Delphi 32 09.02.2008 23:29
Движение объекта к точке frai Общие вопросы Delphi 3 10.01.2008 01:42


14:59.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru