Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Kleines Pferdespiel (https://www.delphipraxis.net/145479-kleines-pferdespiel.html)

zapper54 2. Jan 2010 13:54


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.

patti 2. Jan 2010 14:00

Re: Kleines Pferdespiel
 
Und was genau ist jetzt deine Frage? :gruebel:

zapper54 2. Jan 2010 14:02

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...

fkerber 2. Jan 2010 14:03

Re: Kleines Pferdespiel
 
Hi!

Ich werfe einfach mal die Begriffe Delphi-Referenz durchsuchenOnKeyDown bzw. Delphi-Referenz durchsuchenOnKeyPress in den Raum ;)


Grüße, Frederic

Matze 2. Jan 2010 14:04

Re: Kleines Pferdespiel
 
Hallo,

es hat nichts direkt mit deiner Frage zu tun, aber es gibt hier ein Projekt namens Hier im Forum suchenAndorra und einige Tutorials dazu (in der Tutorialrubrik nach "Andorra" suchen). Das ist für 2D-SPiele hervoragend geeignet und dir wird viel Arbeit abgenommen. Evtl. wäre es einen Blick wert.

Grüße, Matze

Klaus01 2. Jan 2010 14:09

Re: Kleines Pferdespiel
 
.. und Delphi-Referenz durchsuchenKeyPreview der Form auf true setzen.

Grüße
Klaus

patti 2. Jan 2010 14:10

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:
if Key = VK_SPACE then TueWas;
ü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.

Zusammengefasst:

Delphi-Quellcode:
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;
mfg

Edit: Ein weiteres Stichwort wäre evtl. noch GetAsyncKeyState.

zapper54 3. Jan 2010 21:00

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??

zapper54 3. Jan 2010 21:56

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

Blup 4. Jan 2010 09:17

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:
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;
Scrollbars lassen sich in den Optionen des Formulars abschalten.
Eine andere Möglichkeit wäre, ein Panel auf das Formular zu legen und alle Images darauf.

zapper54 4. Jan 2010 10:40

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????

Blup 5. Jan 2010 08:29

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;

zapper54 5. Jan 2010 13:44

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:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GIFImage, ExtCtrls, StdCtrls, jpeg, GIFImg;
Hab ich was falsch gemacht? Ich meine, irgendetwas muss ja falsch sein...

Frankfurtoder 5. Jan 2010 14:51

Re: Kleines Pferdespiel
 
Hast du mal versucht ohne deine GIFImg zu kompilieren, denn immerhin gibt es zumindest die unit GIFImage.

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, [b]GIFImage[/b], ExtCtrls, StdCtrls, jpeg, GIFImg;
Hast du gesucht ob du irgendwo auf der Festplatte eine solche Datei hast?
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? ;)

Blup 5. Jan 2010 16:19

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;

zapper54 5. Jan 2010 19:55

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:

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???
Vielen Dank schon mal für eure Antworten!!!

zapper54 6. Jan 2010 13:12

Re: Kleines Pferdespiel
 
Hat keiner eine Idee?

Geht das nicht anders, als haufenweise Koordinaten aufzuschreiben???

Blup 7. Jan 2010 07:35

Re: Kleines Pferdespiel
 
Wenn eine Liste der Hinderniss vorliegt, brauchst du nur die Rechtecke auf Überschneidung zu prüfen.
z.B. so:
Delphi-Quellcode:
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;
Eine Kollisionsprüfung auf Pixelebene ist aber wesentlich aufwendiger.
Die VCL ist einfach nicht für Spiele gedacht.
Auf Hier im Forum suchenAndorra hat Matze ja bereits hingewiesen.

mb1996 7. Jan 2010 16:13

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;

implementation 7. Jan 2010 19:04

Re: Kleines Pferdespiel
 
Zitat:

Zitat von mb1996
Delphi-Quellcode:
...
if Pferd1.left=Block1.left then
begin
if Pferd1.top=Block1.top then
begin
...
{Das Verhalten bei dem aufprall}
end;
end;

Wohl eher so:
Delphi-Quellcode:
if (Pferd.Left+Pferd.Width=Block1.Left) or (Pferd.Left=Block1.Left+Block1.Width)
  or (Pferd.Top+Pferd.Height=Block1.Top) then ...

Leanahtan 7. Jan 2010 20:00

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?

zapper54 8. Jan 2010 13:06

Re: Kleines Pferdespiel
 
Zitat:

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?
Das hast du richtig verstanden. Ich wollte das auch so machen. Leider bin ich grad in meiner Schule, und wir machen grad was anderes. Ich werde aber die Möglichkeiten durchtesten. Ich sag wieder bescheid, wenn ich eine Frage habe oder alles ok ist.

zapper54 17. Jan 2010 17:06

Re: Kleines Pferdespiel
 
So, ich melde mich doch noch einmal.

In letzter Zeit hatte ich einfach keine Lust mehr, daran zu basteln.
Zitat:

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;
Das hört sich für mich ganz gut an, aber wie ist das mit der TObjektList gemeint? Wie erstellt man die?

Blup 18. Jan 2010 08:14

Re: Kleines Pferdespiel
 
TObjectList ist eine fertige Klasse die Delphi in der Unit "Contnrs" zur Verfügung stellt.
Zitat:

Zitat von Delphi-Hilfe zu 'TObjectList'
Mit TObjectList können Sie eine Liste von Objekten speichern und verwalten. ...

Bitte selbständig weiterlesen.

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 06:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz