Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Bewegung im einem Spiel mit Buttons


´|` R /\ I | ) O $ - Sa 05.04.08 11:29
Titel: Bewegung im einem Spiel mit Buttons
Hoi, ich hätte da mal ne Frage:

Ich bin grad am schreiben von nem kleinen Spiel. Dazu wollte ich folgendes machen, ich weiß aber nich genau, wie ich das in Delphi umsetzen kann, vlt. kann mir da jmd. n Hinweiß geben, oder sogar n Quelltext. Danke schonmal im Vorraus! :-)

Ich wollte:
Einen ganzen Haufen an Buttons nebeneinander, untereinander ect. machen und diese als Felder nehme, auf denen sich ein Charakter vortbewegen kann. Jetzt wollte ich, dass sich der Charaker immer nur auf ein Feld, dass direkt an seins angrenz bewegen kann, also nich hin-und herspringen kann. Zudem wollte ich, dass auf dem Button dann n Zeichen, oder n Wort is, dass man sieht, dass man dort ( Charakter ) steht.

THX


Moderiert von user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 05.04.2008 um 11:33


Christian S. - Sa 05.04.08 11:32

Hallo und :welcome: ,

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

Viele Grüße,
Christian


´|` R /\ I | ) O $ - Sa 05.04.08 11:35

Danke! :-)
Besser der Name?


Christian S. - Sa 05.04.08 11:40

Japp, jetzt ist der Titel besser. :-)

Die Buttons würde ich in einem Array verwalten [http://www.delphi-library.de/topic_Komponenten+dynamisch+im+Array+verwalten_43052.html]. Darin kannst Du dann recht einfach mit ein oder zwei Schleifen (je nachdem, ob das Array ein- oder zweidimensional ist) durchgehen und abfragen, welcher Button direkt an den Charakter angrenzt. Bei allen anderen setzt Du buttonX.Enabled := false;

Eigentlich gilt hier pro Frage ein Thread, aber die zweite Frage beantworte ich ganz kurz. button1.Caption := 'hier';. Damit setzt Du den Text eines Buttons. Bei Nachfragen dazu aber bitte einen neuen Thread aufmachen. Danke! :-)


´|` R /\ I | ) O $ - Sa 05.04.08 12:08

:-/
Mir stellt sich dann grad die Frage, wie genau ich das machen soll *ist grad leicht verwirrt*


Christian S. - Sa 05.04.08 12:11

Wie weit bist Du denn gekommen? Probier's doch mal selber und wenn Du nicht weiter kommst, fragst Du nochmal konkret nach. Da lernst Du auf jeden Fall mehr bei :-)


´|` R /\ I | ) O $ - Sa 05.04.08 13:40

Ich versteht grad nich, wie ich dein Beispiel so umschreibe, dass ich von Button zu Button "laufen" kann, wobei halt nur die Felder, die direkt angrenzen begehbar sind.


Christian S. - Sa 05.04.08 13:42

Dazu musst Du erst einmal erklären, wie das Laufen funktionieren soll. Soll der Spieler auf einen Button klicken, damit der Charakter dorthin läuft?


´|` R /\ I | ) O $ - Sa 05.04.08 13:57

Ja. Also er steht auf dem Anfangsfeld und wenn er dann auf den Button rechts daneben klickt, dann "lauft" er dorthin. Es steht dann auf dem geklickten Button z.B. "Du", damit man weiß, wo man ist.


Christian S. - Sa 05.04.08 14:17

Welche Gedanken hast Du Dir dazu gemacht, wie das funktionieren könnte?
Und an welcher Stelle hakt es jetzt?


´|` R /\ I | ) O $ - Sa 05.04.08 14:23

Ich dachte mir das so:
Wenn ich auf den Button klicke, dann "wandert" das "Du" ( Angabe wo man sich befindet ) auf das geklickte Feld ( Button ). Dabei muss aber ne Festlegung erfolgen, dass ich nich auf ein Feld, was ewig weit weg ist springen kann. Also müssten alle, die nicht direkt angrenzen "abgesperrt" werden und wenn man n Feld geht, muss sich die Grenze ja verändern.

Das Problem wo ich hänge is im Moment die Grenze zu setzen.
Das "Du" wandern lassen hab ich schon eingebaut.


Christian S. - Sa 05.04.08 14:35

Du brauchst die Koordinaten des Buttons, auf den geklickt wird und die Koordinaten des Buttons, wo das "Du" aktuell steht. Und die dürfen nicht zu weit auseinander sein. Wenn Du wie in dem Link von mir beschrieben die Buttons im Quellcode erzeugst, kannst Du die Koordinaten direkt bei der Erstellung in der Tag-Eigenschaft des Buttons speichern.


IceBube - Sa 05.04.08 15:06

Hallo!

Also ich würde das so machen:


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:
procedure TForm1.Button1Click(Sender: TObject);
var Sprung : integer;
Default : TButton;
begin
//Diese Fuktion muss allen Buttons zugewiesen werden
Default := (Sender As TButton); //Der geklickte Button

//Sprung berechnen;
Sprung := Default.Tag - Start;

//Wenn negativ dann umwandeln
if Sprung < 0 then Sprung := Sprung * (-1);

//Erlaubt?
if (Sprung = 1or (Sprung=4then
begin
//Springen und Variablen ändern

//Caption vom alten Button entfernen
Button.Caption := '';

Start := Default.Tag; //Derzeitiger StartPunkt
Button := Default;    //Der geklickte Button

//Neue Caption
Button.Caption := 'Du';
end;

end;


Form onCreate


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.FormCreate(Sender: TObject);
begin
//Festlegen der Variablen
Start := 1;
Button := Button1;

//Die Tags der Buttons müssen so angelegt sein
// 1  2  3  4
// 5  6  7  8
// 9 10 11 12
// Sodass man kontrollieren kann ob die Sprünge richtig sind
// ^Wenn man nun auf 1 steht wäre erlaubt(2,5)
// Bedeute 1 +1 = 2, 1+4 = 5
end;

//

Wie schon im Code erwähnt, ist dabei wichtig die Tags von den Buttons!
Im Public/Private bereich noch zwei Variablen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Start : integer; //StartPosition;
    Button : TButton; //StartButton;
  end;



lg


Hidden - Sa 05.04.08 15:28

Hi,

Hier einmal eine überarbeitete Version:


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:
procedure TForm1.Button1Click(Sender: TObject);
var
  Sprung: Integer;
  Default: TButton;  //Der geklickte Button
begin
  Default := (Sender as TButton);

  //Sprung berechnen;
  Sprung := Default.Tag - Start;

  //Wenn negativ dann umwandeln
  if Sprung < 0 then
    Sprung := -Sprung;

  if Sprung in [14then begin
    //Springen und Variablen ändern

    //Caption vom alten Button entfernen
    Button.Caption := '';

    Start := Default.Tag; //Derzeitiger StartPunkt
    Button := Default; //Der geklickte Button

    //Neue Caption
    Button.Caption := 'Du';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Festlegen der Variablen
  Start := 1;
  Button := Button1;

  //Die Tags der Buttons müssen so angelegt sein
  // 1  2  3  4
  // 5  6  7  8
  // 9 10 11 12
  // Sodass man kontrollieren kann ob die Sprünge richtig sind
  // Wenn man nun auf 1 steht wäre erlaubt(2,5)
end;


Wie schon im Code erwähnt, ist dabei wichtig die Tags von den Buttons!
Im Public/Private bereich noch zwei Variablen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Start : integer; //StartPosition;
    Button : TButton; //StartButton;
  end;


mfG,


´|` R /\ I | ) O $ - So 06.04.08 11:38

Ok, nur jetzt stellt sich mir die Fragem wie ich die "Tags" zuweisen kann mit den Zahlen. :-/

Edit: Die Buttons brauch ich nich erzeugen, die hab ich schon fest eingebaut.


Hidden - So 06.04.08 12:08

Hi,

Die Variable "Start" entfällt, die sie ja immer gleich des Tags des Buttons ist.

Wenn du die Buttons nicht automatisch erstellen willst, musst do wohl von hand die einzelnen Bittons anklicken und im opject inspector unter properties "Tag" auf den jeweiligen wert setzen.

mfG,


´|` R /\ I | ) O $ - So 06.04.08 12:25

Ok, hab ich jetzt gemacht.
Bei mir sieht es momentan so aus:


Quelltext
1:
2:
3:
                       XX
                       X
Meine erstellte Karte: XXXXX

Und so weiter
Start ist ganz links unten in der Ecke.

Quelltext dazu:( laufen war im oberen Bsp. "Sprung" )


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button9Click(Sender: TObject);
var laufen:Integer;
    default:TButton;
begin
Default:=(Sender as TButton);
laufen:=Default.Tag-1;
if laufen<0 then
laufen:=-laufen;
if laufen in [1,4then
begin
Button9.Caption := '';
laufen:=Default.Tag;
Button9:=Default;
Button9.Caption:='Sie';
end;


Er startet das Programm, aber es geht nich :-/

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Hidden - So 06.04.08 12:38

Hi,

Bitte verwende Delphi-Tags für deine Code-Beiträge:

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG17050fc2ca09bd6452a71dfc8cb7a33c}</span></span>                    


Hier einmal der Quelltext in formatierter und überarbeiteterVersion:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button9Click(Sender: TObject);
var laufen: Integer;
  default: TButton;
begin
  Default := (Sender as TButton);
  if Abs(Default.Tag - 1in [14then begin  //Im Prinzip kannst du auch direkt den Tag um eins höher reinschreiben
    Button.Caption := '';  //Wenn ich das richtig verstanden habe, ist "Button" eine globale Variable, die den aktiven Button enthält.
    Button := Default;
    Button.Caption := 'Sie';
  end;


Dann noch: gehr nicht ist keine Fehlerbeschreibung. Was genau passiert?

mfG,


´|` R /\ I | ) O $ - So 06.04.08 13:03

k.A., warum es nicht geht.
Ich hab den überarbeitetet jetzt reingemacht, aber schonwieder passiert nix.
Es kommt nichtmal das "Du", wenn ich auf nen Button klicke.

Wäre super nett, wenn einer mal 3 Buttons, oder so sich erstellen würde und das mal testet, weil ich komm überhaupt garnich weiter im Moment. :-(
Wenn es klappt, bitte mal posten.
Keiner ne Idee?

THX