[b3d]Genaues Zielen[Gelöst]
Übersicht

![]() |
joshmamiBetreff: [b3d]Genaues Zielen[Gelöst] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Community!
Es tut mir Leid, dass ich zum wiederholten Male in letzter Zeit mit einer Frage auftauche, aber ohne Hilfe geht es eben manchmal nicht. Ich will, dass wenn ein Schuss abgefeuert wird, automatisch das nächste Flugzeug anvisiert und getroffen wird. Ich habe einen Pivot namens Schusszieler erstellt und damit Linepick verwendet BlitzBasic: [AUSKLAPPEN]
Bei der Zeile:"MoveEntity Schusszieler,0,0,EntityDistance(Plane,Angepeilt)/120" habe ich mir gedacht, dass das Gegnerische Flugzeug sich ja auch noch fortbewegt und wollte damit gewährleisten,dass der schuss auf jeden fall trifft. 120 ist die Geschwindigkeit, mit der sich der Schuss bewegt, und indem ich den Pivot(auf den ja gezielt wird) schon gleich im voraus verschiebe, sollte der Schuss doch eigentlich treffen, oder? Stattdessen landet der Schuss irgendwo, noch weiter weg als wenn ich nur PointEntity verwendet hätte.Woran liegt das? |
||
- Zuletzt bearbeitet von joshmami am Mo, Mai 16, 2011 14:54, insgesamt 4-mal bearbeitet
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir ist nich so ganz klar wie sich dein Schuss verhalten soll, soll er in eine bestimmte Richtung geschossen werden und zum richtigen Zeitpunkt kommen, oder soll er zu einem bestimmten Zeitpunkt an die Stelle schießen, an dem dann das Flugzeug ist wenn der Schuss seine Bahn kreuzt? Letzteres ist meiner Meinung nach ziemlich schwierig, da du meines erachtens eine Differenzialgleichung bekommst, kann aber auch sein das ich mich irre ![]() Die Zeile :"MoveEntity Schusszieler,0,0,EntityDistance(Plane,Angepeilt)/120" glaube ich nicht das sie tut was du möchtest. Sie bewegt den Schuss jeweils um ein 120stel der Strecke, sprich er wird immer langsamer je geringer die Distanz noch ist. Du willst glaube ich aber, das der Schuss die Strecke in 120 Frames schaft, dann musst du beim Start die Distanz bestimmen und dann speichern und immer wieder diese verwenden und nicht jedesmal eine neue bestimmen. Dann kannst du den Pivot auch einfach auf die Flugzeugposition und dann um 120 * Geschwindigkeit verschieben. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ana hat Folgendes geschrieben: oder soll er zu einem bestimmten Zeitpunkt an die Stelle schießen, an dem dann das Flugzeug ist wenn der Schuss seine Bahn kreuzt?
Genau! Ich dachte: Wenn ich den Pivot um die Anzahl der Frames, die der Schuss im Moment brauchen würde um die Distanz zwischen Ziel und Flugzeug zu überwinden in die Richtung, in die das Flugzeug fliegt verschiebe und, wie mir gerade eben erst klar geworden ist, mit der Geschwindigkeit des Flugzeugs pro Frame multipliziere, müsste es doch eigentlich genau treffen. Tut es aber nicht.Ich habe jetzt noch die Fluggeschwindigkeit hinzugefügt und der jetzige code ist:BlitzBasic: [AUSKLAPPEN]
Übrigens wollte ich noch hinzufügen, dass das ganze nur beim Abfeuern einmalig passiert, also wird nichts langsamer. |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein tut es leider nicht, so einfach ist das nicht. Du hast hier irgendwann ein Gleichung der Art, das du sowohl Zeit, als auch Winkel benötigst, und beides nicht hast, mit nur einem Fehlenden kannst du die Gleichung lösen, mit 2en ist das schon schwieriger, aber du kannst die numerisch annähern, in dem du folgenden Algorithmus verwendest:
1. Setze Pivot eine Einheit(nicht umbedingt 1, sondern wie viel in einem Frame geschaft wird) in Flugrichtung. 2. erhöhe t um 1. 3. Überprüfe ob t * Schussgewindigkeit = Pivot/Schussstart-Distanz ist (eventuell hier eine toleranz einbauen) Falls ja: hast du die Position gefunden die du suchst Falls nein: springe zu 1 Die Toleranz sollte zumindest +/- Flugzeuggeschwindigkeit/2 sein. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe das jetzt versucht so umzusetzen, allerdings komme ich da in eine Endlosschleife.BlitzBasic: [AUSKLAPPEN] If Angepeilt Then |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Versuchs mal mit Gegner\Speed statt der 1 oder ist Gegner\Speed = 1?
Wenn das z.B 5 wäre würdest du vielleicht die Distanzen +3 und im nächsten Schritt -2 haben und dann ist es nie in dem einser Intervall. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gegner\Speed ist in dem Fall 1 | ||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
ist schusszieler der Pivot oder der Startpunkt des Schusses? | ||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
biggicekey |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie wäre es statt vorauszuberechnen wo hin geschossen werden muss, einfach ein Projektil zu machen welches sein Ziel verfolgt? Wesentlich einfacher, "gleicher" Effekt. | ||
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller Nothing more to register - you've cleaned us out![/size] |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Ana: Schusszieler ist der Pivot
@biggicekey: Aber dann würde man doch sehen, dass sich die Laufbahn des Schusses krümmt |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst aber Distanz vom Startpunkt des Schusses zum Zielpunkt des Schusses nehmen,Plane sollte da nicht drin sein, dann solltes es auch klappen, die Distanz von Plane und Schusszieler sollte ja immer fleißig wachsen. | ||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja,Plane ist ja der Startpunkt des Schusses, ich habe Plane das Flugzeug des Players genannt | ||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann würde ich als nächstes mal
BlitzBasic: [AUSKLAPPEN] Until t*120 > EntityDistance(Plane,Schusszieler) - 1 And t*120 < EntityDistance(Plane,Schusszieler) + 1 in BlitzBasic: [AUSKLAPPEN] Until t*120 > EntityDistance(Plane,Schusszieler) - 120 And t*120 < EntityDistance(Plane,Schusszieler) + 120 ändern und wenn es dann geht mit 60 was auch noch passen müsste, am besten schaust dir mal die Wert entwicklung im debuger an. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jetzt hänge ich zwar in keiner endlosschleife mehr, aber die Schüsse treffen auch nicht.Der DebugLog sagt mir nichts, ich habe mal t, t*120 und die Distanz ausgben lassen.Sieht dann meistens so aus:
Code: [AUSKLAPPEN] t: 1
Distanz: 482.96 t*120: 60 t: 2 Distanz: 482.05 t*120: 120 t: 3 Distanz: 481.141 t*120: 180 t: 4 Distanz: 480.232 t*120: 240 t: 5 Distanz: 479.323 t*120: 300 t: 6 Distanz: 478.415 t*120: 360 t: 7 Distanz: 477.507 t*120: 420 t: 8 Distanz: 476.599 t*120: 480 |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mal den Algorithmus aufgeschrieben wie ich ihn machen würde, allerdings in 2d und Bmax (Hab kein B3d auf dem Rechner), aber den Transfer solltest du denke ich gut hinbekommen
BlitzMax: [AUSKLAPPEN] SuperStrict Wirklich interessant sollte für dich nur die GetShootingPosition sein |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das mit den Vektoren verstehe ich leider nicht, aber ich habe jetzt mal versucht
die Funktion GetShootingPosition zu "übersetzen" BlitzBasic: [AUSKLAPPEN]
Wobei ich den Speed des gegnerischen Flugzeugs auch noch übergeben habe lassen. Vielen Dank das du dir die Zeit genommen hast, das zusammenzubasteln. |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das geht noch um einiges hübscher
BlitzBasic: [AUSKLAPPEN]
Dann erstellt dir deine Funktion einen Pivot an der richtigen Stelle und liefert dir seine Identität zurück. Dran denken, der muss wieder gelöscht werden, wenn dein Schuss angekommen ist. Von daher eventuell gleich in einer Funktion mit löschen und dem Schuss eine Flugzeit/Lebensdauer geben, damit er nachdem er fertig ist, gelöscht wird. Ich tu mal so als hätten wir einen Type Schuss der ein Feld Entity hat und ein Feld Lebenszeit vom typ int. BlitzBasic: [AUSKLAPPEN]
und bitte und gern geschehen |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Leider kenne ich mich mit Bmax überhaupt nicht aus ![]() die Funktion Max() nicht ersetzten, deswegen funktioniert es noch nicht. |
||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh die Funktion Max liefert den größeren der beiden Werte, wahrscheinlich kannst du auch einfach durch die Projektilgeschwindigkeit ersetzen, weil es eh schneller ist als das Flugzeug | ||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
joshmami |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genial!!
Jetzt trifft jeder einzelne Schuss!Vielen Dank! ![]() ![]() ![]() ![]() ![]() ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group