| Autor |
Beitrag |
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Do 30.01.03 19:47
Moin!
Ein Freund kam heute vorbei und hat mir sein selbstgeproggtes Spiel Pacman gezeigt ... es ist noch nicht fertig, aber es läuft doch schon gut.
Wir haben daran weitergeproggt.
Aber etwas ist uns merkwürdig vorgekommen:
Auf meinem Rechner (1 GHz, 128Mb SD-Ram, Win98 und Delphi 6) kann ich das Programm nur starten, wenn ich nicht im Netz bin oder nichts nebenbei (Winamp ...) laufen habe. Das ist aber nur bei seinem Programm so. Habe ich etwas im Hintergrund laufen, dann stürzt mein Rechner ab.
In der Schule (900 MHz, XXX Mb XX-Ram, Win 2k und Delphi 6) oder bei meinem Freund (2 GHz, 256 DD-Ram, WInXP und Delphi 6) läuft es problemlos ... auch bei mir lief das Programm in einer früheren Version!
Aber jetzt kann ich wie gesagt nichts nebenbei mehr machen!
Woran kann das liegen?
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:
| unit Pacman;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, StdCtrls, Math;
type Elemente = Array [0..19, 0..19] of TImage; TForm1 = class(TForm) Image1: TImage; Panel1: TPanel; Memo1: TMemo; Memo2: TMemo; Label1: TLabel; Timer1: TTimer; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1 : TForm1; Animation : Integer = 1; Bewegung : Integer = 1; i : Integer = 1; BilderElemente : Elemente; Bild : TImage; Richtung : Char = 'R'; Level: TStrings; LevelReal: String; Punktestand : Integer = 0; NahrungGesamt : Integer = 0; NahrungAufgesammelt : Integer = 0;
implementation
{$R *.dfm}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_left then begin if (Timer1.Enabled = False) then begin LevelReal:= Level[(Image1.Left-Image1.Width) + (Image1.Top div 20)]; if not (LevelReal = 'MauerL.bmp') and not (LevelReal = 'MauerM.bmp') and not (LevelReal = 'EckeOR.bmp') and not (LevelReal = 'EckeUR.bmp') then begin Timer1.Enabled := True; Richtung:= 'L'; end; end; end;
if key = vk_right then begin if (Timer1.Enabled = False) then begin LevelReal:= Level[(Image1.Left+Image1.Width) + (Image1.Top div 20)]; if not (LevelReal = 'MauerR.bmp') and not (LevelReal = 'MauerM.bmp') and not (LevelReal = 'EckeOL.bmp') and not (LevelReal = 'EckeUL.bmp') then begin Timer1.Enabled := True; Richtung:= 'R'; end; end; end;
if key = vk_down then begin if (Timer1.Enabled = False) then begin LevelReal:= Level[Image1.Left + ((Image1.Top+Image1.Height) div 20)]; if not (LevelReal = 'MauerU.bmp') and not (LevelReal = 'MauerM.bmp') and not (LevelReal = 'EckeOL.bmp') and not (LevelReal = 'EckeOR.bmp') then begin Timer1.Enabled := True; Richtung:= 'U'; end; end; end;
if key = vk_up then begin if (Timer1.Enabled = False) then begin LevelReal:= Level[Image1.Left + ((Image1.Top-Image1.Height) div 20)]; if not (LevelReal = 'MauerO.bmp') and not (LevelReal = 'MauerM.bmp') and not (LevelReal = 'EckeUL.bmp') and not (LevelReal = 'EckeUR.bmp') then begin Timer1.Enabled := True; Richtung:= 'O'; end; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); var x, y, Zeile : Integer; begin Level:= TStringList.Create; Level.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Level 2.txt'); Zeile:= 0;
for x:= 0 to 19 do begin for y:= 0 to 19 do begin BilderElemente[x,y]:= TImage.Create(Self);
LevelReal:= Level.Strings[Zeile]; if (LevelReal = 'BodenV.bmp') then Inc(NahrungGesamt); BilderElemente[x,y].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + LevelReal); BilderElemente[x,y].transparent:=true; BilderElemente[x,y].enabled:=False;
Inc(Zeile); BilderElemente[x,y].Parent:= Self; BilderElemente[x,y].SetBounds(x * 20, y * 20, 20, 20); end; end; Memo2.Text := '0 / ' + IntToStr(NahrungGesamt); end;
procedure TForm1.Timer1Timer(Sender: TObject); begin case Bewegung of 1 : image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'pac1' + Richtung + '.bmp'); 2 : begin image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'pac2' + Richtung + '.bmp'); if (Richtung = 'L') and (LevelReal = 'BodenV.bmp') then begin BilderElemente[(Image1.Left-15) div 20, Image1.Top div 20].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'BodenL.bmp'); Level.Delete((Image1.Left-15) + (Image1.Top div 20)); Level.Insert((Image1.Left-15) + (Image1.Top div 20), 'BodenL.bmp'); end; if (Richtung = 'R') and (LevelReal = 'BodenV.bmp') then begin BilderElemente[(Image1.Left+15) div 20, Image1.Top div 20].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'BodenL.bmp'); Level.Delete((Image1.Left+15) + (Image1.Top div 20)); Level.Insert((Image1.Left+15) + (Image1.Top div 20), 'BodenL.bmp'); end; if (Richtung = 'O') and (LevelReal = 'BodenV.bmp') then begin BilderElemente[Image1.Left div 20, (Image1.Top-15) div 20].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'BodenL.bmp'); Level.Delete((Image1.Left) + ((Image1.Top-15) div 20)); Level.Insert((Image1.Left) + ((Image1.Top-15) div 20), 'BodenL.bmp'); end; if (Richtung = 'U') and (LevelReal = 'BodenV.bmp') then begin BilderElemente[Image1.Left div 20, (Image1.Top+15) div 20].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'BodenL.bmp'); Level.Delete((Image1.Left) + ((Image1.Top+15) div 20)); Level.Insert((Image1.Left) + ((Image1.Top+15) div 20), 'BodenL.bmp'); end; end; 3 : image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'pac3' + Richtung + '.bmp'); 4 : image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'pac4' + Richtung + '.bmp'); end; case Richtung of 'L' : Image1.left := Image1.Left - 5; 'R' : Image1.left := Image1.Left + 5; 'O' : Image1.Top := Image1.Top - 5; 'U' : Image1.Top := Image1.Top + 5; end; Inc(Bewegung); if (Bewegung >= 5) then begin Dec(Bewegung, 4); if (LevelReal = 'BodenV.bmp') then begin Inc(NahrungAufgesammelt); Memo2.Text := IntToStr(NahrungAufgesammelt) + ' / ' + IntToStr(NahrungGesamt); end; Timer1.Enabled := False; end; end;
procedure TForm1.FormDestroy(Sender: TObject); begin Level.Free; end;
end. |
Bitte nicht über den teilweise wirschen Quellcode lachen oder so, aber wir mussten uns das alles selbst beibringen, weil wir in Info in der Schule nur Luschenzeugs proggen.
Immer wenn ich das Programm starten will und ich nebenbei im Netz surfe, dann kommt ein Fenster das leer ist und in dem nur die Buttons "OK" und "Abbrechen" sind ... unten links ist noch eine Box, in die ich einen Haken setzen könnte, um das "Visit CPU Window" zu sehen ... aber weil der Rechner dann schon abgestürzt ist, kann ich das nicht mehr machen.
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Do 30.01.03 21:03
mich würde mal die Zeitspanne des Timers interessieren. Aber da es anderswo zu laufen scheint, ist es vermutlich ein sehr lokales Problem (evtl hängt es mit Win98 zusammen, bzw mit der non-NT-Schiene).
Habt ihr die alte Version noch? Wenn ja, schaut, was für neuer Code drin ist. Praktisch die Differenz der beiden Versionen. Irgendwo da drin müsste dann ja theoretisch der Fehler sein (Schleifen, die oft aufgerufen werden, Speicher, der oft bewegt wird, o.Ä.).
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Do 30.01.03 21:11
Haben wir leider nicht, weil das aktuelle Programm auch bei mir erst noch gelaufen ist ... dann aber nicht mehr.
Eigentlich müsste es ja an der OnCreate-Prozedur leigen, weil das Programm ja beim Starten abstürzt, wenn ich im Netz bin.
Der Timer hat das Intervall 50 ... ist für die Pacman-Mundbewegung.
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 31.01.03 00:16
Hi,
nen billig trick der aber meist sehr gut hilft ist einfach mal ganz viele ShowMessage' einzubauen...
Ich mach's immer so das ich dann z.B.:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure FormCreate; begin ShowMessage('1'); blabla.. ShowMessage('2'); blabla.. ShowMessage('3'); end; |
so in der Art... damit kannst du ziemlich genau die stelle finden wo es hängt
Au'revoir,
Aya~
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 31.01.03 02:22
Man könnte natürlich auch einfach mit F7 durchsteppen, so findet man auch die Stelle, wo er aussteigt.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Fr 31.01.03 14:19
Moin,
das performance problem lieg zu 100%iger wahrscheinlichkeit daran, dass ihr für dieses spiel die VCL und somit GDI benutzt, die beide nicht fürs schnelle zeichnen ausgelegt sind. Wenn ihr nun Image verschiebt werden erstmal hunderte von unterprozeduren aufgerufen. Zudem läd ihr im gameLoop dateien von platte und stellt auchnoch die fileNamen aus diversen parametern zusammen. Ich würd die 'richtungs graphiken' in ein TBitmap vorladen . zB ... array [0..3] of TBitmap ... mit create und so!
Wenn ihr schon VCL verwenden wollt, dann würd ich mal testen, ob es sinn macht ein einzige TImage zu nehmen und pro frame die graphiken, samt player drauf zu zeichnen, mit Canvas.draw oder so.
Ich hab auch mal PacMan programmiert, deshalb weiss ich, dass das nicht trivial ist. Für das original wurde zwei jahre entwicklungszeit benötigt. Doch damals musste ja auch noch alles gelötet werden
Nicht verzagen, weiter machen...bis die fingerkuppen bluten
Zu dem internet prob kann ich nicht sagen, als 'nen break-point setzen und steppen.
mfg mx
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 31.01.03 15:03
Erstmal Danke für die zahlreichen Antworten!
Wir werden uns mal heutea nachmittag drum kümmern.
Nur: Pacman ist eine Facharbiet und die muss am 3.2.03 abgegeben werden.
Das mit dem Array of TImage versteh ich schon, nur weil wir 16 verschiedenen Bilder haben, müssen die ja auch alle einzeln geladen werden. Wie bekommen wir das hin?
Und wie kann man das Spiel auf schnelles Zeichnen auslegen? Wir haben davon doch keine Ahnung, weil wir uns erstmal alles für die Facharbeit selbst beibringen mussten, da wir in der Schule nur Buttons und so ein Zeug machen.
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Fr 31.01.03 15:22
also fürs schnelle Zeichnen empfehle ich in eurem Fall DelphiX(gib den Begiff mal hier unter Suche ein  ) wenn ihr hingegen mehr auf "Schönheit"(was bei einer Facharbeit aberegal sein dürfte, oder  ) aus seid ist ProjectOmega besser, denn dieses gfx Package kann fast ohne Geschwindigkeitsverlust auch alphablenden und drehen, ist aber schwieriger zu beutzen als DelphiX.
MathiasH
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 31.01.03 15:41
Wenn ich das mal so beiläufig aufgeschnappt hab, dann ist DelphiX so eine Art DirectX oder OpenGL, right?
Aber das ist bestimmt keine Standardkomponente in Delphi genauso wenig wie ProjectOmega. Und wir dürfen nur die Standartkomponenten aus Delphi benutzen, weil das Programm auf jedem Rechner laufen muss, egal was für ein Delphi drauf ist.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 31.01.03 15:53
DelphiX ist die Kapselung von DirectX.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Fr 31.01.03 15:58
also. so könnt ihr die bilder vorladen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TBMPArr = array[0..15] of TBitmap; ... var BMPs : TBMPArr; ... var i : integer; begin for i := 0 to 15 do begin BMPs[i] := TBitmap.Create; BMPs[i].LoadFromFile(fileName); end; ... |
und theoretisch so zeichnen (nicht getestet):
Quelltext 1:
| Image1.Canvas.Draw(x,y,BMPs[i]); |
viel spass
mfg mx
|
|
Ist die Frage beantwortet? Das Problem gelöst?
Dann klicke hier, um das Thema entsprechend zu markieren!
|
|