Autor Beitrag
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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?

ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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.:

ausblenden 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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 :D

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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: 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 :D) wenn ihr hingegen mehr auf "Schönheit"(was bei einer Facharbeit aberegal sein dürfte, oder :lol: ) 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



BeitragVerfasst: 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



BeitragVerfasst: Fr 31.01.03 15:53 
DelphiX ist die Kapselung von DirectX.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 31.01.03 15:58 
also. so könnt ihr die bilder vorladen:
ausblenden 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):

ausblenden 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!