Einzelnen Beitrag anzeigen

fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 14:57
So nach dem der erste Teil jetzt fertig ist hab ich mich an den zweiten gemacht und es hatt sich wieder ein fehler eigeschlichen. Beim zweiten teil des spieles geht es darum vor der Polizei zu entwischen.
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class;
  TPolizei = class;
  TSpiel2 = class;

  TPolizei = class(Tobject)
    private
      { Private-Deklarationen }
      Fenster : TForm2;


     rpunkt : TPoint;

     Haupt : Tspiel2;
    public
      { Public-Deklarationen }


      procedure Bewegung();
  end;

  TSpiel2 = class
   private
    { Private-Deklarationen }
    rSpielfigur : TImage;

    rPause : Boolean;
    rDiamant : Timage;
    Polizei : TPolizei;
    rkollison1 : Tshape;
    sh : array of TImage;
    shpos : array of TPolizei;
    rZeit : Integer;

    anzahl : integer;
    Fenster : Tform2;

  public
    { Public-Deklarationen }
    procedure Polizeierstellen();

    procedure Erstellen();


    constructor Create;
    destructor Destroy; override;
  end;


  TForm2 = class(TForm)
    Engine: TTimer;
    kollision: TTimer;
    Special: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Onclose(Sender: TObject; var Action: TCloseAction);
    procedure OnkeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure EngineTimer(Sender: TObject);
    procedure kollisionTimer(Sender: TObject);
    procedure SpecialTimer(Sender: TObject);
  private
    { Private-Deklarationen }
    Spiel2 : Tspiel2;
    Laser : TPolizei;
    Aktiv : Boolean;
    Zeit : String;
    z1,z2 : integer;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
   T,T1 : integer;
  X : integer;
  F : integer;

implementation

{$R *.dfm}

procedure TPolizei.Bewegung;
begin
  if haupt.rSpielfigur.Top < rpunkt.Y then rpunkt.Y := rpunkt.Y -1;
  if haupt.rSpielfigur.Top > rpunkt.Y then rpunkt.Y := rpunkt.Y +1;
  if haupt.rSpielfigur.Left < rpunkt.X then rpunkt.X := rpunkt.X -1;
  if haupt.rSpielfigur.Left > rpunkt.X then rpunkt.X := rpunkt.X +1;
  
  
end;

constructor Tspiel2.Create;
begin
   Polizei := TPolizei.Create;
   rkollison1 := TShape.create(nil);

  rkollison1.Parent := fenster;

  rkollison1.Visible:= false;

  rSpielfigur := Timage.Create(nil);
  rSpielfigur.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\rechts.bmp');
  rSpielfigur.Top:= 0;
  rSpielfigur.Left:= 30;
  rSpielfigur.AutoSize := true;
  rSpielfigur.Picture.Bitmap.TransparentColor := clyellow;
  rSpielfigur.Picture.Bitmap.Transparent := true;
  rSpielfigur.Transparent:=true;
  rSpielfigur.Parent := fenster;
  rkollison1.Height := rSpielfigur.Height;
  rkollison1.Width := rSpielfigur.Width -13;

  T:= 1;
  F := 1;
  Polizeierstellen;
end;
procedure TForm2.EngineTimer(Sender: TObject);
var
index : word;
begin
If not Spiel2.rPause then form2.Caption := 'Aspirin'+' '+ Zeit ;
If Spiel2.rPause then form2.Caption := 'Aspirin'+' '+'Pause';
if Spiel2.rZeit > 0 then
begin
if t1 = 1 then
begin
//showmessage('Jetzt') ;
for index := 0 to Spiel2.anzahl-1 do
 begin

 Spiel2.shpos[index].Bewegung();

  Spiel2.sh[index].Top := Spiel2.shpos[index].rpunkt.Y;
  Spiel2.sh[index].Left := Spiel2.shpos[index].rpunkt.X;
// sh2[index].Bewegung;

  end;
end;
end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Zeit := '2:00';
form2.Width := 800;
form2.Height := 600;

Spiel2 := TSpiel2.Create;
Spiel2.rPause := true;

Form2.DoubleBuffered:=True;
end;

procedure TForm2.kollisionTimer(Sender: TObject);
var
index : word;
r : Trect;
begin
if t1 = 1 then
 begin
