Autor Beitrag
DonnieYen
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 24.03.11 21:49 
Hallo Leute.
Eine Spielfigur aus der Klasse TFigur wird erzeugt und diese Figur kann man mit den Pfeiltasten steuern.Dabei wird überprüft,ob diese sich bewegen darf (Hindernisse: Feldsteine aus der Klasse TFeldstein und die "Formgrenzen").Die Feldsteine habe ich als Array deklariert.Erzeuge ich sie nun manuell,funktioniert alles.Lasse ich diese über eine For-Schleife erzeugen,bekomme ich beim Bewegen nach unten und nach oben eine Zugriffsverletzung.Nach links oder rechts geht nichts,bestimmt weil die Überprüfungsfunktion false ausgibt.
Dazu habe ich zwei Fenster.
Main verwaltet alles,
auf Spielfeld wird alles dargestellt.
Wo könnte der Fehler liegen?

ausblenden volle Höhe Delphi-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:
unit mTestspiel;

interface

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

type
  TMain = class(TForm)
    btStart: TButton;
    btErzeugen: TButton;
    procedure btStartClick(Sender: TObject);
    procedure btErzeugenClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
    Spielfeld: TSpielfeld;
    Testfigur: TFigur;
    testfeldstein: array [1..10of TFeldstein;
    function IstWegFrei(Richtung: integer; Figur: TFigur; Fenster: TForm): boolean;   //Richtung 1= Links,2=Rechts,3=Hoch,4=Runter
  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;

implementation

{$R *.dfm}

procedure TMain.btErzeugenClick(Sender: TObject);
var i,startpositionx: integer;
begin
  Testfigur := TFigur.create(50,150,Spielfeld);
  Testfigur.zeichnen;
  btErzeugen.Enabled := false;

  {testfeldstein[1] := TFeldstein.create(200,150,Spielfeld);
  testfeldstein[1].erzeugen;
  testfeldstein[2] := TFeldstein.create(200,200,Spielfeld);
  testfeldstein[2].erzeugen;
  testfeldstein[3] := TFeldstein.create(250,175,Spielfeld);
  testfeldstein[3].erzeugen;}


  startpositionx := 200;


  for I := 0 to 9 do begin
    TestFeldstein[i] := TFeldstein.create(startpositionx,25,Spielfeld);
    testFeldstein[i].erzeugen;
    startpositionx := startpositionx+25;
  end;

end;

procedure TMain.btStartClick(Sender: TObject);
begin
  Spielfeld := TSpielfeld.Create(Main);
  Spielfeld.Show;
  btStart.Enabled := false;
end;

procedure TMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (key = vk_left) and IstWegFrei(1,Testfigur,Spielfeld) then
    Testfigur.left(-25)
      else if (key = vk_right) and IstWegFrei(2,Testfigur,Spielfeld) then
        Testfigur.left(25)
          else if (key = vk_up) and IstWegFrei(3,Testfigur,Spielfeld) then
            Testfigur.top(-25)
              else if (key = vk_down) and IstWegFrei(4,Testfigur,Spielfeld) then
                   testfigur.top(25);
end;

function TMain.IstWegFrei(Richtung: integer; Figur: TFigur; Fenster: TForm): boolean;
var i: integer;
begin
  IstWegFrei := true;
  for I := 0 to Spielfeld.ComponentCount do begin
  case Richtung of
  1:begin
      if Figur.LeftPos <= 0
        then IstWegFrei := false
          else if (Figur.LeftPos-25 = testfeldstein[i].Left) and (Figur.TopPos = testfeldstein[i].Top)
            then IstWegFrei := false;
    end;
  2:begin
      if Figur.LeftPos+50 >= Fenster.Width
        then IstWegFrei := false
          else if (Figur.LeftPos+25 = testfeldstein[i].Left) and (Figur.TopPos = testfeldstein[i].Top)
            then IstWegFrei := false;
    end;
  3:begin
      if Figur.TopPos <= 0
        then IstWegFrei := false
          else if (Figur.LeftPos = testfeldstein[i].Left) and (Figur.TopPos-25 = testfeldstein[i].Top)
            then IstWegFrei := false;
    end;
  4:begin
    if Figur.TopPos+70 >= Fenster.Height
      then IstWegFrei := false
        else if (Figur.LeftPos = testfeldstein[i].Left) and (Figur.TopPos+25 = testfeldstein[i].Top)
            then IstWegFrei := false;
    end;
  end;
  end;
end;

end.


Gruß,
Donnie

P.S.:
Bitte nicht schlagen,sind meine ersten Versuche mit eigenen Klassen und Co.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.03.11 22:25 
user profile iconDonnieYen hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
  for I := 0 to Spielfeld.ComponentCount do begin
  case Richtung of
Dir fehlt das - 1. Der höchste Index ist ComponentCount - 1, da es mit 0 losgeht.