![]() |
Koordinaten von einer Grafik
Hallo,
ich hätte da eine Frage: Bei einem kleinem selbstgemachten shooter [also oben ein kasten der sich sprunghaft bewegt, nicht gleichmäßig, und unten hat man ein schiff, mit dem man auf den kasten schießen soll] hab ich das Problem wie ich abfragen soll wann der Schuss auf den kasten trifft und wann nicht. Ich habe mit gedacht, ich lese einfach die Kooradinaten des Bildes aus und sagen dann: If Bildkoordinate = Kastenkoordinate then showmessage('Getroffen'); Geht das ??? Und wie kann ich die Koordinaten überhupt auslesen ??? PS: Ich habe schon oft etwas mit mousmove gehört, aber damit wir in meinem Fall das schiff bewegt. |
Re: Koordinaten von einer Grafik
wenn du nur einen punkt abfragst wäre das relativ sinnfrei. du solltest einen ganzen bereich abfragen! falls du images benutzen schau dir top, left, height und width an.
|
Re: Koordinaten von einer Grafik
Ja ich benutze dafür ein Image, aber wie frage ich den ab, wo sich der Kasten und das Feuer gerade befindet ??? Also das mit Top,left,width,height ist mir klar, aber die stelle habe ich damit ja auch noch nicht gefunden, oder liege ich da falsch ?
|
Re: Koordinaten von einer Grafik
Hi,
also es gibt jetzt zwei Möglichkeiten, du kannst warten bis irgendwer hier zufällig richtig errät, wie dein Programm aufgebaut ist oder du könntest schon etwas mehr Infos posten. Ich meine ist gar nicht so schwer, gehört zu Forenbeiträgen einfach dazu und erleichtert es einfach mal dir sinnvoll zu antworten. Du hast einen hüpfenden Kasten und ein Schiff das schießt, schön. Gibt wohl um die zig-Tausend Möglichkeiten Beides zu implementieren, also: Wie bewegst du deinen Kasten, wie dein Schiff, wie sieht dein Schuß aus? (einfach Code anhängen ist manchmal eine Idee) Mal völlig losratend denke ich, dass sich dein Schiff nur auf einer Achse horizontal bewegt (und ein TImage ist) und der Kasten ein TImage (ging ja aus meinem Vorrater hervor ;-)), der hüpft. Ist der Schuß nun eine orthogonal zur Bewegungsachse des Schiffs laufende Gerade? Dann müsstest du nur schauen, ob die x Koordinate des Schusses (der wenn ich richtig liege alles auf der y-Achse trifft) sich innerhalb der Ausdehnungen des Kastens (zwischen Left und Left + Width) befindet. Gruß Der Unwissende |
Re: Koordinaten von einer Grafik
Also...
Es tut mir ja sehr leid, wenn ich nicht genug Infos dazu geschrieben habe. Ich wusste nicht, dass ihr soviele Informationen braucht um mir zu helfen. Aber ich werde jetzt noch ein bischen zu dem Projekt schreiben. Das Projekt: Das Projekt ist ein kleiner Shooter für eine Person, es gibt ein Schiffchen das sich ganz unten auf der x-Achse mithilfe der Maus bewegen lässt. Klickt man auf die Linke Maustaste löst sich ein Schuss vorne aus dem Schiffchen und fliegt auf der y-Achse nach oben. Dann gibt es noch einen Kasten, der sich ganz oben auf der x-Achse bewegt, aber eben nicht gleichmäßig, sondern mal erscheint er da, mal da. Aber IMMER ganz oben auf der x-Achse. Die Steuerung: Das Schiffchen ist ein Image und ich steuere es mit einem Mousmove, also die Maus ist das Schiffchen und kann aber nur auf der x-Achse ganz unten bewegt werden. Das Feuer ist auch ein Image und bleibt immer genau über dem Schiffchen, wenn man auf die Linke Muastaste drückt läd das Image das Feuerbild und bewegt sich auf der y-Achse nach oben. In der Zeit wo sich der Schuss löst, bis er aus dem Bild fährt ist dei Maus gespertt, damit man den Schuss nicht lenken kann, den wie gesagt befindet sich das Feuerimage immer über dem Schiffchen. Der Kasten ist mit einem Timer gesteuert und auch ein Image. Der Timer erzeugt eine Zufalls Zahl und setzt den den Kasten neu. Die Zahl befindet sich natürlich immer unter 216, denn mein Form ist nur 216 Pixel breit. Die Frage: Wie kann ich abfragen wann das Feuerimage auf das Kastenimage trifft ??????? Also ich hoffe ich habe damit jetzt genug Infos gegeben. |
Re: Koordinaten von einer Grafik
Sehen wir mal davon ab, dass du nicht gesagt hast wie sich der Schuss bewegt, hilft es auf jeden Fall deutlich weiter. Ich gehe hier einfach mal davon aus, dass du auch den Schuss über einen Timer steuerst?
An sich musst du nur schauen, was genau einen Treffer ausmacht. Treffen kannst du den Kasten nur, wenn der Schuß die richtige X- und Y-Position hat. Soweit war es dir sicherlich eh klar. Wichtig ist jetzt wann sind die richtig? Da sich dein Kasten auf einer festen horizontalen Achse bewegt (X-Achse), ist seine verticale Position auch konstant (immer gleiche Y-Koordinate). Damit kannst du also schauen ob dein Schuss als Y-Position zwischen Kasten.Top und Kasten.Top + Kasten.Height liegt. Für die x-Position gilt jetzt im Prinzip eigentlich das gleiche. Sobald der Schuss die richtige Y-Position hat, musst du zusätzlich prüfen, ob die x-Koordinate des Strahls im Bereich von Kasten.Left und Kasten.Left + Kasten.Width liegt. Das ist alles. Machen musst du dass natürlich bei jeder Bewegung des Strahls (also die Abfrage), der Kasten kann ja auch während dessen weiter springen. |
Re: Koordinaten von einer Grafik
aha, soweit habe ich das Prinzip jetzt verstanden. Doch wie muss den jetzt diese Abfrage aussehen.
Also ich habe das so verstanden:
Delphi-Quellcode:
Aber ich glaube, dass das so nicht stimmt, bin im Thema bewegung mit Delphi noch nicht ganz so besonders gut. Könnte mir vielleicht nochmal wer darüber schauen und gucken ob ich das richtig umgesetzt habe ?
If Feuerimage = (kastenimage.top) and (kastenimage.left+kastenimage.height) then //y Position abfrage
begin If Feuerimage = (kastenimage.left) and (kastenimage.left+kastenimage.width) then showmessage('Getroffen'); //x Position Abfrage end; |
Re: Koordinaten von einer Grafik
Du hast ihn Falsch Verstanden! So sollte es gehen:
Delphi-Quellcode:
Es Gibt Glaub ich aber ne elegantere Lösung habse aber vergessen
If (Feuerimage.top < kastenimage.top) and (Feuerimage.top > kastenimage.top+kastenimage.height) //y Position abfragen
and (Feuerimage.Left > kastenimage.left) and (Feuerimage.Left > kastenimage.left+kastenimage.width) //x Position abfragen Then begin //Kollision end; |
Re: Koordinaten von einer Grafik
mhhhh...erstmal danke für das Code Beispiel.
Aber ich glaube der funst nicht. Zumindest nicht bei mir. Ich stell jetzt mal den Code von dem Timer rein, der den Schuss steuert. Zur erklärung: image2 = Feuerimage image3 = Kastenimage feuer = Variable mit Wert -5 zuruck = Variable mit Wert 1
Delphi-Quellcode:
Vielleicht habe ich ja noch einen anderen Fehler drin, oder den Code von dem Beitrag vor mir falsch eingebaut.
procedure TForm1.Timer1Timer(Sender: TObject);
begin BlockInput(true); image2.Top:=image2.Top+feuer; if (image2.top<image3.top) and(image2.top>image3.top+image2.Height) and (image2.left>image3.left) and(image2.left>image3.left+image3.width) then begin showmessage('Getroffen'); end; if image2.top<0 then begin repeat image2.Top:=image2.Top+zuruck; until image2.top=216; image2.Picture := nil; BlockInput(false); timer1.Enabled:=false; end; end; |
Re: Koordinaten von einer Grafik
:oops: hab ein > sttat ein kleiner gemacht
Delphi-Quellcode:
so sollte es funzen
If (Feuerimage.top > kastenimage.top) and (Feuerimage.top < kastenimage.top+kastenimage.height) //y Position abfragen
and (Feuerimage.Left > kastenimage.left) and (Feuerimage.Left < kastenimage.left+kastenimage.width) //x Position abfragen Then begin //Kollision end; |
Re: Koordinaten von einer Grafik
aha...jetzt gehts, aber es ist ein eigenartiges Fähnomen aufgetretten. Wenn ich treffe, erscheint die showmessage "Getroffen" immer 4 mal, also man muss 4 mal auf ok klicken. Woran kann das denn liegen ??? Irgentwie merkwürdig. Lieg das am Timer.
Hier nochmal der Code des Timers.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin BlockInput(true); image2.Top:=image2.Top+feuer; if (image2.top>image3.top) and(image2.top<image3.top+image2.Height) and (image2.left>image3.left) and(image2.left<image3.left+image3.width) then begin showmessage('Getroffen'); end; if image2.top<0 then begin repeat image2.Top:=image2.Top+zuruck; until image2.top=216; image2.Picture := nil; BlockInput(false); timer1.Enabled:=false; end; end; |
Re: Koordinaten von einer Grafik
Kann es sein das dein Baken der getroffen wird 4 pixel breit ist ?
wenn es getroffen ist, dann solltest du den schusstimer abbrechen. sonst läuft der schuß ja auch durch, also noch mal im Detail: dein Balken: y1 ############### y2 ############### y3 ############### y4 ############### also wen dein Schuß nun auf y4 trifft, zeigt er getroffen. doch der timer läuft weiter und der schuß trifft y3 und wieder getrofeen.. etc etc... |
Re: Koordinaten von einer Grafik
stimmt, das habe ich gar nicht bedacht. Also muss ich den Timer einfach abschalten, wenn getroffen wurde ???
Hört sich ja leicht an, ich habe schon gedacht, dass mein ganzes Programm voller Fehler ist :wink: |
Re: Koordinaten von einer Grafik
Keine Sorge, das wird Später noch Kompliziert genug :)
Naja wenn du noch Fragen hast, du kennst ja das Board ;) |
Re: Koordinaten von einer Grafik
Liste der Anhänge anzeigen (Anzahl: 1)
Jo stimmt, die meisten Antworten hab ich auch schon hier her (also von DP) bekommen.
Aber nochmal zu meinem Shooter. Nach längerer Zeit der benutzung ist mir aufgefallen, dass das mit der Abfrage immer noch nicht so richtig geht. Also besser gesagt mal gehts mal nicht. Wenn man startet, kommt als erstes das Fenster mit getroffen. Wenn man das Wegklickt, und schieß und trifft kommt kein Fenster. Und so geht das halt weiter. Ich finds echt komisch und glaube das das an meinem übrigen programmierten lieg, und nicht an der Procedur von "euch". Ich hab jetzt so viel eingefüg und verändert, der Code hat göaube ich seht gelitten :wink: Ich habe die Exe mal angehängt. Ihr könnt ja mal schaun was ihr davon haltet. |
Re: Koordinaten von einer Grafik
Naja den Gnazen Code schaue ich mir nicht an, ich bin nur hier um denkt ansätzte zu geben.
Ehrlich gesagt ist es mir zu viel Arbeit den gesammten Source anzusehen, denn es gibt immer viele wege etwas zu Progrmmieren, und wie es schon in einer Signatur eines Mitgliedes hier steht: Source ist wie Kunst, Hauptsache der Künstler versteht sie. also, hast du den Timer auch wieder angeschmissen ? ich gebe dir noch mal ein kleinen tipp. packe dir ein paar TEdit felder auf die frorm, irgendwo am Rand, und gebe dir werte des schusses, und des balken drauf, dann haste einen ansatz zur fehlersuche |
Re: Koordinaten von einer Grafik
Hallo nochmal, hatte in den letzten Tagen wenig Zeit zum Antworten.
mhhh, eigentlich müsste der Timer wieder eingeschaltet werden, wenn ich mich nicht ganz irre. Am Ende von dem Timer (Der Code steht ja in mehreren Beiträgen von mir) wird der Timer deaktiviert wenn das Feuerimage oben am Form angekommen ist. Aktiviert wird der Timmer wieder wenn man auf die Linke Maustaste drückt, denn da muss ja auch kontrolliert werden ob das Feuerimage mit dem Kastenimage zusammentrift. Also müsste der Timer wieder aktiviert werden, wenn es nicht schon wo anders hackt. PS: Die Datei die ich im letzten Beitrag angehängt hatte inthält nicht den Code, sonder die Exe. Die ja schon so halbwegs läuft, ich betone halbwegs :wink: |
Re: Koordinaten von einer Grafik
Soooooo, ich hab endlich geschafft, dass die Abfrage vernümpftig läuft und auch erst dann getroffen meldet, wenn die beiden Objekte zusammen getroffen sind. Also ich möchte hier nicht den Code von euch abschreiben, aber er hat bei mir halt nicht so funktioniert, wie ich es wollte.
Aufjedenfall hab ich meinen Shooter jetzt erfolgreich fertiggestellt. Falls es euch interessiert, wie die Function für das zusammentreffen aussah, müsst ihr mal hier schaun: ![]() Zuletzt möchte ich mich noch bei allen bedanken, die versucht haben mir zu helfen :hello: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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-2025 by Thomas Breitkreuz