Autor Beitrag
EMP_Rockhand
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 21.02.15 11:45 
Hallo liebes Forum,
ich habe ein Problem. Ich versuche für den Informatik Unterricht ein kleines Spiel zu programmieren, bei dem eine Figur im Fenster nach links und rechts läuft und dabei Münzen auffängt, die vom oberen Bildschirmrand fallengelassen werden. Wie kann ich es also realisieren, dass ich das gleiche Image automatisch von verschiedenen Positionen am oberen Fensterrand fallen lassen kann?

Vielen Dank schon mal :)
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: Sa 21.02.15 14:46 
:welcome:

Ein Image hat nur eine Position. Wenn du mehrere Dinge fallen lassen willst, dann kannst du zum Beispiel mehrere Images benutzen.
Um die nicht von Hand erzeugen zu müssen, und um auch besser darauf zugreifen zu können, kannst du folgenden Code benutzen, der mehrere Images in einem Array anlegt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var coins: array of TImage;

//OnCreate der Form:
Setlength(coins, Maximale_Muenzen_Zahl);
for A:= 0 to High(coins) do
  begin
    coins[A] := TImage.Create(Form1);
    coins[A].Parent := Form1;
    coins[A].Picture.LoadFromFile( ExtractFilePath(Application.ExeName)+'coin.png');
    coins[A].Visible := false;
  end;


Dann kannst du einfach deine "FallenLassen"-Funktion anpassen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure FallenLassen;
begin
  for A:= 0 to High(coins) do
    coins[A].Top := coins[A].Top - 1;
end;


Wenn du feststellst, dass eine Münze aufgesammelt wurde (oder sonst irgendwie verschwunden ist) dann kannst du sie wieder von oben fallen lassen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure ResetCoin(id: integer);
begin
  coins[id].top := -coins[id].height;  //oberer Bildschirmrand
  coins[id].left := random(Form1.ClientWidth);  //zufällig in der Breite
  coins[id].visible := true;
end;

_________________
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)

Für diesen Beitrag haben gedankt: EMP_Rockhand
EMP_Rockhand Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 21.02.15 15:52 
vielen Dank! das hat mir sehr geholfen!!
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 22.02.15 15:40 
Crosspost nennt man das, was du hier machst: Zeitgleich in zwei oder mehreren Foren dieselbe Frage stellen. Um nicht unnötig das Hirn von Leuten zu zermartern, ist es üblich, auf Crossposts hinzuweisen und diese zu verlinken, so wie ich das hier für dich erledige.
EMP_Rockhand Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 22.02.15 19:04 
Eine Frage noch: gibt es eine Möglichkeit meine Figur mit durchgängigem Tastendruck zu bewegen, sodass ich nicht immer so oft nach links oder rechts drücken muss?
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: So 22.02.15 19:31 
Ja, da gibt es mehrere.

Ich denke mal im Moment bewegst du deine Figur im OnkeyDown-Event deines Formulars. Dieses Event wird genau einmal ausgeführt (und zwar beim tastendruck). Wenn du stattdessen das OnKeyPress-Event verwendest, wird das Event solange ausgeführt, wie die Taste gedrückt bleibt.

Alternativ könntest du auch einen Timer verwenden (der periodisch ein Event ausführt). Suche dazu einfach mal ein weneig im Forum, hier gibts viele Threads dazu.
EMP_Rockhand Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 22.02.15 19:51 
wenn ich die variante mit dem OnKEyPress verwende, bekomme ich in der Prozedur :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.dp1(Sender: TObject; var Key: Char);
begin
  if Key=VK_LEFT then Image1.Left:=Image1.Left-15;
  if Key=VK_RIGHT then Image1.Left:=Image1.Left+15;
end;


die Fehlermeldung : Inkompatible Typen.
Wie ist das zu beheben?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
EMP_Rockhand Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 22.02.15 20:12 
mir ist eingefallen, dass OnKeyPress im Gegensatz zu OnKeyUp und OnKeyDown den ASCII braucht. .. aber was sind die ASCII-Codes für Pfeiltasten?
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: So 22.02.15 21:40 
Wüsste nicht, dass es die gäbe... ;-)
Das ist mit KeyPress nicht wirklich zu lösen, da wären OnKeyDown/Up schon geschickter, die liefern die VK-Codes als Parameter... Da diese Events aber rausfallen, bleibt bloß noch der Griff zu nem Timer, der in kurzen Abständen überprüft, ob GetAsyncKeystate(VK_...) < 0 ergibt, z.B.:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TFormXX.TimerXTimer(Sender: TObject);
begin
  if GetAsyncKeystate(VK_LEFT) < 0 then
    //...
  else if GetAsyncKeystate(VK_RIGHT) < 0 then
    //...
end;
EMP_Rockhand Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 23.02.15 06:44 
OK vielen Dank!