Autor Beitrag
bellasaphira
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 07.02.18 21:48 
Liebe Community,

zurzeit programmiere ich für die Schule ein Mensch ärgere dich nicht Spiel mit Delphi 7 und verwende dabei als Spielfiguren Images. Außerdem hab ich einen Button mit Random-Funktion, die eine beliebige Zahl zwischen 1 und 6 ausspuckt. Ich habe schon programmiert, dass die Images bei einer sechs aus dem Haus auf das Startfeld "gleiten", was ich mit einem Timer bewerkstelligt habe. Nun treffe ich auf folgendes Problem:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if ImOrange4.Left < ImOrange4.Left +55
  then ImOrange4.Left := ImOrange4.Left +1;

  if ImOrange4.Left = ImOrange4.Left +55
  then Timer2.Enabled := false;
end;

Dies ist jetzt dafür programmiert, dass es sich um ein Feld in die richtige Richtung bewegt. Nun aber funktioniert es nicht, da wenn sich ImOrange4.Left erhöht beide Werte erhöhen, also ImOrange4 und ImOrange4 +55. Somit würde ich niemals ImOrange4 +55 erreichen und das Image würde immer weiter verschoben werden. Habt ihr vllt eine Alternativlösung, wie ich bei dem ersten ImOrange4 immer um 1 erhöhen lasse und das ImOrange4 +55 den Anfangswert beibehält?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 07.02.2018 um 23:23
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 332
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, Delphi7, Casio Basic
BeitragVerfasst: Mi 07.02.18 22:42 
Die einfachste Variante wäre global eine Variable zu definieren, die temporär deine letzte Position oder deine Zielposition speichert - je nachdem was dir besser gefällt.

Ich hätte allerdings eher die Bewegung in einer for-Schleife gemacht und jeweils Application.ProcessMessages; am Ende jedes Durchlaufes aufgerufen. Das spart dir den Timer und du kannst dir sicher sein, dass die Figur dort landet, wo sie soll.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)


Zuletzt bearbeitet von Symbroson am Do 08.02.18 08:40, insgesamt 1-mal bearbeitet
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2041
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 08.02.18 01:28 
Guten Abend bellasaphira,

sobald der Timer einen Durchgang durchlaufen hat, nimmt die Eigenschaft .Left um 1 zu.
Wenn, sagen wir .Left am Anfang 10 war, heißt es dann:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
{ erster Durchgang }

// wenn  10 < (10 + 55)
if ImOrange4.Left < ImOrange4.Left +55

{ zweiter Durchgang }

// wenn  11 < (11 + 55)
if ImOrange4.Left < ImOrange4.Left +55

{ dritter Durchgang }

// wenn  12 < (12 + 55)
if ImOrange4.Left < ImOrange4.Left +55
// ... usw

So findet die Abfrage kein Ende. Du solltest dir also vorher den Startwert (hier im Beispeil = 10) merken, mit 55 zusammen zählen und gegen diese Variable prüfen. Lege die Variable bitte im private Bereich ab. Warum gerade da? Mach ein neues Thema diesbezüglich auf, dann können wir uns darüber unterhalten, falls es dich interessiert.
Wo ist dieses private? Hier :!:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TForm1 = class(TForm)
  private 
    { Private-Deklarationen }
    FLetztePisition: TPoint;  // Das "F" davor steht für ein FELD
  public
    { Public-Deklarationen }
  end;

Warum TPoint und nicht Integer? Von den 4 Figuren befinden sich nur 2 auf gleicher Höhe mit dem "Startfeld". Die restlichen 2 sind je nach Blickrichtung etwas drunter/drüber oder ein Stück weit links/rechts vom "Startfeld". Diese musst du quasi schräg zum "Startfeld" hinführen, also schadet es nicht, mit dem TPoint die X und Y Position sich zu merken und abzufragen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
bellasaphira Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 20.02.18 15:28 
Dankeschön für die ganzen Tipps^^

Ich hab jetzt eine globale Variable und stoße jetzt auf ein anderes Problem, was ich nicht wirklich verstehe:

