Путь к истине

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Путь к истине » Программирование » Lazarus Простая анимация


Lazarus Простая анимация

Сообщений 1 страница 6 из 6

1

Пересещает одну картинку поверх другой в любом направлении, при помощи клавиш курсора.

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

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

  { TForm1 }
  TIGROK=record
  X,Y,SK:integer;
  End;
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private

  public

  end;

var
  IGROK:TIGROK;
  Form1: TForm1;
  fon:tbitmap;
  Buf:tbitmap;
  korab:tbitmap;
  lx,rx,vy,ny:Integer;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
IGROK.SK:=2;
IGROK.X:=150;
IGROK.Y:=60;
 lx:= 0;
 rx:= 0;
 vy:= 0;
 ny:= 0;
Buf:=tbitmap.Create;
fon:=tbitmap.Create;
korab:=tbitmap.Create;
fon.LoadFromFile('fon.bmp');
korab.LoadFromFile('korab.bmp');
korab.transparent:=true;
Buf.Width:= 600;
Buf.Height:= 400;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin
If Key=37 then  lx:= 1;
If Key=39 then  rx:= 1;
If Key=38 then  vy:= 1;
If Key=40 then  ny:= 1;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
If Key=37 then  lx:= 0;
If Key=39 then  rx:= 0;
If Key=38 then  vy:= 0;
If Key=40 then  ny:= 0;
end;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
If lx =1 then IGROK.X:=IGROK.X-IGROK.SK;
If rx =1 then IGROK.X:=IGROK.X+IGROK.SK;
If vy =1 then IGROK.Y:=IGROK.Y-IGROK.SK;
If ny =1 then IGROK.Y:=IGROK.Y+IGROK.SK;

Buf.Canvas.Draw(0,0,fon);
Buf.Canvas.Draw(IGROK.X,IGROK.Y,korab);

PaintBox1.Canvas.CopyRect( Rect(0, 0, 600, 400), Buf.Canvas, Rect(0,0,600,400));

end;

end.
                                            

0

2

0

3

Выбрось обработчики клавишь и отслеживай нажатия прямо в таймере!

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if getasynckeystate(38)<>0 then
             IGROK.Y:=IGROK.Y-IGROK.SK;
if getasynckeystate(40)<>0 then
              IGROK.Y:=IGROK.Y+IGROK.SK;
if getasynckeystate(37)<>0 then
              IGROK.X:=IGROK.X-IGROK.SK;
if getasynckeystate(39)<>0 then
              IGROK.X:=IGROK.X+IGROK.SK;
Buf.Canvas.Draw(0,0,fon);
Buf.Canvas.Draw(IGROK.X,IGROK.Y,korab);

PaintBox1.Canvas.CopyRect( Rect(0, 0, 600, 400), Buf.Canvas, Rect(0,0,600,400));

end;                                                                

0

4

Ты абсолютно прав. Ню только в данном случае. 
Я описал лишь  простейший вариант управления. А в реальной жизни может оказаться значительно больше условий,
например условия с or или and, поэтому чтобы не перегружать код таймера, лучше сделать проверку нажатий отдельно.

0

5

Ну вот анимация покруче, алгоритм примерно как в Марио.
Вправо и влево по две картинки на спрайт.

Код:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  FileUtil, ExtCtrls, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 

Forms,
  Dialogs, StdCtrls;
type

  { TForm1 }
  TIGROK=record
  X,Y,SK:integer;
  End;
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private

  public

  end;

var
  IGROK:TIGROK;
  Form1: TForm1;
  fon:tbitmap;
  Buf:tbitmap;
  korab:tbitmap;
  korab2:tbitmap;
  korab3:tbitmap;
  korab4:tbitmap;
  lx,rx:Integer;
  ddr:integer;// направление движения
  nums:integer;//счётчик кадров
  tr,tmax,y1:integer;//связано с прыжком

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
IGROK.SK:=3;
IGROK.X:=150;
IGROK.Y:=80;
 lx:= 0;
 rx:= 0;
Buf:=tbitmap.Create;
fon:=tbitmap.Create;
korab:=tbitmap.Create;
korab2:=tbitmap.Create;
korab3:=tbitmap.Create;
korab4:=tbitmap.Create;
fon.LoadFromFile('fon.bmp');
korab.LoadFromFile('korab.bmp');
korab2.LoadFromFile('korab2.bmp');
korab3.LoadFromFile('korab3.bmp');
korab4.LoadFromFile('korab4.bmp');
korab.transparent:=true;
korab2.transparent:=true;
korab3.transparent:=true;
korab4.transparent:=true;
Buf.Width:= 600;
Buf.Height:= 400;
ddr:=1;
nums:=1;
tr:= 0;
tmax:= 0;
y1:= 60;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin
If Key=37 then  lx:= 1;
If Key=39 then  rx:= 1;
If (Key=65) and (tr = 0) then  begin  //прыжок клавиша "а"
     tr:= 1;
     tmax:=0;
     y1:= IGROK.Y;
                                            end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
If Key=37 then  lx:= 0;
If Key=39 then  rx:= 0;
end;



procedure TForm1.Timer1Timer(Sender: TObject);

begin
  if nums > 18 then nums:=1;// проверка на конец цикла смены кадров 
If lx =1 then begin
IGROK.X:=IGROK.X-IGROK.SK;
ddr:= 2;   //вправо
end;
If rx =1 then begin
IGROK.X:=IGROK.X+IGROK.SK;
ddr:=1;    //влево
end;

 if tr = 1 then begin       // прыжок
          if tmax<4 then begin
            IGROK.Y:=IGROK.Y- 50;  // вверх
            tmax:=tmax+1;
                         end
          else
             begin
             if IGROK.Y>=y1 then
                           begin
                           tr:= 0;
                           IGROK.Y:= y1;
                           end
             else
             IGROK.Y:=IGROK.Y+8; // вниз
             end;
                 end;

Buf.Canvas.Draw(0,0,fon);

case ddr of
1: begin
If (rx = 0) and (nums <=9) then nums:=1; // It allows to finish the loop
if  nums<9 then Buf.Canvas.Draw(IGROK.X,IGROK.Y,korab);
if  nums>=9 then Buf.Canvas.Draw(IGROK.X,IGROK.Y,korab3);
    end;
 2: begin
If (lx =0) and (nums <=9)  then nums:=1; // It allows to finish the loop
if  nums<9 then Buf.Canvas.Draw(IGROK.X,IGROK.Y,korab2);
if  nums>=9 then Buf.Canvas.Draw(IGROK.X,IGROK.Y,korab4);
    end;
end;
PaintBox1.Canvas.CopyRect( Rect(0, 0, 600, 400), Buf.Canvas, Rect(0,0,600,400));
  nums:= nums+1;
end;

end.

http://s5.uploads.ru/t/Yy5Dh.jpg

0

6

0


Вы здесь » Путь к истине » Программирование » Lazarus Простая анимация