for index := 0 to Spiel2.anzahl-1 do
 begin
     if intersectrect(r, Spiel2.rkollison1.BoundsRect, Spiel2.sh[index].BoundsRect ) then
     begin
     showmessage('Sie wurden erwischt');
     application.Terminate;
     end;
  end;
 end;
end;


procedure TForm2.Onclose(Sender: TObject; var Action: TCloseAction);
begin
Spiel2.Free;

end;

procedure TForm2.OnkeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if not Spiel2.rPause then
begin
  case key of
  vk_down: begin
             if Spiel2.rSpielfigur.Top< 520 then
              begin
             Spiel2.rSpielfigur.Top := Spiel2.rSpielfigur.Top + 4;
             Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
             Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;
              end;
           end;
  vk_up: begin
         if not Spiel2.rSpielfigur.Top<0 then
         begin
         Spiel2.rSpielfigur.Top := Spiel2.rSpielfigur.Top -4;
         Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
         Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;
         end;
         end;
  vk_left: begin
           if not Spiel2.rSpielfigur.Left<0 then
           begin
           Spiel2.rSpielfigur.Left:= Spiel2.rSpielfigur.Left -4;
           Spiel2.rSpielfigur.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\links.bmp');
           Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
           Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;
           end;
           end;
  vk_right: begin
           if Spiel2.rSpielfigur.Left < 730 then
           begin
            Spiel2.rSpielfigur.Left:= Spiel2.rSpielfigur.Left +4;
            Spiel2.rSpielfigur.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\rechts.bmp');
            Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
            Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;

           end;
            end;


  end;
end;
if key = vk_space then
begin
case T of
0: begin
   Spiel2.rPause :=true;
   T:=1;
   end;
1: begin
   Spiel2.rPause := false;
   T:=0;
   end;

 end;
end;
end;

procedure TForm2.SpecialTimer(Sender: TObject);
var

sl: TStrings;
r : integer;

begin
spiel2.rZeit:= spiel2.rZeit +1;

   sl := TStringlist.Create;
   sl.Delimiter := ':';
   sl.DelimitedText := Zeit;
   z1 := strtoint(sl[0]);
   z2 := strtoint(sl[1]);
   if z2 = 0 then
   begin
   z1 := z1 -1;
   z2 := 59;
   end;
   z2:= z2-1;
   Zeit := inttostr(z1)+ ':' + inttostr(z2);
   sl.Free;
   r := r+1;
   if r=15 then
   begin
   Spiel2.Polizeierstellen;
   r:=0;
   end;

if spiel2.rZeit = 7200 then Special.Enabled:= false;

end;

destructor Tspiel2.Destroy;
begin
  rSpielfigur.Free;

Polizei.Free;
setlength(sh, 0);
setlength(shpos, 0);
end;

procedure Tspiel2.Erstellen;
begin
   shpos[anzahl]:= TPolizei.Create;
   shpos[anzahl].Bewegung;
   shpos[anzahl].rpunkt.X := 400;
   shpos[anzahl].rpunkt.Y := 600;
   sh[anzahl] := TImage.Create(nil);
   sh[anzahl].Parent:= form2;
   sh[anzahl].Top := 600;
  sh[anzahl].Left := 400;
  sh[anzahl].Picture.Bitmap.LoadFromFile(extractfilepath(application.ExeName) + '\Bilder\Polizei_rechts.bmp');
  sh[anzahl].AutoSize:=true;
  sh[anzahl].Picture.Bitmap.TransparentColor:= clwhite;
  sh[anzahl].Picture.Bitmap.Transparent :=true;
  sh[anzahl].Transparent:=true;
  t1 := 1;

end;

procedure TSpiel2.Polizeierstellen;
begin
 t1 := 0;
  x :=length(shpos);
 //showmessage(inttostr(x)+ ' ' + inttostr(length(shpos))+ ' '+ inttostr(anzahl)+ ' ' + inttostr(length(sh)));
 setlength(sh,x+1);
 setlength(shpos, x+1);


 erstellen;
 if length(shpos)>0 then anzahl := length(shpos);

end;

end.

Geändert von mkinzler ( 6. Apr 2012 um 14:59 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat