Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Koordinaten von einer Grafik (https://www.delphipraxis.net/69815-koordinaten-von-einer-grafik.html)

Z32 20. Mai 2006 13:10


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.

pacman1986 20. Mai 2006 13:17

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.

Z32 20. Mai 2006 13:23

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 ?

Der_Unwissende 20. Mai 2006 16:29

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

Z32 20. Mai 2006 17:43

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.

Der_Unwissende 21. Mai 2006 10:29

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.

Z32 21. Mai 2006 12:43

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

pacman1986 21. Mai 2006 13:17

Re: Koordinaten von einer Grafik
 
Du hast ihn Falsch Verstanden! So sollte es gehen:

Delphi-Quellcode:
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;
Es Gibt Glaub ich aber ne elegantere Lösung habse aber vergessen

Z32 21. Mai 2006 14:44

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:
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;
Vielleicht habe ich ja noch einen anderen Fehler drin, oder den Code von dem Beitrag vor mir falsch eingebaut.

pacman1986 21. Mai 2006 14:47

Re: Koordinaten von einer Grafik
 
:oops: hab ein > sttat ein kleiner gemacht

Delphi-Quellcode:
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;
so sollte es funzen

Z32 21. Mai 2006 16:54

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;

Real_Thunder 21. Mai 2006 17:13

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

Z32 21. Mai 2006 17:38

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:

Real_Thunder 21. Mai 2006 19:38

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

Z32 22. Mai 2006 18:31

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.

Real_Thunder 22. Mai 2006 21:18

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

Z32 25. Mai 2006 15:46

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:

Z32 25. Mai 2006 18:18

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:

Zur Seite

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