AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dynamischer Array und eaccessviolation

Ein Thema von fox67 · begonnen am 4. Apr 2012 · letzter Beitrag vom 7. Apr 2012
 
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, 13: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 13:59 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz