Autor Beitrag
Sylvus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: So 30.03.08 19:23 
Hi Leute, arbeite grad an einem kleinem Anfänger-Delphi-Spiel-Programm und merke, dass mein Programm immer langsamer und unübersichtlicher wird. Nun die folgenden Fragen an euch:

1. Ist mein Quellcode sauber?
1.1. Kann man ihn irgendwo optimieren?
1.2. Geht man die Sachen irgendwie anders an?
1.3. Ist es falsch so viele Proceduren zu verwenden?

2.Machen meine Bilder das Programm so langsam`?
2.1.sollte ich versuchen Gif Bilder zu benutzten?
2.1.1.Oder lohnt es sich mehr wegen der Qualität auf png zu setzten, und dafür extra die Zusätze installieren?
2.2. Ist es bescheuert die Pixel immer über Pixel hin und her zu bewegen?

3.Fällt euch sonst noch was auf?

4. Diese Befehle verlangsamen mein Programm sehr:

Form1.AlphaBlend := True;
Form1.AlphaBlendValue := 222;

Gibt es einfache Alternativen?

----------------------------
So jetzt noch kurz zum Programm.
1. Was ist es?
-Ein Spiel indem man eine Katze von Wolke zu Wolke springen lässt um immer mehr Punkte zu bekommen.

2. Download?
home.arcor.de/jsprengel/Wolkenkatz.rar


3. Quellcode?
Bitteschön:
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:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
unit schule;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls,ShellApi;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    Button1: TButton;
    player: TImage;
    Panel1: TPanel;
    Image2: TImage;
    schornstein: TImage;
    LVL: TLabel;
    Punkte: TLabel;
    Button2: TButton;
    startbild: TImage;
    Label1: TLabel;
    Highscore: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure startbildClick(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Kollision;
    procedure Image1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure GameOver;
    procedure KatzeSprung;
    procedure Wolke;
    procedure bewegung;
    procedure lifeerstellung;
  private
   wolken: array[0..3] of TImage;
   life: array[0..6] of TImage;
   fappath:string;
   Background:TBitmap;
   mpos:TPoint;

      { Private-Deklarationen }
  public
    { Public-Deklarationen }
     end;

 var
 Form1: TForm1;
SprU,ri,nr,SprD,i2:integer;
sperre,SprUORD:boolean;

implementation

{$R *.dfm}

//start des Spiels
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
left:=0;
top:=0;
if Screen.width>=1200 then
width:=1200
else
begin
width:=Screen.width;
ShowMessage('Ihre Bildschirmauflösung ist ungünstig! Bitte ändern Sie ihre Auflösung auf eine Mindestbreite von 1200px um das Spiel genießen zu können. Vielen Dank.')
end;
  Label2.visible:=false;  Label3.visible:=false;  startbild.Visible:=false;
  Punkte.visible:=true;  Highscore.Left:=910;
  Timer1.Enabled:=true;  player.visible:=true;  Button1.Visible:=false;
  player.Top:=394;  player.Left:=0;  Label1.Enabled:=false;
  SprU:=1000;  SprD:=0;  ri:=0;  schornstein.left:=2000; Image2.Left:=0;
      if life[0].visible=false then begin
      lvl.Tag:=1;
      punkte.Tag:=0;
      lvl.Caption:='LVL : 1';
      punkte.Caption:='Punkte : 0';
      life[0].visible:=true;
      end;

  for i:=0 to 3 do
    begin;
       wolken[i] := TImage.Create(self);
    with wolken[i] do
    begin
     Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'wolke.bmp');
      parent := self;  top:=473;
      left :=300*i;  width := 200;  height := 70;
      enabled:=false;  transparent:=true;  Stretch:=true; visible:=true;
      end;
      end;
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Kollision;
//Ende + Wenn nicht -> Punkte
if player.top>500 then GameOver else begin
if (player.left>Image2.left+100) AND (player.Left<1000) then begin
  punkte.Tag:=punkte.Tag+3; punkte.Caption:='Punkte : '+inttostr(punkte.Tag);
  Image2.Left:=Image2.Left-1;
  schornstein.left:=schornstein.left-1;
  if schornstein.left<1000 then schornstein.left:=schornstein.left+1;
end;
end;

if (punkte.Tag DIV 3000 = punkte.Tag/3000) AND (punkte.Tag>0) then begin
 lvl.Tag:=lvl.Tag+1; lvl.Caption:='LVL : '+inttostr(lvl.Tag); end;
if Timer1.Enabled=true then begin

//Katze
with image1.canvas do
begin
   Draw(0,0,Background);
    bewegung;
   SprUORD:=false;
end;
  KatzeSprung;
  player.Left:=player.Left-1;
  Wolke;
end;
end;


procedure TForm1.Wolke;
var i:integer;
begin
for i:=0 to 3 do
  begin
    with wolken[i] do
      begin
      if left=-100 then
        begin
        left :=1200;
        width := 200;
        height := 70;
        end;
      left:=left-(lvl.tag+2);
      top:=473;
      Stretch:=true;
      width := left DIV 3;
      height := left DIV 5;
     end;
  end;
end;


procedure TForm1.Kollision;
var i,z:integer;
begin
for i:=0 to 3 do
begin
If (player.Left+player.width<wolken[i].Left+20) OR (player.Left>wolken[i].left+wolken[i].width-20) then
   begin
      if (Player.top+89>wolken[i].top) then
         begin
          If Player.left<Image2.left+100 then
          player.Top:=player.Top
          else
            begin
              If (Player.left>1000) AND (schornstein.left<1010) then
              begin
                                  GameOver;
                    ShowMessage('Willkommen im Himmel');
               end
              else
                begin
            if sperre=true then
            player.Top:=player.Top
            else
            z:=z+1;
                 if z>3 then
                 begin
                 player.top := player.top+300;
                 z:=0;
                 end;
                 end;
            end;
          end;
         end;
    end;
     z:=0;
end;
//Spielende
procedure TForm1.GameOver;
var i:integer;
begin
    life[i2].visible:=false;
    i2:=i2-1;
Timer1.Enabled:=false; player.visible:=false; Button1.Visible:=true; ShowMessage('tot');
for i:=0 to 3 do
    begin
      wolken[i].Left:=1500;
     end;

              if life[0].visible=false then begin
                 if Highscore.Tag<Punkte.Tag then
                 begin
                 label2.Visible:=true;
                 label3.Visible:=true;
                 Highscore.Tag:=Punkte.Tag; Highscore.Caption:='Highscore : '+inttostr(Highscore.Tag);
                 Label2.visible:=true; Label3.visible:=true;
                 end;
                 ShowMessage('GameOver');
                 for i:=0 to 6 do
                  begin
                  life[i].Destroy
                  end;
                  width:=747;
                  startbild.Visible:=true;
                  i2:=6;
                  lifeerstellung;
                  Highscore.Left:=360;
              end;
end;

//Hintergrundserstellung/löschung
procedure TForm1.FormDestroy(Sender: TObject);
begin
Background.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.AlphaBlend := True;
Form1.AlphaBlendValue := 222;
  doublebuffered:=true;
  fappath:=extractfilepath(paramstr(0));
  Background:=TBitmap.Create;
  Background.LoadFromFile(fappath+'back.bmp');
  i2:=6;
lifeerstellung;
  end;


//Maus Ereignisse
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
              Application.MessageBox('Die Katze folgt immer Ihrem Mauszeiger. Bewegen Sie Ihren Mauszeiger nach rechts,'+slineBreak+
             'so versucht die Katze bis unter ihren Zeiger zu laufen.'+slineBreak+
             'Die Katze kann nur auf den Wolken laufen!'+slineBreak+
             'Damit die Katze hochspringt und so von Wolke zu Wolke gelangt klicken Sie mit der Maus.'+slineBreak+
             'Wenn die Katze durch das Himmelstor in den Himmel gelangt ist, haben sie gewonnen.' +slineBreak+
             'Viel Spass wünscht Ihnen Elias'
             ,'Hilfe', MB_OK);
end;

procedure TForm1.startbildClick(Sender: TObject);
begin
               ShowMessage('http://www.webagent.eu');
                ShellExecute(Application.Handle, 'open',
               PChar('http://www.webagent.eu'), nil, nil,
               SW_ShowNormal);

end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
mpos:=Point(x,y);
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
if sperre=false then
begin
if mpos.Y<420 then SprU:=420
  else SprU:=mpos.Y;

if SprU<player.top+player.height then
   ri:=-3 else ri:=3;
   SprD:=player.top+player.height-SprU;
end;
end;

procedure TForm1.KatzeSprung;
begin
if player.Top+player.height>=SprU then begin
   player.Top:=player.Top+ri;
   bewegung;
   SprUORD:=true; sperre:=true;
   end;

if ri=3 then begin bewegung; player.top:=player.Top+10; sperre:=true; end else begin

if (SprD>=0) AND (SprUORD=false) then begin
    player.Top:=player.Top-ri;
    bewegung;
    SprD:=SprD+ri;
    SprU:=1000; sperre:=true;
end;
end;

if (player.top>391) AND (player.Top<397) then sperre:=false;

end;
procedure TForm1.bewegung;
begin
   If Player.Left+65<mpos.X then player.Left:=player.Left+2;
   If Player.Left+65>mpos.X then player.Left:=player.Left-2;
end;
procedure TForm1.lifeerstellung;
var i:integer;
begin
    for i:=low(life) to High(life) do
    begin
    life[i] := TImage.Create(Self);
    with life[i] do
    begin
     Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'life.bmp');
      parent := Panel1;  top:=15;
      left :=29*i+650;  width := 27;  height := 26;
      enabled:=false;  transparent:=true;  visible:=true;
      end;
    end;
  end;
end.

---------------------------
So Leute ich hoffe ihr könnt mir helfen :D
Viele viele Grüße Sylvus
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: So 30.03.08 20:34 
www.delphi-treff.de/delphi-styleguide/

Den solltest du dir mal anschauen, so bzgl. Einrücken, Methodennamen usw.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 31.03.08 00:26 
1. Nein
1.1 Ja, an sehr vielen Stellen
1.2 Jup. Möglichst wenige Komponenten zur Darstellung nutzen; dafür die Logik getrennt von der Oberfläche
1.3 Nö, aber so viel VCL zu manipulieren ;-)

2. Ja
2.1 Nein
2.1.1 Nein
2.2 Ja

3. Müsst ich erst genauer schauen

4. Ja, sie nicht zu benutzen. Das ist so mit das SCHLIMMSTE, was man der Performance antun kann: Schnelle Grafik über Langsame Grafik-Routinen von Windows verwalten lassen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
xqz93
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 31.03.08 03:11 
Hallo :-)

Wie user profile iconBenBE schon bei Punkt 1 gesagt hat, finde ich diesen "Stil" zu Programmieren total unübersichtlich
ausblenden Beispiel
1:
2:
3:
4:
5:
6:
   procedure ShowMessageEx1(Msg: string);
     var BspVar1: string;
     begin
      BspVar1:=Msg;
     ShowMessage(BspVar1);
    end;
Sowas gehört (für mich) auch zur Optimierung eines Codes.

[EDIT]
Ich hab mir mal die mühe gemacht, deinen Code ordentlich zu gestalten:
ausblenden volle Höhe Dein neuer Code
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:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
unit schule;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    Button1: TButton;
    player: TImage;
    Panel1: TPanel;
    Image2: TImage;
    schornstein: TImage;
    LVL: TLabel;
    Punkte: TLabel;
    Button2: TButton;
    startbild: TImage;
    Label1: TLabel;
    Highscore: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure startbildClick(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Kollision;
    procedure Image1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure GameOver;
    procedure KatzeSprung;
    procedure Wolke;
    procedure bewegung;
    procedure lifeerstellung;
  private
   Wolken: array[0..3] of TImage;
   Life: array[0..6] of TImage;
   FAPPath:string;
   Background:TBitmap;
   MousePos:TPoint;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  SprU, RI, NR, SprD, I: Integer;
  Sperre, SprUORD:boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  Left := 0;
  Top := 0;

  if Screen.Width >= 1200 then Width := 1200
  else begin
    Width := Screen.Width;
    ShowMessage('Ihre Bildschirmauflösung ist ungünstig! Bitte ändern Sie ihre Auflösung auf eine Mindestbreite von 1200px um das Spiel genießen zu können. Vielen Dank.');
  end;

  Label2.Visible := False;
  Label3.Visible := False;
  StartBild.Visible := False;
  Punkte.Visible := True;
  Highscore.Left := 910;
  Timer1.Enabled := True;
  Player.Visible := True;
  Button1.Visible := False;
  Player.Top := 394;
  Player.Left := 0;
  Label1.Enabled := False;
  SprU := 1000;
  SprD := 0;
  RI := 0;
  Schornstein.Left := 2000
  Image2.Left := 0;

  if nor Life[0].Visible then
  begin
    Lvl.Tag := 1;
    Punkte.Tag := 0;
    Lvl.Caption := 'LVL : 1';
    Punkte.Caption := 'Punkte : 0';
    Life[0].Visible := True;
  end;

  for I := 0 to 3 do
  begin;
    Wolken[I] := TImage.Create(Self);
    with Wolken[I] do
    begin
      Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + ' wolke.bmp');
      Parent := Self;
      Top := 473;
      Left := 300 * I;
      Width := 200;
      Height := 70;
      Enabled := False;
      Transparent := True;
      Stretch := True;
      Visible := True;
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Kollision;

  if Player.Top > 500 then GameOver else
  begin
    if (Player.Left > Image2.Left + 100) and (Player.Left < 1000) then
    begin
      Punkte.Tag := Punkte.Tag + 3;
      Punkte.Caption := 'Punkte : ' + IntToStr(Punkte.Tag);
      Image2.Left := Image2.Left - 1;
      Schornstein.Left := Schornstein.Left - 1;
      if Schornstein.Left < 1000 then Schornstein.Left := Schornstein.Left + 1;
    end;
  end;

  if (Punkte.Tag div 3000 = Punkte.Tag / 3000) and (Punkte.Tag > 0) then
  begin
    Lvl.Tag := Lvl.Tag + 1;
    Lvl.Caption := 'LVL : '+ IntToStr(Lvl.Tag);
  end;

  if Timer1.Enabled then
  begin
    with Image1.Canvas do
    begin
      Draw(0, 0, Background);
      Bewegung;
      SprUORD := False;
    end;

    KatzeSprung;
    Player.Left := Player.Left - 1;
    Wolke;
  end;
end;

procedure TForm1.Wolke;
var
  I: Integer;
begin
  for I := 0 to 3 do
  begin
    with Wolken[I] do
    begin
      if Left = -100 then
      begin
        Left := 1200;
        Width := 200;
        Height := 70;
      end;

      Left := Left - (Lvl.Tag + 2);
      Top := 473;
      Stretch := True;
      Width := Left div 3;
      Height := Left div 5;
     end;
  end;
end;

procedure TForm1.Kollision;
var
  I, Z: Integer;
begin
  for I := 0 to 3 do
  begin
    if (Player.Left + Player.Width < Wolken[I].Left + 20) or (Player.Left > Wolken[I].Left + Wolken[I].Width - 20) then
    begin
      if (Player.Top + 89 > Wolken[I].Top) then
      begin
        if Player.Left < Image2.Left + 100 then Player.Top := Player.Top
        else begin
          if (Player.Left > 1000) and (Schornstein.Left < 1010) then
          begin
            GameOver;
            ShowMessage('Willkommen im Himmel');
          end
          else begin
            if Sperre then Player.Top := Player.Top
            else Inc(Z);

            if Z > 3 then
            begin
              Player.Top := Player.Top + 300;
              Z := 0;
            end;
          end;
        end;
      end;
    end;
  end;

  Z := 0;
end;

procedure TForm1.GameOver;
var
  I: Integer;
begin
  Life[I].Visible := False;
  Dec(I);
  Timer1.Enabled := False;
  Player.Visible := False;
  Button1.Visible := True;
  ShowMessage('Tot');

  for I := 0 to 3 do
  begin
    Wolken[I].Left := 1500;
  end;

  if not Life[0].Visible then
  begin
    if Highscore.Tag < Punkte.Tag then
    begin
      Label2.Visible := True;
      Label3.Visible := True;
      Highscore.Tag := Punkte.Tag;
      Highscore.Caption := 'Highscore : ' + IntToStr(Highscore.Tag);
      Label2.Visible := True;
      Label3.Visible := True;
    end;

    ShowMessage('GameOver');

    for I := 0 to 6 do
    begin
      Life[I].Destroy
    end;

    Width := 747;
    StartBild.Visible := True;
    I := 6 ;
    LifeErstellung;
    Highscore.Left := 360;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Background.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.AlphaBlend := True;
  Form1.AlphaBlendValue := 222;
  DoubleBuffered := True;
  FAPPath := ExtractFilePath(ParamStr(0));
  Background := TBitmap.Create;
  Background.LoadFromFile(FAPPath + 'back.bmp');
  I := 6;
  LifeErstellung;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
  Application.MessageBox('Die Katze folgt immer Ihrem Mauszeiger. Bewegen Sie Ihren Mauszeiger nach rechts,' + sLineBreak +
                         'so versucht die Katze bis unter ihren Zeiger zu laufen.' + sLineBreak +
                         'Die Katze kann nur auf den Wolken laufen!' + sLineBreak +
                         'Damit die Katze hochspringt und so von Wolke zu Wolke gelangt klicken Sie mit der Maus.' + sLineBreak +
                         'Wenn die Katze durch das Himmelstor in den Himmel gelangt ist, haben sie gewonnen.' + sLineBreak +
                         'Viel Spass wünscht Ihnen Elias', 'Hilfe', MB_OK);
end;

procedure TForm1.StartBildClick(Sender: TObject);
begin
  ShowMessage('http://www.webagent.eu');
  ShellExecute(Application.Handle, 'open', PChar('http://www.webagent.eu'), NIL, NIL, SW_SHOWNORMAL);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  MousePos := Point(X, Y);
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
  if not Sperre then
  begin
    if MousePos.Y < 420 then SprU := 420
    else SprU := MousePos.Y;

    if SprU < Player.Top + Player.Height then RI := -3
    else RI := 3;

    SprD := Player.Top + Player.Height - SprU;
  end;
end;

procedure TForm1.KatzeSprung;
begin
  if Player.Top + Player.Height >= SprU then
  begin
    Player.Top := Player.Top + RI;
    Bewegung;
    SprUORD := True;
    Sperre := True;
  end;

  if RI = 3 then
  begin
    Bewegung;
    Player.Top := Player.Top + 10;
    Sperre := True;
  end
  else begin
    if (SprD >= 0) and (SprUORD = False) then
    begin
      Player.Top := Player.Top - RI;
      Bewegung;
      SprD := SprD + RI;
      SprU := 1000;
      Sperre := True;
    end;
  end;

  if (Player.Top > 391) and (Player.Top < 397) then Sperre := False;
end;

procedure TForm1.Bewegung;
begin
  if Player.Left + 65 < MousePos.X then Player.Left := Player.Left + 2;
  if Player.Left + 65 > MousePos.X then Player.Left := Player.Left - 2;
end;

procedure TForm1.LifeErstellung;
var
  I: Integer;
begin
  for I := Low(Life) to High(Life) do
  begin
    Life[I] := TImage.Create(Self);

    with Life[I] do
    begin
      Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'life.bmp');
      Parent := Panel1;
      Top := 15;
      Left := 29 * I + 650;
      Width := 27;
      Height := 26;
      Enabled := False;
      Transparent := True;
      Visible := True;
    end;
  end;
end;

end.
Bitte diesen bewerten :-D
starsurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 334

Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
BeitragVerfasst: Mo 31.03.08 08:50 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Bewegung;
begin
  if Player.Left + 65 < MousePos.X then Player.Left := Player.Left + 2;
  if Player.Left + 65 > MousePos.X then Player.Left := Player.Left - 2;
end;


bei solchen Bereichen wie hier, wo nur kleine Zahlen aufaddiert werden kann man statt
ausblenden Delphi-Quelltext
1:
2:
Player.Left := Player.Left + 2;
Player.Left := Player.Left - 2;


ausblenden Delphi-Quelltext
1:
2:
inc(Player.Left ,2);
dec(Player.Left ,2);


verwenden, es is kürzer(Übersichtlicher) und etwas schneller...
Schau dir dazu die Syntax von dec() und inc() an...das kann man noch an ein paar Stellen einsetzen...

is zwar nur Kleinvieh, aber das macht aus Mist ;)

_________________
GEIZ IST GEIL! - Ihr Sozialamt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 31.03.08 09:08 
Inc und Dec geht in älteren Delphi-Versionen nicht für Object-Properties ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Mo 31.03.08 18:22 
Hey, schon mal super, dass ich so viel Antworten bekommen habe, die mir auch gut weiterhelfen. Ich bin jetzt gerade dabei mir den StyleGuide durchzulesen und habe mal den neuen Code übernommen. Ein paar Fehler wie ein Leerzeichen bei dem Pfad oder der Verzicht auf meine zweite Zähler variable I2 gehören jetzt auch der Vergangenheit an :D
Hier erstmal der "neue" Quellcode:
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:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
{*******************************************************}
{                                                       }
{                  Borland Delphi 2005                  }
{                                                       }
{           Copyright (c) 2008 Elias Sprengel           }
{                                                       }
{                                                       }
{                   Die Wolkenkatz                      }
{                                                       }
{                                                       }
{**********************main unit************************}


unit schule;

interface

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

type 
  TForm1 = class(TForm) 
    Timer1: TTimer; 
    Image1: TImage; 
    Button1: TButton;
    player: TImage; 
    Panel1: TPanel; 
    Image2: TImage; 
    schornstein: TImage; 
    LVL: TLabel; 
    Punkte: TLabel;
    Button2: TButton; 
    startbild: TImage; 
    Label1: TLabel; 
    Highscore: TLabel; 
    Label2: TLabel; 
    Label3: TLabel;
    procedure startbildClick(Sender: TObject); 
    procedure Label1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure Kollision; 
    procedure Image1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject); 
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    procedure Button1Click(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure GameOver; 
    procedure KatzeSprung;
    procedure Wolke; 
    procedure bewegung;
    procedure LifeErstellung;
    procedure NextLevel;
  private 
   Wolken: array [0..3] of TImage;
   Life: array [0..6] of TImage;
   FAPPath:string; 
   Background:TBitmap; 
   MousePos:TPoint; 
  public 
    { Public-Deklarationen }
  end;

var 
  Form1: TForm1; 
  SprU, RI, NR, SprD, I,I2: Integer;
  Sperre, SprUORD:boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  Left := 0;
  Top := 0;

  if Screen.Width >= 1200 then Width := 1200
  else begin
    Width := Screen.Width;
    ShowMessage('Ihre Bildschirmauflösung ist ungünstig! Bitte ändern Sie ihre Auflösung auf eine Mindestbreite von 1200px um das Spiel genießen zu können. Vielen Dank.');
  end;

  Label2.Visible := False;
  Label3.Visible := False;
  StartBild.Visible := False;
  Punkte.Visible := True;
  Highscore.Left := 910;
  Timer1.Enabled := True;
  Player.Visible := True;
  Button1.Visible := False;
  Player.Top := 394; 
  Player.Left := 0;
  Label1.Enabled := False;
  SprU := 1000;  
  SprD := 0;
  RI := 0;
  Schornstein.Left := 2000;
  Image2.Left := 0;

  if not Life[0].Visible then
  begin
    Lvl.Tag := 1;
    Punkte.Tag := 1;
    Lvl.Caption := 'LVL : 1';
    Punkte.Caption := 'Punkte : 0';
    Life[0].Visible := True;
  end;

  for I := 0 to 3 do
  begin;
    Wolken[I] := TImage.Create(Self);
    with Wolken[I] do 
    begin
      Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'wolke.bmp');
      Parent := Self;
      Top := 473;
      Left := 300 * I;
      Width := 200;
      Height := 70;
      Enabled := False;
      Transparent := True;
      Stretch := True;
      Visible := True;
    end; 
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Kollision;

  if Player.Top > 500 then GameOver else
  begin
    if (Player.Left > Image2.Left + 100) and (Player.Left < 1000) then
    begin
      Punkte.Tag := Punkte.Tag + Lvl.Tag * 3 + 1;
      Punkte.Caption := 'Punkte : ' + IntToStr(Punkte.Tag);
      Image2.Left := Image2.Left - 1;
      Schornstein.Left := Schornstein.Left - 1;
      if Schornstein.Left < 1000 then Schornstein.Left := Schornstein.Left + 1;
    end;
  end;

      if punkte.Tag DIV 300000 = punkte.Tag/300000 then
      ShowMessage('doofer Fehler');

  if Timer1.Enabled=true then
  begin
    with Image1.Canvas do
    begin
      Draw(0, 0, Background);
      Bewegung;
      SprUORD := False;
    end;

    KatzeSprung;
    Player.Left := Player.Left - 1;
    Wolke;

  end;
end;

procedure TForm1.Wolke;
var
  I: Integer;
begin

  for I := 0 to 3 do
  begin
    with Wolken[I] do
    begin
      if Left = -100 then
      begin
        Left := 1200;
        Width := 200;
        Height := 70;
      end;

      Left := Left - (Lvl.Tag + 2);
      Top := 473;
      Stretch := True;
      Width := Left div 3;
      Height := Left div 5;
     end;
  end;
end;

procedure TForm1.Kollision;
var
  I, Z: Integer;
begin
  for I := 0 to 3 do
  begin
    if (Player.Left + Player.Width < Wolken[I].Left + 20) or (Player.Left > Wolken[I].Left + Wolken[I].Width - 20) then
    begin
      if (Player.Top + 89 > Wolken[I].Top) then
      begin
        if Player.Left < Image2.Left + 100 then Player.Top := Player.Top
        else begin
          if (Player.Left > 1000) and (Schornstein.Left < 1010) then
          begin
            NextLevel;
          end
          else begin
            if Sperre then Player.Top := Player.Top
            else Inc(Z);

            if Z > 3 then
            begin
              Player.Top := Player.Top + 130;
              Z := 0;
            end;
          end;
        end;
      end;
    end;
  end;

  Z := 0;
end;

procedure TForm1.GameOver; 
var
  I: Integer;
begin
  Life[I2].Visible := False;
  Dec(I2);
  Timer1.Enabled := False;
  Player.Visible := False;
  Button1.Visible := True;
  ShowMessage('Tot');

  for I := 0 to 3 do
  begin
    Wolken[I].Left := 1500;
  end;

  if not Life[0].Visible then
  begin
    if Highscore.Tag < Punkte.Tag then
    begin 
      Label2.Visible := True;
      Label3.Visible := True;
      Highscore.Tag := Punkte.Tag; 
      Highscore.Caption := 'Highscore : ' + IntToStr(Highscore.Tag);
      Label2.Visible := True;
      Label3.Visible := True; 
    end;

    ShowMessage('GameOver');

    for I := 0 to 6 do
    begin
      Life[I].Destroy
    end;

    Width := 747;
    StartBild.Visible := True;
    I2 := 6 ;
    LifeErstellung;
    Highscore.Left := 360;
  end; 
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Background.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Form1.AlphaBlend := True;
  //Form1.AlphaBlendValue := 222;
  DoubleBuffered := True;
  FAPPath := ExtractFilePath(ParamStr(0));
  Background := TBitmap.Create;
  Background.LoadFromFile(FAPPath + 'back.bmp');
  I2 := 6;
  LifeErstellung;
  Punkte.Tag:=1;
end;

procedure TForm1.Button2Click(Sender: TObject); 
begin
  Close;
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
  Application.MessageBox('Die Katze folgt immer Ihrem Mauszeiger. Bewegen Sie Ihren Mauszeiger nach rechts,' + sLineBreak +
                         'so versucht die Katze bis unter ihren Zeiger zu laufen.' + sLineBreak +
                         'Die Katze kann nur auf den Wolken laufen!' + sLineBreak +
                         'Damit die Katze hochspringt und so von Wolke zu Wolke gelangt klicken Sie mit der Maus.' + sLineBreak +
                         'Wenn die Katze durch das Himmelstor in den Himmel gelangt ist, haben sie gewonnen.' + sLineBreak +
                         'Viel Spass wünscht Ihnen Elias', 'Hilfe', MB_OK);
end;

procedure TForm1.StartBildClick(Sender: TObject);
begin 
  ShowMessage('http://www.webagent.eu');
  ShellExecute(Application.Handle, 'open', PChar('http://www.webagent.eu'), NIL, NIL, SW_SHOWNORMAL);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin
  MousePos := Point(X, Y);
end; 

procedure TForm1.Image1Click(Sender: TObject);
begin
  if not Sperre then
  begin 
    if MousePos.Y < 420 then SprU := 420
    else SprU := MousePos.Y;

    if SprU < Player.Top + Player.Height then RI := -3
    else RI := 3;

    SprD := Player.Top + Player.Height - SprU;
  end;
end;

procedure TForm1.KatzeSprung;
begin 
  if Player.Top + Player.Height >= SprU then
  begin
    Player.Top := Player.Top + RI;
    Bewegung; 
    SprUORD := True; 
    Sperre := True; 
  end;

  if RI = 3 then 
  begin 
    Bewegung;
    Player.Top := Player.Top + 10;
    Sperre := True;
  end
  else begin 
    if (SprD >= 0) and (SprUORD = False) then
    begin
      Player.Top := Player.Top - RI; 
      Bewegung;
      SprD := SprD + RI;
      SprU := 1000;
      Sperre := True;
    end; 
  end;

  if (Player.Top > 391) and (Player.Top < 397) then Sperre := False;
end;

procedure TForm1.Bewegung; 
begin 
  if Player.Left + 65 < MousePos.X then Player.Left := Player.Left + 2;
  if Player.Left + 65 > MousePos.X then Player.Left := Player.Left - 2;
end;

procedure TForm1.LifeErstellung;
var
  I: Integer;
begin
  for I := Low(Life) to High(Life) do 
  begin 
    Life[I] := TImage.Create(Self);

    with Life[I] do
    begin
      Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'life.bmp');
      Parent := Panel1;
      Top := 15;
      Left := 29 * I + 650;
      Width := 27;
      Height := 26;
      Enabled := False;
      Transparent := True;
      Visible := True;
    end;
  end;
end;
procedure TForm1.NextLevel;
var I: integer;
begin
  ShowMessage('Next Level...');
  Lvl.Tag := Lvl.Tag + 1;
  Lvl.Caption := 'LVL : '+ IntToStr(Lvl.Tag);
  Player.Top := 394;
  Player.Left := 0;
  SprU := 1000;
  SprD := 0;
  RI := 0;
  Schornstein.Left := 2000;
  Image2.Left := 0;
  for I := 0 to 3 do
  begin
    Wolken[I].Left := 1500;
  end;
end;
end.


Sooo und jetzt die Fragen :P
Also als erstens zu meiner Transparenz. Ich soll also nicht diese doofen WindowsBefehle benutzen.
Wäre ja kein Problem, aber ich kenne keine gute alternative. Also ich hab jetzt einen ziemlich langen Quellcode gefunden, den ich erstens nicht verstehe und zweitens nicht richtig weiß, wie ich ihn in mein Programm integrieren sollte. Darum die Frage: Was soll ich tun um z.B. meine Wolken Transparenz zu machen?

Gut zur zweiten Frage:
Ich soll nicht so viele Objekte auf meiner Form platzieren sondern die Objekte lieber während der Laufzeit erstellen und auch wieder löschen, wenn sie nicht mehr gebraucht sind. Habe ich das richtig verstanden? Also z.B. mein Startbild nicht auf der Form platzieren und immer visible:true zu false usw. ändern?!?

Und die dritte Frage:
Keine bmps und keine gifs. Ok was sonst? :)
Welche Bildtypen soll ich hauptsächlich verwenden. Und wenn jetzt einer sagt, jpgs dann frag ich mich warum keine pngs?


Das waren sie auch schon meine 3 Probleme. Ich hoffe ihr könnt mir helfen :)
Und ich gewöhne mir mal an statt z:=z+1 einfach INC(Z); zu schreiben :P
Bis bald Sylvus

//edit
Doch noch eine Frage und zwar:
Vielleicht war 2.1.2 ungünstig formuliert, aber sollte ich was anderes als:
ausblenden Delphi-Quelltext
1:
player.left:=player.left+2;					

schreiben? Also es geht mir nicht um INC oder DEC sondern darum, ob es ungünstig ist das Bild Pixel für Pixel zu verschieben. Oder ob man bei der Variante irgendetwas beachten sollte. Thx!

WTF: Wenn ich in meinem Timer folgendes einfüge:
ausblenden Delphi-Quelltext
1:
2:
      if punkte.Tag DIV 300000 = punkte.Tag/300000 then
      ShowMessage('doofer Fehler');

und zwar nach Zeile 148 dann funktioniert das Programm. Sonst falle ich durch die Wolken. Was ist das????
Viele Grüße Sylvus
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 01.04.08 10:33 
user profile iconSylvus hat folgendes geschrieben:
Hey, schon mal super, dass ich so viel Antworten bekommen habe, die mir auch gut weiterhelfen. Ich bin jetzt gerade dabei mir den StyleGuide durchzulesen und habe mal den neuen Code übernommen. Ein paar Fehler wie ein Leerzeichen bei dem Pfad oder der Verzicht auf meine zweite Zähler variable I2 gehören jetzt auch der Vergangenheit an :D
Hier erstmal der "neue" Quellcode:

[snip]

Sooo und jetzt die Fragen :P
Also als erstens zu meiner Transparenz. Ich soll also nicht diese doofen WindowsBefehle benutzen.
Wäre ja kein Problem, aber ich kenne keine gute alternative. Also ich hab jetzt einen ziemlich langen Quellcode gefunden, den ich erstens nicht verstehe und zweitens nicht richtig weiß, wie ich ihn in mein Programm integrieren sollte. Darum die Frage: Was soll ich tun um z.B. meine Wolken Transparenz zu machen?

AlphaBlending über ScanLine und Zeichnen mit BitBlt.

user profile iconSylvus hat folgendes geschrieben:
Gut zur zweiten Frage:
Ich soll nicht so viele Objekte auf meiner Form platzieren sondern die Objekte lieber während der Laufzeit erstellen und auch wieder löschen, wenn sie nicht mehr gebraucht sind. Habe ich das richtig verstanden? Also z.B. mein Startbild nicht auf der Form platzieren und immer visible:true zu false usw. ändern?!?

Jain ... Du nutzt eine Zeichenfläche auf dem Formular (z.B. ein TImage oder eine TPaintBox) und darauf erledigst Du ALLE Zeichenoperationen ... Klinkt kompliziert, ist aber im Grunde recht einfach.

user profile iconSylvus hat folgendes geschrieben:
Und die dritte Frage:
Keine bmps und keine gifs. Ok was sonst? :)
Welche Bildtypen soll ich hauptsächlich verwenden. Und wenn jetzt einer sagt, jpgs dann frag ich mich warum keine pngs?

Da hast Du falsch gelesen: Ich habe geschrieben kein Gif, PNG oder andre Formate; ein TBitmap reicht für jegliche Aufgaben. Ob du dieses TBitmap nun über andere Grafikformate initilisierst, oder ob du reine Bitmaps dort reinlädst, ist egal; nur als Laufzeit-Format solltest Du TBitmap verwenden.

user profile iconSylvus hat folgendes geschrieben:
Das waren sie auch schon meine 3 Probleme. Ich hoffe ihr könnt mir helfen :)
Und ich gewöhne mir mal an statt z:=z+1 einfach INC(Z); zu schreiben :P
Bis bald Sylvus

Und ferner keine globalen Variablen zu nutzen und außerdem nicht-lokale Variablen mit mehr als einem Buchstaben zu bennen ;-)

user profile iconSylvus hat folgendes geschrieben:
//edit
Doch noch eine Frage und zwar:
Vielleicht war 2.1.2 ungünstig formuliert, aber sollte ich was anderes als:
ausblenden Delphi-Quelltext
1:
player.left:=player.left+2;					

schreiben? Also es geht mir nicht um INC oder DEC sondern darum, ob es ungünstig ist das Bild Pixel für Pixel zu verschieben. Oder ob man bei der Variante irgendetwas beachten sollte. Thx!

Wie gesagt ist es immer ungünstig, TImage oder andere Controls der VCL zur Laufzeit zu bewegen. Nutze lieber EIN TImage, und zeichne auf diesem dynamisch, was Du darstellen willst. Damit erreicht man durchaus passable Frameraten (für ne Kalender-Kompo war ich da durchaus schon mal >300 FPS ...). Und auch sonst kann man da viel erreichen. Nutzt man zum Verschieben einzelne Grafische Steuerelemente gehört neben dem Zeichnen noch soviel Overhead dazu, dass Du deine ganze Performance in n Sand setzt. Daher direkt in eine zentrale Zeichenfläche, dann entfällt nämlich die Verwaltung der Position durch die VCL.

user profile iconSylvus hat folgendes geschrieben:
WTF: Wenn ich in meinem Timer folgendes einfüge:
ausblenden Delphi-Quelltext
1:
2:
      if punkte.Tag DIV 300000 = punkte.Tag/300000 then
      ShowMessage('doofer Fehler');

und zwar nach Zeile 148 dann funktioniert das Programm. Sonst falle ich durch die Wolken. Was ist das????
Viele Grüße Sylvus

*G* Dann ist irgendwo noch ein Timing-Problm ^^

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Di 01.04.08 16:35 
user profile iconBenBE hat folgendes geschrieben:

AlphaBlending über ScanLine und Zeichnen mit BitBlt.

Versteh ich grad nicht. Also mit ScanLine bekomme ich die Pixel aus meinem Bitmap und mit BitBlt kopiere ich mein Image. Was hat das mit AlphaBlending zu tun. Oder genau gefragt, wie erreiche ich darüber einer Transparenz?
Ich soll nicht wirklich den Pixel darunter auslesen und dann den von meiner Wolke mit der Farbe von dem überschreiben oder???


user profile iconBenBE hat folgendes geschrieben:

Jain ... Du nutzt eine Zeichenfläche auf dem Formular (z.B. ein TImage oder eine TPaintBox) und darauf erledigst Du ALLE Zeichenoperationen ... Klinkt kompliziert, ist aber im Grunde recht einfach.

Klinkt nicht sooo kompliziert :P
Mach ich!

user profile iconBenBE hat folgendes geschrieben:

Da hast Du falsch gelesen: Ich habe geschrieben kein Gif, PNG oder andre Formate; ein TBitmap reicht für jegliche Aufgaben. Ob du dieses TBitmap nun über andere Grafikformate initilisierst, oder ob du reine Bitmaps dort reinlädst, ist egal; nur als Laufzeit-Format solltest Du TBitmap verwenden.

hmm muss ich grad mal verstehen. Also nicht TImage und da was reinladen sondern eher:
[delphi
image := TBitMap.Create;
[/delphi]


user profile iconBenBE hat folgendes geschrieben:

Wie gesagt ist es immer ungünstig, TImage oder andere Controls der VCL zur Laufzeit zu bewegen. Nutze lieber EIN TImage, und zeichne auf diesem dynamisch, was Du darstellen willst. Damit erreicht man durchaus passable Frameraten (für ne Kalender-Kompo war ich da durchaus schon mal >300 FPS ...). Und auch sonst kann man da viel erreichen. Nutzt man zum Verschieben einzelne Grafische Steuerelemente gehört neben dem Zeichnen noch soviel Overhead dazu, dass Du deine ganze Performance in n Sand setzt. Daher direkt in eine zentrale Zeichenfläche, dann entfällt nämlich die Verwaltung der Position durch die VCL.


Du meinst, ich soll das Bild immer wieder neu zeichnen? Aber ich will ja z.B. meine Katze nicht mit Canvas zeichnen.
Das wäre doch, schon bei ein paar Details, ein riesen Aufwand, oder?

user profile iconBenBE hat folgendes geschrieben:

*G* Dann ist irgendwo noch ein Timing-Problm ^^

Was ist das?

Viele Grüße Sylvus
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 01.04.08 16:52 
user profile iconSylvus hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

AlphaBlending über ScanLine und Zeichnen mit BitBlt.

Versteh ich grad nicht. Also mit ScanLine bekomme ich die Pixel aus meinem Bitmap und mit BitBlt kopiere ich mein Image. Was hat das mit AlphaBlending zu tun. Oder genau gefragt, wie erreiche ich darüber einer Transparenz?
Ich soll nicht wirklich den Pixel darunter auslesen und dann den von meiner Wolke mit der Farbe von dem überschreiben oder???

Such hier im Forum mal nach AlphaBlending, da müsstest Du fertige Routinen finden, die das erledigen. Ist eigentlich recht wenig Source; aber für große Bitmaps kommt es durchaus auf die richtige Performance an; und da ist die WinAPI grad der falsche Ansatzpunkt, weil die das ganze einfach zu langsam mit zu viel Overhead macht.

Aber im Grunde genommen, hast Du das Prinzip korrekt erkannt: Alten Pixel auslesen, mit 1-Alpha multiplizieren, und neuen Pixel mit Alpha multipliziert addieren (für jeden Farbkanal). Windows konvertiert intern noch tausendmal die Pixel-Formate, was einfach nicht nötig ist ;-)

user profile iconSylvus hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

Da hast Du falsch gelesen: Ich habe geschrieben kein Gif, PNG oder andre Formate; ein TBitmap reicht für jegliche Aufgaben. Ob du dieses TBitmap nun über andere Grafikformate initilisierst, oder ob du reine Bitmaps dort reinlädst, ist egal; nur als Laufzeit-Format solltest Du TBitmap verwenden.

hmm muss ich grad mal verstehen. Also nicht TImage und da was reinladen sondern eher:
ausblenden Delphi-Quelltext
1:
 image := TBitMap.Create;					

Jup. und in diesem Bitmap zeichnest Du dann ... Schau dich u.U. mal zum Thema DoubleBuffering bzw. manchmal auch Off-Screen Drawing um. Da müsstest Du zu dieser Technik was finden.

user profile iconSylvus hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

Wie gesagt ist es immer ungünstig, TImage oder andere Controls der VCL zur Laufzeit zu bewegen. Nutze lieber EIN TImage, und zeichne auf diesem dynamisch, was Du darstellen willst. Damit erreicht man durchaus passable Frameraten (für ne Kalender-Kompo war ich da durchaus schon mal >300 FPS ...). Und auch sonst kann man da viel erreichen. Nutzt man zum Verschieben einzelne Grafische Steuerelemente gehört neben dem Zeichnen noch soviel Overhead dazu, dass Du deine ganze Performance in n Sand setzt. Daher direkt in eine zentrale Zeichenfläche, dann entfällt nämlich die Verwaltung der Position durch die VCL.


Du meinst, ich soll das Bild immer wieder neu zeichnen? Aber ich will ja z.B. meine Katze nicht mit Canvas zeichnen.
Das wäre doch, schon bei ein paar Details, ein riesen Aufwand, oder?

Nicht ganz ... Wenn Du deine Katze mit einer Alpha-Maske versiehst, die nur die Punkte, an denen die Katze zu zeichnen ist, auf 1 hat, dann kannst Du deine Katze durchaus mit einem einzigen Befehl zeichnen, egal wie komplex diese von den Details her ist ... Dazu brauchst Du nur deine Komponenten (Teilbilder) im Speicher vorrätig halten und zu gegebener Zeit zusammensetzen ... (Auch hier sei auf Double Buffering verwiesen).

user profile iconSylvus hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

*G* Dann ist irgendwo noch ein Timing-Problm ^^

Was ist das?

Viele Grüße Sylvus

Timing-Probleme AKA Racing Condition ...
Mit die schlimmsten Fehler (hatte da heut eine auf einem Mikrocontroller, dessen Reaktion auf diese Racing Condition ein freundlicher Reset war, den man über den Debugger NICHT reproduzieren konnte ...

Aber so mal nebenbei: Du nutzt nicht zufällig irgendwo Application.ProcessMessages???

MfG,
BenBE.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Di 01.04.08 17:17 
woah langsam muss ich in meinem Gehirn wieder mal etwas Platz für Delphi frei machen, so viel Informationen...:)
Also ich schau mir mal die Sachen an und editier dann hier rein, falls irgendwelche Probleme auftreten sollten.
Aber eine Sache hab ich schon.
Also ich benutze Application.MessageBox, aber dazu hat hier im Forum wer geraten, und das ist nicht schlimm oder?
Und was ist an deinem Befehl das Problem?

Ok Ich google mal los, vielen Dank für die schnelle Antwort.
Sylvus

//edit
Ich bekomms nicht auf die Reihe!
Schreibe ich es so:
ausblenden Delphi-Quelltext
1:
2:
      if punkte.Tag DIV 20000 = punkte.Tag+2 then
      ShowMessage('doofer Fehler');

fällt er duch die Wolken durch!
So aber nicht:
ausblenden Delphi-Quelltext
1:
2:
      if punkte.Tag DIV 20000 = punkte.Tag/2 then
      ShowMessage('doofer Fehler');

WAS IST DAS?!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 01.04.08 18:02 
user profile iconSylvus hat folgendes geschrieben:
woah langsam muss ich in meinem Gehirn wieder mal etwas Platz für Delphi frei machen, so viel Informationen...:)
Also ich schau mir mal die Sachen an und editier dann hier rein, falls irgendwelche Probleme auftreten sollten.
Aber eine Sache hab ich schon.
Also ich benutze Application.MessageBox, aber dazu hat hier im Forum wer geraten, und das ist nicht schlimm oder?

Nope, wenn deine Timer damit umgehen können an der Stelle.

user profile iconSylvus hat folgendes geschrieben:
Und was ist an deinem Befehl das Problem?

Im schlimmsten Fall kann man damit Stack-OVerflows produzieren, wenn man nicht korrekt aufpasst und nicht wirklich genau weiß, was man macht. Hat Narses n gutes Tudorial dazu ;-)

user profile iconSylvus hat folgendes geschrieben:
Ok Ich google mal los, vielen Dank für die schnelle Antwort.
Sylvus

NP ...

user profile iconSylvus hat folgendes geschrieben:
//edit
Ich bekomms nicht auf die Reihe!
Schreibe ich es so:
ausblenden Delphi-Quelltext
1:
2:
      if punkte.Tag DIV 20000 = punkte.Tag+2 then
      ShowMessage('doofer Fehler');

fällt er duch die Wolken durch!
So aber nicht:
ausblenden Delphi-Quelltext
1:
2:
      if punkte.Tag DIV 20000 = punkte.Tag/2 then
      ShowMessage('doofer Fehler');

WAS IST DAS?!

Kannst Du das Gesamtprojekt mal gezippt im Anhang einfügen?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Di 01.04.08 18:40 
NP, hier mal die aktuellste Version, ja ich weiß ist ziemlich groß...Bilder halt :P
Argh ja kann ich darum auch nicht in den Anhang packen, schaus dir einfach in meinem ersten Post an. Einfach auf den Link klicken :)
DANKE Sylvus

nochmal:
home.arcor.de/jsprengel/Wolkenkatz.rar