![]() |
Kleines Pferdespiel
Hallo!
ich soll für meine kleine Schwester ein Pferde-spiel programmieren. Es soll möglichst simpel sein, deswegen habe ich mir gedacht, dass ersteinmal nur von rechts Barikaden hereingefahren kommen, über die man springen muss. Nun habe ich aber das Problem, dass ich die Leertaste, mit der man springen soll, nicht ansteuern kann. Wenn sie gedrückt ist, soll nur einmal die aktion passieren und dann soll erst wieder gewartet werden, bis mein image wieder auf der position ist, die ich haben will. Das ganze möchte ich so gestalten, dass wenn die prozedur erfüllt ist (Leertaste gedrückt) ein Timer angehen soll, der dann bestimmt, wie lange mein Pferd in der Luft bleibt. |
Re: Kleines Pferdespiel
Und was genau ist jetzt deine Frage? :gruebel:
|
Re: Kleines Pferdespiel
Ich will die Leertaste ansprechen.
(Immer wenn die Leertaste gedrückt wird, wird eine Prozedur gestartet.) Ich gebe zu, dass das da oben nicht sonderlich gut ausgedrückt war. Ich wollte euch nur einen Überblick geben... |
Re: Kleines Pferdespiel
|
Re: Kleines Pferdespiel
Hallo,
es hat nichts direkt mit deiner Frage zu tun, aber es gibt hier ein Projekt namens ![]() ![]() Grüße, Matze |
Re: Kleines Pferdespiel
|
Re: Kleines Pferdespiel
Trotz rotem Kasten hier mal meine Antwort (weil ich mir sooo viel Mühe beim Schreiben gegeben habe ;-) ):
OK. Dafür sollte sich eigentlich das Ereignis OnKeyDown deines Formualrs eignen (Die Eigenschaft KeyPreview deiner Form sollte auf true stehen). Da kannst du dann per
Delphi-Quellcode:
überprüfen, ob es sich bei der gedrückten Taste um die Leertaste handelt. Hier solltest du dann irgendeine Boolean-Variable auf true setzen, damit du dir merken kannst, ob das Pferd gerade springt, denn soweit ich weiß wird das OnKeyDown-Ereignis mehrere Male aufgerufen, wenn die Taste gedrückt bleibt. Zusätzlich musst du in dem KeyDown-Ereignis also auch noch überprüfen, ob das Pferd gerade nicht springt, also ob die Boolean-Variable false ist. Wenn dies der Fall ist, lässt du das Pferd halt springen. Nach dem Springen-Lassen setzt du die Variable wieder auf false, damit das Pferd erneut springen kann.
if Key = VK_SPACE then TueWas;
Zusammengefasst:
Delphi-Quellcode:
mfg
var SpringtGerade : Boolean;
//im OnCreate der Form SpringtGerade := false; // beim OnKeyDown: if (Key = VK_SPACE) and not(SpringtGerade) then PferdSpingenLassen; // in PferdSpingenLassen SpringtGerade := true // Code für das Springen-Lassen SpringtGerade := false; Edit: Ein weiteres Stichwort wäre evtl. noch GetAsyncKeyState. |
Re: Kleines Pferdespiel
Vielen Dank an euch alle!
Bei meiner Frage habt ihr mir echt gut geholfen. Jetzt habe ich aber ein weiteres Problem: Mein Pferdchen ist ein Gif-Image, dass mit einem Timer auf und Abbewegt wird. Das Pferd bleibt dabei aber an der gleichen Stelle, es bewegen sich nur die Sprünge (einfache, rechteckige Images) auf das Pferd zu. Nun soll natürlich auch etwas passieren, wenn das Pferd mal gegen einen dieser Blöcke stößt. Egal ob von oben, von vorne oder von sonstwo. Daher meine Frage: Gibt es eine Möglichkeit zu sagen, dass immer eine Aktion passiert, wenn das Pferde-Image ein Sprung-Image berührt, oder muss ich einen Haufen Koordinaten aufzählen??? Ich danke schonmal für eure Antworten. Jetzt habe ich noch ein weiteres Problem: mein .gif (Pferd) hört beim 12. Sprung einfach auf, sich abzuspielen... gibt es da eine Möglichkeit, dass zu ändern?? |
Re: Kleines Pferdespiel
Bitte überseht nicht meine Frage einen Post weiter oben, aber jetzt habe ich noch ein weiteres Problem. Wie oben beschrieben bewegt sich mein Pferd nicht selber, sondern die Hindernisse bewegen sich auf mein Pferd zu. Nun habe ich das Image des Rasens, auf dem alles steh nocheinmal eingefügt, und gesagt:
procedure TForm1.Timer22Timer(Sender: TObject); --> Der Timer hat natürlich das gleiche Interval, wie die Sprünge begin Image3.Left:=Image3.Left-10; --> Der gleiche Abstand, indem auch die Sprünge bewegt werden. if image3.Left=-1025 then image3.Left:=1205; --> Das Image verlässt auf der einen Seite das Spielfeld, bis es komplett nicht mehr zu sehen end; ist und soll dann wieder zu einer Startposition zurückkehren, ander es nahtlos an das andere Image angehängt wird. Was habe ich da falsch gemacht :?: Die Images verschwinden einfach am linken Bildschirm. Meine 2. Frage wäre: Kann man irgendwie diese nervige scrollbar wegbekommen, die wenn ein sichtbares Stück ausserhalb des gezeigten Rahmens liegt angezeigt wird? Eines meiner 2 Grasstücke sitzt ja, wie oben erwähnt immer ausserhalb. Und Visible auf false zu stellen funktioniert nicht, da dann das Pferd immer über eine Weiße Fläche galloppiert. Kann man vielleicht nur Teile des Grases sichtbar machen? (Der Teil, der ausserhalb der Form ist ist unsichtbar, und nur der Teil, der innerhalb der Form ist ist sichtbar?) |
Re: Kleines Pferdespiel
Bitte benutze den Code-Tag, damit dein Quelltext lesbar bleibt.
Die Position -1025 wird wahrscheinlich nie genau erreicht, da sich das Image in 10er-Schritten bewegt.
Delphi-Quellcode:
Scrollbars lassen sich in den Optionen des Formulars abschalten.
procedure TForm1.Timer22Timer(Sender: TObject); --> Der Timer hat natürlich das gleiche Interval, wie die Sprünge
begin // --> Der gleiche Abstand, indem auch die Sprünge bewegt werden. Image3.Left := Image3.Left - 10; // --> Das Image verlässt auf der einen Seite das Spielfeld, bis es komplett nicht mehr zu sehen ist // ist und soll dann wieder zu einer Startposition zurückkehren, // an der es nahtlos an das andere Image angehängt wird. if Image3.Left <= -Image3.Width then Image3.Left := 1205; end; Eine andere Möglichkeit wäre, ein Panel auf das Formular zu legen und alle Images darauf. |
Re: Kleines Pferdespiel
Danke Blup!
Hab mir auch das Programm vor 10 Minuten nochmal durch den Kopf gehen lassen, und bin auf die gleiche Sache, wie du mit dem Gras gekommen. Aber danke für die Idee mit den scrollbars. Das werde ich mal ausprobieren. Trotzdem ist da noch das Problem mit dem Pferd, dass sich nicht mehr weiter bewegt. Kann mir da noch jemand helfen???? |
Re: Kleines Pferdespiel
Wie oft eine Gif-Animation abgespielt wird, steht in der Gif-Datei.
Viele Einstellungen lassen sich aber nachträglich ändern.
Delphi-Quellcode:
uses
// im Abschnitt "uses" hinzufügen GIFImg; // nach dem Laden des Bildes einmal ausführen z.B. im FormCreate with ImagePferd.Picture do begin if Graphic is TGIFImage then TGIFImage(Graphic).AnimateLoop := glContinously; end; |
Re: Kleines Pferdespiel
Danke Blup!
Also am Code hat er erstmal nichts zu meckern, aber dann, wenn ich starten will, sagt er: "[Fataler Fehler] Tommy.pas(7): Datei nicht gefunden: 'GIFImg.dcu'" (Das passiert bei der Eingabe im Abschnitt uses. Ich hab aber alles so eingegeben, wie beschrieben.
Delphi-Quellcode:
Hab ich was falsch gemacht? Ich meine, irgendetwas muss ja falsch sein...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, GIFImage, ExtCtrls, StdCtrls, jpeg, GIFImg; |
Re: Kleines Pferdespiel
Hast du mal versucht ohne deine GIFImg zu kompilieren, denn immerhin gibt es zumindest die unit GIFImage.
Delphi-Quellcode:
Hast du gesucht ob du irgendwo auf der Festplatte eine solche Datei hast?
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, [b]GIFImage[/b], ExtCtrls, StdCtrls, jpeg, GIFImg; Hast du die Unit mal bei Google gesucht? Immerhin bekommst du den Fehler, dass Delphi die Datei nicht finden kann. Wie wäre es damit sie sich zu beschaffen? Vielleicht kann man sich diese frei runterladen. Wenn dir Delphi schon genau sagt was los ist (Datei nicht gefunden), dann wirst du die Datei wohl einfach nicht haben, oder? ;) |
Re: Kleines Pferdespiel
Wahrscheinlich handelt es sich um eine andere Version von TGIFImage die auch einen anderen Dateinamen "GIFImage" hat.
Natürlich muss die tatsächlich verwendete Unit angegeben werden, bzw. stand bei dir schon drin. Versuchs dann so:
Delphi-Quellcode:
var
Options: TGIFDrawOptions; with ImagePferd.Picture do begin if Graphic is TGIFImage then begin Options := TGIFImage(Graphic).DrawOptions; Include(Options, goLoopContinously); TGIFImage(Graphic).DrawOptions := Options; end; end; |
Re: Kleines Pferdespiel
Vielen, vielen Dank Blup (natürlich auch den anderen, die sich die Mühe gemacht haben, mir zu helfen)!
Ich denke, dass ich bald fertig sein werde... Trotzdem gibt es noch folgende Frage von mir: Zitat:
|
Re: Kleines Pferdespiel
Hat keiner eine Idee?
Geht das nicht anders, als haufenweise Koordinaten aufzuschreiben??? |
Re: Kleines Pferdespiel
Wenn eine Liste der Hinderniss vorliegt, brauchst du nur die Rechtecke auf Überschneidung zu prüfen.
z.B. so:
Delphi-Quellcode:
Eine Kollisionsprüfung auf Pixelebene ist aber wesentlich aufwendiger.
var
Hindernisse: TObjectList; {...} Hindernisse := TObjectList.Create; Hindernisse.OwnsObjects := False; Hindernisse.Add(ImageHindernis1); {...} function IsKollision(APferdImage: TImage): Boolean; var Hinderniss: TObject; Rx, R1: TRect; begin R1 := APferdImage.BoundsRect; for i := 0 to Hindernisse.Count - 1 do begin Hinderniss := Hindernisse[i]; if Hinderniss is TImage then begin Result := IntersectRect(Rx, R1, TImage(Hinderniss).BoundsRect); if Result then Exit; end; end; Result := False; end; Die VCL ist einfach nicht für Spiele gedacht. Auf ![]() |
Re: Kleines Pferdespiel
Hi,
ich denke mal du machst es ganz einfach mit IF. [code] ... if Pferd1.left=Block1.left then begin if Pferd1.top=Block1.top then begin ... {Das Verhalten bei dem aufprall} end; end; |
Re: Kleines Pferdespiel
Zitat:
Delphi-Quellcode:
if (Pferd.Left+Pferd.Width=Block1.Left) or (Pferd.Left=Block1.Left+Block1.Width)
or (Pferd.Top+Pferd.Height=Block1.Top) then ... |
Re: Kleines Pferdespiel
Hmm, also für eine Kollisionsabfrage sollte man nicht unbedingt nur prüfen, ob sich die Ränder berühren (also '='). Denn wenn sich das Pferd in einem Rechenschritt mal um mehrere Pixel bewegt, könnte es in das Hindernis eindringen. Besser ist da imho mit Bereichen (>= bzw. <=) zu arbeiten, oder hab ich was falsch verstanden?
|
Re: Kleines Pferdespiel
Zitat:
|
Re: Kleines Pferdespiel
So, ich melde mich doch noch einmal.
In letzter Zeit hatte ich einfach keine Lust mehr, daran zu basteln. Zitat:
|
Re: Kleines Pferdespiel
TObjectList ist eine fertige Klasse die Delphi in der Unit "Contnrs" zur Verfügung stellt.
Zitat:
Erstellen in diesem Fall:
Delphi-Quellcode:
Hindernisse := TObjectList.Create;
Hindernisse.OwnsObjects := False; // da die Hindernisse vermutlich dem Formular gehören |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz