Autor Beitrag
Kalimeromax
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 11.02.09 12:17 
Hi leute! ich bin neu hier im forum und hoffe ihr könnt mir bei meinem Problem behilflich sein.

Und zwzar sollen wir die Wände eines von uns erstellten Labyrinth, welches noch aus vielen Zellen besteht, einreißen.
Nun hatte ich die idee auf eine beliebige Zelle zu drücken und dann auf die nächste, die sich auf der gleichen linie befindet zu drücken, um so alle dazwischen liegenden zellwände einzureißen und somit einen gang zu schaffen.

Leider weiß ich nicht wie ich das mit Delphi Programmieren kann.

hier mein bisheriger Quelltext:
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:
unit UCtlView;  // eine VIEW des Labyrinths aus der Vogelperspektive, dient
                // auch als CONTROLER, z.B. zum Erstellen des Labyrinths
interface       // per Mausklick...

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, UModel;
const ZW=10; XYOFF=20;
type
  TCtlView = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private  { Private-Deklarationen }
  public   { Public-Deklarationen }
    function Zl(y: integer): integer; //ZeilenNummer zur Bildschirmposition
    function Sp(x: integer): integer; //SpaltenNr. zur Bildschirmposition
    function xWert(s: SpBereich): integer; // Bildschirmpos. der Spalte
    function yWert(z: ZlBereich): integer; // Bildschirmpos. der Zeile
    procedure ZeichneLab;
  end;

var CtlView: TCtlView;

implementation {$R *.dfm}

function TCtlView.Zl(y: integer): integer;
  begin Zl:= (y-XYOFF) div ZW end;
function TCtlView.Sp(x: integer): integer;
  begin Sp:= (x-XYOFF) div ZW end;
function TCtlView.xWert(s: SpBereich): integer;
  begin xWert:= s*ZW+XYOFF end;
function TCtlView.yWert(z: ZlBereich): integer;
  begin yWert:= z*ZW+XYOFF end;

procedure TCtlView.ZeichneLab;
var z: ZlBereich; s: SpBereich;
begin
  for z:=0 to zMax do for s:=0 to sMax do
  begin
    if lab.zelle[s,z]=nil then CtlView.Canvas.Brush.Color:= ClBlue
                          else CtlView.Canvas.Brush.Color:= ClRed;
    CtlView.Canvas.Rectangle(xWert(s),yWert(z),xWert(s)+ZW,yWert(z)+ZW);
  end;
end;
    
procedure TCtlView.Button1Click(Sender: TObject);
begin
 ZeichneLab;
end;

procedure TCtlView.FormCreate(Sender: TObject);
begin
  lab:= TLabyrinth.neuesLabyrinth;
end;

procedure TCtlView.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var s: SpBereich;
    z: ZlBereich;
begin
  if (Sp(X)<=SMAX) and (Zl(Y)<=ZMAX) then
  begin s:=Sp(X); z:=Zl(Y);
    lab.zelle[s,z]:= TZelle.neueZelle;
  end;
  ZeichneLab;
end;

end.

Danke schonmal!
Kalimero

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 11.02.09 13:44 
Hallo und :welcome: in der Entwickler-Ecke!
Freut mich, dass du zu uns gefunden hast.
Wäre schön, wenn du kurz deinen Code mit <span class="inlineSyntax"><span class="codecomment">{PROTECTTAGb204f58526f061edbee9e3273f041237}</span></span>-Tags umschließen könntest, einfach oben rechts an deinem Beitrag auf den Edit-Knopf drücken ;)

Was dein Problem betrifft: Wo genau hakt es denn? Wie ich sehe, zeichnest du auf das Canvas der Form, das ist schonmal sehr ungünstig, da dieses ja jedes mal, wenn man ein Fenster drüberschiebt, neu gezeichnet wird (Deine Zeichnung muss also im onPaint neu gezeichnet werden). Eine bessere Alternative wäre, auf ein TImage zu zeichen, oder eine TPaintBox.

Wo ist deine TLabyrinth-Klasse definiert? :nixweiss:

PS: Funktionen bitte nicht in einer oder zwei Zeilen schreiben, das sieht haarsträubend aus :hair: Lieber so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function TCtlView.xWert(s: SpBereich): integer;
begin 
  xWert := s * ZW + XYOFF;
end;

function TCtlView.yWert(z: ZlBereich): integer;
begin 
  yWert := z * ZW + XYOFF; 
end;

Das ist übersichtlicher ;)

Edit: @Hidden: zu langsam :P

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Mi 11.02.09 13:50, insgesamt 1-mal bearbeitet
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mi 11.02.09 13:47 
Hi :)

Deinen Quelltext packst du am besten in
ausblenden Delphi-Tags:
1:
  <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG7414928a641aaae23e5753d0e26995cf}</span></span>					


Einzelne Stellen markierst du mit dem
Highlight-Tag:

[highlight] markierte Stelle [/highlight]


Wie ich sehe, streckt ihr das Labyrinth beim Zeichnen auf ein Rechteck:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for s := 0 to sMax do begin
  for z := 0 to zMax do begin
    {..}
    CtlView.Canvas.Rectangle(xWert(s), yWert(z), xWert(s) + ZW, yWert(z) + ZW);
  end;
end;

=> Gesamtrechteck ist (xWert(0), yWert(0), xWert(sMax) + ZW, yWert(zMax) + ZW)


Nun braucht ihr die Koordinaten des Mauszeigers bezogen auf die Zeichen- bzw. Klickfläche. Die erhaltet ihr mit dem entsprechenden OnKlick-Event mitgeliefert. Standardfall wäre jetzt: FeldNr s = Trunc(xMaus / ZW), wobei Trunc() die Nachkommastellen abschneidet, sprich: Abrundet. Mit Y könntet ihr genauso verfahren.



mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)