Bug : Schuß startet manchmal aus der falschen Position
Übersicht

Omenaton_2Betreff: Bug : Schuß startet manchmal aus der falschen Position |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo !
Ich arbeite seit ca 1 Jahr gelegentlich hobby mäßig an einem 3D Weltraum RPG und seit kurz vor Weihnachten hält mich ein sehr schwer zu findender Fehler auf und mindert die Lust an diesem Projekt zu arbeiten erheblich. Es wäre schön, wenn jemand helfen könnte. Ich kann hier nicht alles genau beschreiben (es ist schon sehr umfangreich), aber ich versuche einen Einblick in das Problem zu geben, vielleicht erkennt jemand auch so schon wo das Problem liegen könnte, es gibt ja auch 1-2 Anahltspunkte. Wenn einer der langjährigen Moderatoren (wie zum Beispiel Dreamora oder TheShadow) Lust und Zeit hätten sich genauer mit dem Problem zu befassen, sie sollen sich melden (auch mit E-Mail Adresse), dann mache ich für sie das gesamte Projekt zwecks Reinschauung verfügbar. Dies mache ich aber wie gesagt nur für besonders vertrauenswürdige Personen. Jetzt zu dem Bug. Wenn das Spiel startet, sieht man sein steuerbares Raumschiff von hinten und ein wenig von oben. (Das ganze Spiel ist sehr ähnlich wie World of Warcraft aufgebaut.) Wenn man sofort einfach so ins Leere schießt, dann fliegt der Schuß nicht wie es sein sollte aus der Waffenmündung heraus, sondern etwas nach links und nach hinten verschoben. Wenn ich das Schiff nur ein wenig in eine Richtung wende und danach schieße, dann startet der Schuß richtig. Allerdings, auch bei einigen wenigen anderen Schiffsausrichtungen tritt der Fehler auf. Interessanter weise scheint der Fehler bevorzugt bei Null und 90 (-90) Grad Winkeln aufzutreten, dazwischen ist der Fehler kaum anzutreffen. Das ist schon mal ein wichtiger Anhaltspunkt. Ich habe natürlich um den Fehler einzuengen schon eine menge Debug-Informationen ausgelesen. So weiß ich (und jetzt wird es schwierig), daß am Ende der Subrutine, in der der Schuß als Objekt mit allen dazugehörigen Eigenschaften erschaffen wird, der Schuß noch an der richtigen Stelle sein müßte. (Laut koordinaten und auch wenn an den Koordinaten des Schusses eine einfach Testkugel erschaffe um die Austritt-Position genau anzuzeigen.) Sowohl Position als auch Ausrichtung ist hier nach Erschaffung also noch richtig (zu sehen ist der Schuß hier noch nicht wirklich, das kommt ja erst wenn die Hauptschleife bei Update und Render World ankommt). Anzumerken ist noch, daß der Schuß ein unabhängiges Objekt ist, es besitzt kein Parent Objekt. Ich habe eine Shot_LIFE Subrutine, in der die Schüsse (beim Test habe ich nur Einen) verwaltet werden. Hier werden sie bewegt und von hier wird auch auf eventuellen Kollisionen gechecked. Aber, schon ganz am Anfang dieser Subrutine ist die Position des neu erstellten Schusses falsch ! (Das weiß ich aus den zwecks Debug hier direkt mit Print ausgegeben Koordinaten.) Davon abgesehen gibt es keine weitere Stellen in Code, an denen ich die Schüsse als Objekte relevant manipulieren würde. Also, das unerklärliche ist es, daß am Ende der Schußerschaffungsrutine der Schuß noch richtig positioniert ist und dann gleich am Anfang der nächsten relevanten Rutine ist der Fehler schon da. Wo kann aber der Bug sich einschleichen ? Er scheint aus dem Nichts aufzutauchen. Das ist sehr rätselhaft. Noch ein kleiner Hinweis. Nach dem ich das Schiff etwas länger , auch vollständig (oder fast) gedreht habe, wird die Differenz des gewünschten Austrittspunktes zu dem tatsächlichen Austrittspunkt merklich größer. Bei -90 Grad tritt der Fehler zu 80% auf, bei 0 Grad zu 100%. Hat jemand eine Idee ? P.S.: Natürlich habe ich überall alles mögliche mit True, False von Absolute oder relativ koordinaten Angaben ausprobiert, hat aber alles nichts gebracht. Vielleicht verwedne ich aber doch irgendwo den falschen Flag, 100% sicher bin ich mir nicht. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube, ich weiß was du meinst, sowas hatte ich bei einem langzeit-herumspielerei-Projekt auch mal... Lösung war dafür das Folgende:
Code: [AUSKLAPPEN] zauber\x# = playerx#
zauber\y# = playery# zauber\z# = playerz#+1.75 * Sin(EntityPitch(p\obj)) * Cos(EntityYaw(p\obj)) Die x/y/z Startkoordianaten; zu Z wird Sinus mal Cosinus der Objektwinkel gebraucht, damit dieser Fehler nicht auftritt. Da du vermutlich in alle Richtungen schießt, den Schnippsel -glaube von Dreamora- hat mir bei dem 3D-Winkel zeug ganz gut geholfen: X = OrigX + Radius * Cos( alpha ) * Cos( beta ) Y = OrigY + Radius * Sin( beta ) Z = OrigZ + Radius * Sin( alpha ) * Cos( beta ) Wow, hab sogar entsprechendes Topic: https://www.blitzforum.de/foru...+cos#73960 |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal, Xeres, vielen Dank für die Antwort.
Ich habe noch keine Zeit gehabt das was du schreibst und verlinkst genauer anzuschauen, aber so auf den ersten Blick muß ich sagen, daß ich überrascht wäre, wenn das was mit meinem problem zu tun hätte. Ich verwende einfache Basic Befehle wie Turn, Rotate, Move Entity. Dabei sind solche Sinus Cosinus Berechnungen zu meist doch nicht nötig. So sieht aus wie ich den Schuss nach Erschaffung platziere: Code: [AUSKLAPPEN] PositionEntity EinShot\SHOT_Objekt, EntityX(MOD_PlayerShip_p01), EntityY(MOD_PlayerShip_p01) - 10, EntityZ(MOD_PlayerShip_p01) + 0;, True
PointEntity EinShot\SHOT_Objekt, PlayerShip_VisierPivot MoveEntity EinShot\SHOT_Objekt, 0, 0, 30 ;() Wenn diese Zeile auskommentiert ist, dann funktioniert es am Start richtig, aber später wird der Fehler noch auftreten VisierPivot ist dabei ein Dummy Objekt, daß ich bei Erschaffung des Spielerschiffes (als Child von Schiff) vor die Nase platziert habe. Der Schuss entsteht in dem "Bauch" des Schiffes und wird dann einfach mit Pointen auf das Visier ausgerichtet. Dann bewege ich den Schuss noch ein Stück (30 Einheiten) nach vorne, damit es nicht mehr innerhalb des Rumpfes sondern vor dem Schiff ist. Ja, es gäbe zahlreiche andere Methoden um das zu erreichen, aber die wären auch nicht besser als diese. Das funktioniert so auch, außer bei Null und -90 Grad. Interessant und unerklärlich ist noch, wie in dem Code Comment auch zu lesen ist, daß wenn ich das Moven am Ende nicht mache, der Fehler beim Starten nicht auftritt, dafür aber später nach Bewegung an anderer Stelle. Das dürfte es eigentlich nicht sein. Und noch was Wichtiges. Ich habe diese Art von Schiessen seit mehr als einem halben Jahr fertig und es hat bis Ende Dezember immer perfekt funktioniert. Ich habe an den dies betreffenden Zeilen auch nichts geändert. Trotzdem ist der Fehler wie ich beschrieben habe da. Ich habe noch alte Codes, wo das geht. Ich habe auch Vergleiche gemacht, konnte aber keine Abweichung finden, die den Fehler erklären würde. |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dieses -10 bei EntityY beim ersten PositionEntity ist mir sehr suspekt. Wozu ist das da?
Ich würde Dir ansonsten noch empfehlen den Schuss als Child vom Raumschiff zu erzeugen, dann wird die Ausrichtung und Postion gleich automatisch übernommen. Mit EntityParent(shot, 0) kannst Du das dann wieder zurücknehmen, nachdem Du den Schuss nach vorne verschoben hast. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
An BigBug :
Danke für die Antwort. -10 bei Y Koordinate setzt den Schuß etwas tiefer, da die Waffe unter der Nase des Raumschiffes befestigt ist. Mit der Höhe des Schusses gibt es aber auch keine Probleme. Das Problem ist die Verschiebung entlang der X-Achse und eventuell noch ein wenig Z. Das Blöde ist aber, (wie ich bereits schrieb) daß an dieser Stelle mit der Positionierung das Schusses so alles in Ordnung zu sein scheint, denn einerseits ließ ich hier testweise die Koordinaten ausgeben und die stimmten und ich habe auch eine kleine weiße Sphere erschaffen und damit exakt die gleichen "Dinge" angestellt, wie mit dem Schuß, also die test-Kugel wird genau dahin gesetzt, wohin der Schuss auch hinkommt und diese Test Kugel ist sichtbar immer an der richtigen Stelle. Den Schuß erst als Child von Schiff zu definieren und dadurch platzieren , später dann dieses Verhältnis aufzulösen ist kein schlechter Gedanke, ich werde es ausprobieren, aber den Bug beseitigen wird das wohl nicht. Ich muß zugeben, ich wußte bisher gar nicht, daß wenn man ein Objekt als Child von einem Anderen definiert, auch die Ausrichtung des Parents übernommen wird. Ich habe auch geschrieben, daß das Schießen so früher schon mal perfekt funktioniert hat. Ich habe schon mal den aktuellen Code mit einem Älteren verglichen, vergebens, aber ich werde das nochmal tun, vielleicht habe ich dabei was übersehen. An sonsten habe ich eine Idee, was ich wenn nichts Anderes geht versuchen könnte. Ich lade meinen alten Code wo das noch geht ein und dann kopiere ich Block für Block den neuen Code in das Alte hinein und beobachte ab wann der Bug mit dem Schuß reinkommt. das kann aber recht aufwendig sein, da ich im alten Code noch die KI nicht angefangen habe und im neuen ist davon Einiges hinzugekommen plus habe ich sonstige Optimierungen gemacht. Am Samstag kaufe ich mir einen neuen Rechner den ich dann am Wochenende erst noch einrichten muß, ich werde leider wenig Zeit haben. |
||
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe wie von BigBug empfohlen die Positionierung auch mit Parent definieren ausprobiert.
Das Komische war, daß es überhaupt eine Resultat hatte, denn eigentlich dürfte das nicht viel verändern. Das Ergebnis war aber, daß dadurch der Fehler noch verstärkt wurde. Der Schuss kam so noch sehr viel weiter seitlich (diesmal nach Rechts) verschoben raus, so, daß ich den Schuß nur als winzig kleine Grafik in der Ferne wahrnahm. Ein wichtiger Punkt bei Ganzem ist es aber, daß dieses Problem bei Null Grad und -90 fast immer auftritt und bei anderen Winkeln nicht oder extrem selten. Wenn der Schuß immer verschoben wäre, wäre das klar, aber so ist das einfach nur rätselhaft, weil meistens funktioiniert es ja wie es soll. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wo befindet sich das Visier des Schiffes?
Code: [AUSKLAPPEN] PointEntity EinShot\SHOT_Objekt, PlayerShip_VisierPivot
Sonst ist als gravierenden Fehler anzusehen, deine Massstabfestlegung. Denn wenn bereits bei Y = -10 der Schudd generiert wird, dann will ich nicht wissen wie groß dein Schiff im übrigen ist. Grad bei einem Weltraumspiel (falls es eines sein soll), werden die Variablen emens groß. Von daher müsste dein Schiff um den Faktor 100 oder 1000 erstmal verkleinert werden, um spätere Rundungsfehler zu vermeiden. Um deine Frage zu beantworten, kann ich mich nur wieder wie BIG BUG ausdrücken. Erstelle ein Schiff und als Child davon ein Pivot, welcher die Startposition der Schüsse festlegt. Wenn die Schüsse auch auf das eigene Raumschiff kollidieren, dann muss darauf geachtet werden, dass beim abfeuern keines der Schüsse mit deinem eigenem Schiff kollidieren. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
An Hectic :
Das Visier befindet sich recht weit (ich glaube sogar 200 Einheiten) vor dem Schiff und ansonsten (ich habe den Code jetzt gerade nicht vor mir, also es ist nur zu 99% sicher) auf einer Ebene mit dem Mitte des Schiffsmodells. Ich werde bald heute Abend wenn ich zu Hause bin ein Screenshot hier einfügen, damit mal das auch anschaulicht wird. Hmm..Maßstabfestlegung als gravierender Fehler. Mag sein. Ich habe bisher sehr wenig Erfahrung mit 3D Programmierung. An sowas wie du erwähnst, daß ein Raumschiff so stark verkleinert werden sollte, habe ich nicht gedacht. Das Schiff hat größen die in kleinen 1+ Bereich liegen, was auf den ersten Blick als vernünftig erscheint. Ich muß zu Hause nachgucken, wie groß das wirklich ist. Ich werde bei Gelegenheit testen, wie sich das auswirkt, wenn ich das Schiff viel kleiner skaliere. Aber ich hoffe, daß das nichts mit dem Fehler zu tun hat und ich nicht alles umskalieren muß. Ich habe nämlich schon ein Dutzend andere Objekte passend in diesen Maßstab und die Sektor Größe ist auch daran angepaßt. Die Schüsse sollten nicht auch mit dem eigenen Schiff kollidieren können, weil ich die Schüsse ja extra in der letzten Zeile mit Move um 30 Einheiten nach vorne Schiebe. (daraus kann man schon erahnen, daß mein Schiff, das ein kleiner Training Fighter ist, ca 40 Einheiten lang und minimal breiter ist). Ansonten habe ich natürlich testweise den Collision Check für die Shots ausgelassen, ich sprang diese Rutine gar nicht an, um eventuelle probleme auszuschließen. Allerdings, es wäre trotzdem möglich, daß obwohl ich nicht explicit nach Kollisionen schaue, trotzdem durch einen Fehler der Schuss mitten in Schiff entsteht und dadurch sich die Richtung durch Sliden oder was auch immer verfälscht. (Die Frage bleibt aber immer noch, wie das passieren kann, weil bei der Erschaffung ist das noch an der richtigen Stelle.) Dazu kann ich noch was sagen. Als ich mit dem Ausbau des Programmes zwecks Findung dieses Bugs aufgehört habe, habe ich bereits die niedrigste Grundlagen der Schuss und Bewegungs KI für Gegner eingebaut und dabei ist genau das passiert. Ein Gegner schießt manchmal wie er soll auf mich, aber manchmal bei bestimmten Winkeln tritt der Fehler auch bei KI Schiffen auf. Dann trifft der Gegner sich selbst oder ein anderes in der Nähe befindliches Schiff oder gar einen Testwürfel. Ich dachte Anfangs sogar, es handele sich um 2 verschiedene Fehler, aber nach Nachforschungen und Untersuchung der Fehler Umständen habe ich festgestellt, daß dies bei den KI-Schiffen nur eine andere Erscheinungsform des selben Fehlers ist, den ich beim Schießen mit meinem Spieler-Schiff habe. |
||
Omenaton_2Betreff: Screenshots |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie angekündigt zeige ich hier zur Anschaulichung paar Screenshots.
1. Bild Der Schuss startet fäschlicher Weise von einer Stelle unter dem linken Flügel. (Der Schuß ist so ein längliches, hell blaues Gebilde.) Beachte dabei die Heading (Ausrichtung) des Schiffes, zu sehen ganz oben in der Mitte, es ist null Grad. ![]() 2. Bild der Schuß startete richtig mittig und vor der Nase beginnend. Heading ist hier -1 Grad, ich habe also das Schiff an der Stelle gelassen, aber nur einen winzig kleinen Schritt nach Rechts gedreht und schon funktioniert es. ![]() 3. Bild. Eigentlich nicht so wichtig. Aber bei dem KI-gestuerten Piraten Schiff kann - wie gesagt - der Fehler auch auftreten. ![]() Jetzt nochmal schnell paar Angaben zu dem Maßstab. 1 Reales Meter entspricht bei mir 5 3D-Einheiten. Das Schiff des Spielers hat 9m (45 3D-Einheiten) Länge und 10m (50 3D-Einheiten) Spannweite. 1 Sektor (oder Zone) ist 688 x 688 Felder groß, was entspricht 17200 m, also 86000 3D-Einheiten.[/img] |
||
Omenaton_2Betreff: Problem gelöst |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mir ist es gerade gelungen, den Fehler zu finden und zu beheben. Ich mußte dafür nur 1 Zeile paar Zeilen nach unten verschieben.
Das Problem war, daß der Schuss doch mit dem eigenen Schiff kollidiert war, auch wenn ich danach gar nicht geschaut habe. Mir fehlte noch Verständnis dafür, wie Kollisionen in Blitz3D erfaßt und bewertet werden, deshalb habe ich diesen Fehler so schwer finden können. Ich habe jetzt einfach den "Trick" angewendet, daß ich den Kollisions Typ des Schusses mit EntityType erst NACH dem ich den Schuss in die richtige Position bewegt habe zuweise. So findet keine Kollision stat und das Schießen funktioniert wieder wunderbar. Jetzt gibt es aber in dieser Zusammenhang eine andere Sache, die nicht klappt und mich ärgert. Das Schießen funktioniert wie gesagt mit meiner alten, eigenen Methode, mit PosititonEntity und PointEntity. Ich wollte aber die von euch empfohlene Methode der Positionierung durch Parent Zuweisung lösen, weil mir das kürzer, sicher, eleganter erscheint. Das klappt aber nicht und ich weiß nicht was ich dabei falsch mache ! Ich habe mir folgende Methode ausgedacht : Ich erschaffe ein Pivot, als "Geister-Schuss". Ich weise diesem Pivot das Schiff als Parent zu, um das Pivot zu positionieren. Dann bewege ich dieses Pivot ein stück nach vorn, von wo aus später der Schuss rauskommen soll. (Das Pivot hat selbstverständlich keine Kollisionsangabe). Dann weise ich den echten Schuss dem Geister-Schuss Pivot als Child zu. Somit müßte mein Schuss auf ein Mal die richtige Position und Ausrichtung haben. Danach kann ich gleich wieder das Parentverhältnis lösen und den überflüssig gewordenen Geister-Schuss Pivot löschen. Code: [AUSKLAPPEN] GhostShotPivot = CreatePivot()
EntityParent GhostShotPivot, MOD_PlayerShip_p01, False MoveEntity GhostShotPivot, 0, 0, 30 EntityParent EinShot\SHOT_Objekt, GhostShotPivot, False EntityParent EinShot\SHOT_Objekt, 0, True FreeEntity GhostShotPivot EntityType EinShot\SHOT_Objekt, COLL_Shot Das funktioniert aber nicht rihctig, der Schuss fliegt weit nach Rechts verschoben raus. Was mach ich hier falsch ? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group