| Autor |
Beitrag |
Sylvus
      
Beiträge: 195
|
Verfasst: 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:
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;
public end;
var Form1: TForm1; SprU,ri,nr,SprD,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 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; 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
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; 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;
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;
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
Viele viele Grüße Sylvus
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
|
Verfasst: Mo 31.03.08 03:11
Hallo
Wie BenBE schon bei Punkt 1 gesagt hat, finde ich diesen "Stil" zu Programmieren total unübersichtlich
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:
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 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 
|
|
starsurfer
      
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++
|
Verfasst: Mo 31.03.08 08:50
_________________ GEIZ IST GEIL! - Ihr Sozialamt
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 195
|
Verfasst: 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
Hier erstmal der "neue" Quellcode:
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:
|
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 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 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
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
Bis bald Sylvus
//edit
Doch noch eine Frage und zwar:
Vielleicht war 2.1.2 ungünstig formuliert, aber sollte ich was anderes als:
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:
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 01.04.08 10:33
Sylvus 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
Hier erstmal der "neue" Quellcode:
[snip]
Sooo und jetzt die Fragen
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.
Sylvus 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.
Sylvus 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.
Sylvus 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
Bis bald Sylvus |
Und ferner keine globalen Variablen zu nutzen und außerdem nicht-lokale Variablen mit mehr als einem Buchstaben zu bennen
Sylvus hat folgendes geschrieben: | //edit
Doch noch eine Frage und zwar:
Vielleicht war 2.1.2 ungünstig formuliert, aber sollte ich was anderes als:
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.
Sylvus hat folgendes geschrieben: | WTF: Wenn ich in meinem Timer folgendes einfüge:
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 
      
Beiträge: 195
|
Verfasst: Di 01.04.08 16:35
BenBE 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???
BenBE 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
Mach ich!
BenBE 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]
BenBE 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?
BenBE hat folgendes geschrieben: |
*G* Dann ist irgendwo noch ein Timing-Problm ^^
|
Was ist das?
Viele Grüße Sylvus
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 01.04.08 16:52
Sylvus hat folgendes geschrieben: | BenBE 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
Sylvus hat folgendes geschrieben: | BenBE 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-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.
Sylvus hat folgendes geschrieben: | BenBE 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).
Sylvus hat folgendes geschrieben: | BenBE 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 
      
Beiträge: 195
|
Verfasst: 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:
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:
Delphi-Quelltext 1: 2:
| if punkte.Tag DIV 20000 = punkte.Tag/2 then ShowMessage('doofer Fehler'); |
WAS IST DAS?!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 01.04.08 18:02
_________________ 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 
      
Beiträge: 195
|
Verfasst: Di 01.04.08 18:40
NP, hier mal die aktuellste Version, ja ich weiß ist ziemlich groß...Bilder halt
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
|
|
|