Ich hab ne Prozedur, wo der Timer aufgerufen wird und die Zahl wird immer um 1 gesenkt...
Aber das Images bewegt sich nur um 1 nach rechts.
Das Merkwürdige ist, wenn ich eine Showmessage mit einbaue, funktioniert es:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Orange1;
begin
  Zahl := Zahl-1;
  if Zahl > 0 then begin
   showmessage(inttostr(Zahl));
   Form1.LbChanges.Caption := inttostr(Zahl);
   x := Form1.ImOrange4.Left;
   Form1.Timer2.enabled := true;
   Orange1;
   end
  else exit;
end;

Habt ihr vllt eine Lösung für mich, wie ich die Showmessage weglassen kann?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2041
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 20.02.18 16:37 
Zitat:
Dankeschön für die ganzen Tipps^^

Gern geschehen, auch wenn du die Tipps gekonnt ignorierst. :D

Mit deinem Quelltext kann man leider nicht viel anfangen. Wofür die Variable "Zahl" und "x" stehen, weiss man nicht, und was noch wichtiger ist - das OnTimer Ereignis hast du uns unterschlagen.
Ich kann dir eine Idee anbieten, wie du es übersichtlicher machen könntest:

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:
type
  TSpieler = (spGruen, spOrange, spRot, spBlau);

//...

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Spieler: TSpieler;
begin
  Spieler := spOrange;
  SetzeAufStart(Spieler, StartFeld, Orange1);
end;

procedure SetzeAufStart(Spieler: TSpieler; StartFeld, Figur: TImage); // StartFeld könnte auch eine Position (TPoint) sein
begin
  if Spieler = spOrange then
  begin
    if Figur.Left > StartFeld.Left then
      Figur.Left := Figur.Left - 1;
    if Figur.Top > StartFeld.Top then
      Figur.Top := Figur.Top - 1;
  end else
  if Spieler = ...
end;


delphi_mädn

Gutes Gelingen! :beer:
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
bellasaphira Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 20.02.18 22:46 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Gern geschehen, auch wenn du die Tipps gekonnt ignorierst. :D


Ich kann leider mit vielen Dingen nichts anfangen, da wir erst ein Jahr Info haben und unser Lehrer uns ins kalte Wasser geworfen hat, als er gemeint hatte, dass wir jetzt Projektarbeit machen^^
Deswegen verlasssen mich auch meine kognitiven Fähigkeiten, wenn ich den neuen Quellcode von dir betrachte :)
Da ich das Projekt für nächste Woche fertig haben soll, beschränke ich mich auf die "einfacheren" Programmierungen, die ich schneller kapiere... danach baue ich das alles noch aus und verbessere es. Nun zu der Erklärung meines Quellcodes:

x ist die globale Variable, die ich im Timer als Anfangsposition des Images nehme. Die Zahl wird gewürfelt, ist also die Zahl, wie weit man gehen darf.
Hier die Programmierung des Timers:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if ImOrange4.Left <  x +55
  then ImOrange4.Left := ImOrange4.Left +1;

  if ImOrange4.Left =  x +55
  then begin
   Timer2.Enabled := false;
  end;
end;

Der Timer funktioniert eigentlich, mein Problem liegt darin, dass wenn ich die showmessage, die die Zahl anzeigt, nicht habe, das Image nur um 1 (also, als ob man nur eine 1 gewürfelt hätte)nach rechts geht

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2041
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 21.02.18 00:24 
Ich wüsste nicht, warum es nicht funktionieren sollte?! Die ShowMessage() könnte einzig Probleme machen, wenn sie erscheint und währenddessen das ImOrange4 unterwegs ist. Ansonsten müsste es 55 Pixel nach rechts wandern.
Erklär' du mir mal:
- Warum die Methode Orange1() heißt, und darin ImOrange4 in Bewegung gesetzt wird? :gruebel:
- Erkennst du den Aufwand, den du hier für eine einzige Figur betreibst, damit diese einzig horizontal bewegt wird? Und jetzt stell dir das ganze mit 16 Figuren (statt mit 1), und noch dazu vertikal verschiebend vor. :?!?:
- Hat es einen bestimmten Grund, warum du hier rekursiv vorgehst, statt einfach eine Schleife einzubauen, die von 1 bis Zahl gehen könnte?
- Warum verwendest du hier eine globale Variable anstelle einer (privaten) Feldvariable? Ist ja nicht so, dass ich dich nicht darauf hingewiesen hätte. :suspect:
- Möchtest du es dir leichter machen, und verstehen, was mein Code konkret macht? Oder möchtest du lieber verbissen an deinem Konstrukt weiter arbeiten? :D

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)