Einzelnen Beitrag anzeigen

SquareEnix

Registriert seit: 8. Sep 2009
15 Beiträge
 
Delphi 3 Professional
 
#10

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 08:59
Hier der Code. Die Mit >>>> Gekennzeichnete Zeile verursacht den Fehler.
Delphi-Quellcode:
unit Robot;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables;

type
  TRobot = class(TDatabase)
  private
    { Private-Deklarationen }
    Position:Array[1..2] of integer;
    Winkel_1,Speed:double;
    Ziel: TRobot;

  protected
    { Protected-Deklarationen }
  public
    procedure Zeichnen(Ziel: TBitmap);
    function WinkelBestimmen(X,Y:integer): Double;
    function PPunkt: TPoint;
    function PosX: integer;
    function PosY: integer;
    procedure PositionSetzen(X,Y: integer);
    function Winkel: double;
    procedure WinkelSetzen(NeuerWinkel: double);
    //procedure GeschwindigkeitSetzen(NeueGeschwindigkeit: double);
    procedure Initialisieren(PositionX, PositionY: integer; StartWinkel, Geschwindigkeit: double);
    procedure Step;
    procedure ZielAussuchen(Feinde: Array of TRobot; Prioritaet: integer);
    function EntfernungMessen (Zielpunkt: TPoint): double;
    procedure AufZielRichten;
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Robot Wars', [TRobot]);
end;

procedure TRobot.AufZielRichten;
begin
WinkelBestimmen(Ziel.PosX,Ziel.PosY);
end;

function TRobot.EntfernungMessen (Zielpunkt: TPoint): double;
var DiffX,DiffY:integer;
begin
DiffX:=Zielpunkt.x-Position[1];
DiffY:=Zielpunkt.y-Position[2];
EntfernungMessen:=Sqrt(DiffX*DiffX+DiffY*DiffY);
end;

procedure TRobot.ZielAussuchen (Feinde: Array of TRobot; Prioritaet: integer);
var i: integer; Entfernung: double;
begin
Entfernung:=1000000;
for i:= 1 to (High(Feinde))+1 do
  begin
    if EntfernungMessen(Feinde[i].PPunkt)<Entfernung then
      begin
      Entfernung:=EntfernungMessen(Feinde[i].PPunkt);
      Ziel:=Feinde[i];
      Showmessage('Ziel gewählt');
      end;
  end;
end;

procedure TRobot.Step;
begin
Position[1]:=Position[1]-Round(Sin(Winkel_1)*Speed);
Position[2]:=Position[2]-Round(Cos(Winkel_1)*Speed);

end;

procedure TRobot.Initialisieren (PositionX, PositionY: integer; StartWinkel, Geschwindigkeit: double);
begin
Position[1]:=PositionX;
Position[2]:=PositionY;
Winkel_1:=StartWinkel;
Speed:=Geschwindigkeit;
end;

procedure GeschwindigkeitSetzen(NeueGeschwindigkeit: double);
begin
//Speed:=NeueGeschwindigkeit;
end;

function TRobot.Winkel: double;
begin
Winkel:=Winkel_1;
end;

function TRobot.PPunkt: TPoint;
begin
PPunkt:=Point(Position[1],Position[2]);
end;

function TRobot.PosX: integer;
begin
PosX:=Position[1];
end;

function TRobot.PosY: integer;
begin
PosY:=Position[2];
end;

procedure TRobot.PositionSetzen(X,Y: integer);
begin
Position[1]:=X;
Position[2]:=Y;
end;

function TRobot.WinkelBestimmen(X,Y:integer): Double;
var Rid:integer; DiffX,DiffY,Plus:real;
begin
Plus:=0;
Rid:=0;
DiffX:=X-Position[1];
DiffY:=Y-Position[2];
if DiffX>0 then
  begin
  if DiffY>0 then
    Plus:=Pi/2;
  if DiffY<0 then
    begin
    Plus:=0;
    Rid:=1;
    end;
  if DiffY=0 then
    Plus:=Pi/2;
  end;
if DiffX<0 then
  begin
  if DiffY>0 then
    begin
    Plus:=Pi;
    Rid:=1;
    end;
  if DiffY<0 then
    Plus:=3*Pi/2;
  if DiffY=0 then
    Plus:=3*Pi/2;
  end;
if DiffX=0 then
  begin
  if DiffY>0 then
    begin
    Plus:=Pi;
    Rid:=1;
    end;
  if DiffY<0 then
    Plus:=2*Pi;
  if DiffY=0 then
    Plus:=0;
  end;
DiffX:=abs(DiffX);
DiffY:=abs(DiffY);
if Rid=1 then
  begin
  if DiffY=0 then
    begin
    Rid:=3;
    DiffY:=0.1;
    end;
  WinkelBestimmen:=ArcTan(DiffX/DiffY)+Plus;
  if Rid=3 then
    Winkelbestimmen:=plus;
  end
else
  begin
  if DiffX=0 then
    begin
    Rid:=2;
    DiffX:=0.1;
    end;
  WinkelBestimmen:=ArcTan(DiffY/DiffX)+Plus;
  if Rid=2 then
    Winkelbestimmen:=plus;
  end;
end;

procedure TRobot.Zeichnen(Ziel: TBitmap);
var Koord : array[1..3] of TPoint;
i :integer;
KoordX, KoordY: array[1..3] of integer;
Winkelz: array[1..3] of double;
begin
Winkelz[1]:=pi;
Winkelz[2]:=2*Pi/3+pi;
Winkelz[3]:=4*Pi/3+pi;
for i:= 1 to 3 do
  begin
  KoordX[i]:=Round(Position[1]+Sin(Winkel_1+Winkelz[i])*10);
  KoordY[i]:=Round(Position[2]+Cos(Winkel_1+Winkelz[i])*10);
  Koord[i]:=Point(KoordX[i],KoordY[i]);
  end;
Ziel.Canvas.Brush.Color:=clred;
Ziel.Canvas.Polygon(Koord);
end;

procedure TRobot.WinkelSetzen(NeuerWinkel: double);
begin
Winkel_1:=NeuerWinkel;
end;


end.
  Mit Zitat antworten Zitat