Autor Beitrag
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 17.03.11 20:24 
Hallo!

Ich möchte folgendes realisieren:
Ein zweidimensionales Array stellt ein Spielbrett dar. Ich habe darin die Figur, die der Spieler steuert und möchte andere Spielfiguren (Elemente) an die Spielerfigur näher heranrücken, und zwar jedesmal, wenn die Spielerfigur ihre Position ändert. Stellt euch einfach Spielsteine auf einem Spielbrett vor. Jedesmal, wenn die Spielerfigur sich bewegt, rücken die anderen um 1 Feld näher.

Ich muss also prüfen, ob die x- und y-Position der zu bewegenden Elemente grösser oder kleiner als jene der Spielerfigur ist, dann jedes dieser Elemente im Array entsprechend positionieren und das ganze schliesslich zeichnen.

Aber ich habe keine Idee, wie ich das hinbekomme.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    for x := 0 to iMaxH do
      for y := 0 to iMaxV do
      begin
        if (aBoard[x, y] = elBlock) then  //Element elBlock soll an das Element elPlayer heranrücken 
        begin
          if x_von elBlock < x_von_elPlayer then //Pseudocode - so irgendwie muss es aussehen
          //...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Fr 18.03.11 11:36 
Hi,

ich würde das erstmal über einen Differenzvektor machen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 if (aBoard[x, y] = elBlock) then
    begin
      //=> Block an der Stelle X/Y, ich nenne es mal Block.X, Block.Y
      //   Player an der Stelle Player.X,Player.Y
      Diff.X:=Block.X-Player.X;  //Diff: TPoint
      Diff.Y:=Block.Y-Player.Y;
 
      Diff.X:=sgn(Diff.X); //auf 1 normieren, Vorzeichen bleibt erhalten
      Diff.Y:=sgn(Diff.Y);

      if (aBoard[Diff.X+Block.X,Diff.Y+Block.Y]=elFree)or(aBoard[Diff.X+Block.X,Diff.Y+Block.Y]=elPlayer){...} then
        //block verschieben nach [Diff.X+Block.X,Diff.Y+Block.Y]

      if (Block.X=Player.X)and(Block.Y=Player.Y) then
        //Spieler zermatscht
    end;


//PS: es wäre vielleicht sinnvoll, die Bewegung aufzuteilen in X und Y. a) kann er im Moment diagonal rücken, b) bleibt er an jeder Wand hängen ;) Du musst ja auch noch was zu tun haben :mrgreen:

//Spätes Edit: Es heißt nicht sgn, sondern Sign (Unit Math) :zwinker:

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 20.03.11 12:13 
Habe jetzt eine Möglichkeit gefunden, die auch diagonale Bewegungen zulässt, klappt gut!
l1 und t1 geben dabei die neue x/y-Position an:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    for x := 0 to iMaxH-1 do
      for y := 0 to iMaxV-1 do
      begin
        l1 := x;
        t1 := y;
        if aBoard[x, y] = elBlock then
        begin
          if x < l then Inc(l1)
          else          Dec(l1);
          if y < t then Inc(t1)
          else          Dec(t1);

          if (aBoard[l1, t1] <> elFree) then break;
//Hier wird elBlock dann auf l1, t1 gesetzt
//...

Danke!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!