Autor Beitrag
-homer-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32

Win Xp
D6
BeitragVerfasst: Mo 22.09.03 21:23 
high,
könnt ihr mir sagen, wie ich ein Sprite auf einem ganz normalen Windows Fenster einbinde? Einfach nur ein leeres Formula, auf dem ei Sprite ist.

danke

_________________
don't ask to ask just ask
schneegurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 19

Win XP
C# (VS 2003, 2005 Express)
BeitragVerfasst: Mi 24.09.03 11:54 
Es kommt ganz drauf an, was für ein Sprite du meinst.

Prinzipiell deklarierst du erstmal einen Buffer (TBitmap). Die Variable deklarierst du global oder als Teil des Formulars. Dann musst du den Buffer noch initialisieren und später auch wieder freigeben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure OnCreateVonForm1(...);
begin
  Buffer := TBitmap.Create;
  Buffer.Width := Form1.Width;
  Buffer.Height := Form1.Height;
end;

procedure OnDestroyVonForm1(...);
begin
  Buffer.Free;
end;


Dann setzt du noch einen Timer auf dein Formular und machst in desssen OnTimer-Prozedur folgendes:

1. ein einfarbiges Rechteck (in den Dimensionen des Buffers) auf den Canvas des Buffers zeichnen, sprich den Buffer per Canvas.Rectangle mit einer Farbe füllen

2. dein Sprite auf den Canvas des Buffers zeichnen (bedenke immer nur ein Bild des Sprites zu zeichnen, nicht die ganze Animation auf einmal)

3. den Buffer auf das Formular zeichnen, sprich Form1.Canvas.Draw(0, 0, Buffer)

Das ganze nennt sich DoubleBuffering und verhindert, dass dein Sprite beim Zeichnen flackert.

Zusatz:
Für dein Sprite brauchst du natürlich auch eine TBitmap-Variable und musst diese ebenfalls in OnCreate initialisieren:
ausblenden Delphi-Quelltext
1:
2:
Sprite := TBitmap.Create;
Sprite.LoadFromFile('dateiname.bmp');


und ebenfalls in OnDestroy freigeben:
ausblenden Delphi-Quelltext
1:
Sprite.Free;					


Moderiert von user profile icontommie-lie: Delphi-Tags hinzugefügt
-homer- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32

Win Xp
D6
BeitragVerfasst: Mi 24.09.03 15:42 
Titel: beispiel
vielen dank,
aber kanst du mir auch viellericht mal ein beispiel dazu geben

_________________
don't ask to ask just ask
schneegurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 19

Win XP
C# (VS 2003, 2005 Express)
BeitragVerfasst: Mi 24.09.03 16:15 
ok hab ne demo geschrieben, ist aber in delphi 7. falls du beim öffnen probleme hast ist das nicht weiter schlimm, das einzige was du brauchst ist Unit1.pas, das Formular ist absolut leer.

Hier der Link (source + bin):
www.marklemke.de/spritedemo.zip

Sicherheitshalber hier nochmal der Source von Unit1.pas:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
unit Unit1;

interface

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

const
  SpriteCount = 20; // Anzahl der Bilder des Sprites

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
  private
    Buffer, Sprite: TBitmap;
    SpriteIndex: Integer;
  protected
    procedure AppIdle(Sender: TObject; var Done: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Buffer erstellen
  Buffer := TBitmap.Create;
  Buffer.Width := Form1.Width;
  Buffer.Height := Form1.Height;

  // Sprite laden
  Sprite := TBitmap.Create;
  Sprite.LoadFromFile('sprite.bmp');

  // zum ersten Bild des Sprites "springen"
  SpriteIndex := 0;

  // OnIdle zuweisen (ist so etwas wie ein Timer, nur besser)
  Application.OnIdle := AppIdle;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // OdIdle stoppen
  Application.OnIdle := nil;

  // Buffer und Sprite freigeben
  Buffer.Free;
  Sprite.Free;
end;

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
var
  x, y: Integer;
begin
  // Buffer leeren
  with Buffer.Canvas do
  begin
    Pen.Color := clBlack;
    Brush.Color := clBlack;
    Rectangle(0, 0, Buffer.Width, Buffer.Height);
  end;

  // Sprite an x/y zeichnen
  x := 100;
  y := 100;
  Buffer.Canvas.CopyRect(Bounds(x, y, Sprite.Width div SpriteCount, Sprite.Height), Sprite.Canvas,
    Bounds(SpriteIndex * (Sprite.Width div SpriteCount), 0, Sprite.Width div SpriteCount, Sprite.Height));

  // Buffer auf Formular zeichnen
  Form1.Canvas.Draw(0, 0, Buffer);

  // zum nächstes Bild des Sprites "springen"
  Inc(SpriteIndex);
  if SpriteIndex = SpriteCount then SpriteIndex := 0;

  Done := False;
end;

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  Buffer.Width := NewWidth;
  Buffer.Height := NewHeight;
end;

end.