Ergebnis 1 bis 8 von 8

Thema: Probleme mit "Sprite.angle"

  1. #1

    Probleme mit "Sprite.angle"

    Guten Abend.

    Ich bin in meinem Hauptprojekt letztens auf ein visuelles Problem gestoßen welches ich bisher einfach nicht zu lösen geschafft habe, beziehungsweise nichteinmal die Ursache ausmachen konnte.

    Die Sache ist diejenige, dass jedes Mal wenn ich bei irgendeinem Sprite die Funktion ".angle = " mit einem anderen Wert als "0" aufrufe der Sprite einfach unsichtbar wird.
    @some_sprite.angle = 1 # => Sprite wird unsichtbar
    @some_sprite.angle = 0 # => Sprite wird wieder sichtbar...

    Dieses Problem ist für mich vollkommen uneinsichtlich.

    Ich habe:
    1. Die Funktion in einem anderen Projekt getestet wo es funktioniert.
    2. Die Klasse "Sprite" nirgendwo verändert oder erweitert.
    3. Es mit mehreren Unterklassen der Klasse Sprite, mit der Klasse RPG::Sprite und auch mit einer Instanz der Klasse Sprite direkt versucht. Überall das gleiche Ergebnis.
    4. Ich habe alle möglichen Statuswerte des Sprites getestet, darunter:


    • .visible # true
    • .opacity # 255
    • .color # (0,0,0,0)
    • .tone # (0,0,0,0)
    • .bush_depth # 0
    • .zoom_x # 1.0
    • .zoom_y # 1.0
    • .src_rect # (0,0,16,96) Korrekt!
    • .x # 900 Korrekt!
    • .y # 256 Korrekt!
    • .z # 256 Korrekt!
    • .ox # 8 Korrekt!
    • .oy # 8 Korrekt!
    • .angle # 1.0
    • .bitmap # Korrekt!

    Ich habe den Sprite ersteinmal erstellen lassen, mit allen Werten korrekt gesetzt. Ich kann ihn sehen. Ich rufe eine Methode auf um den Winkel zu verändern und anschließend ist der Sprite unsichtbar. Danach habe ich die oben aufgeführte Liste von Statuswerten ausgeben lassen und exakt diese Ergebnisse erhalten. Alles scheint richtig gesetzt zu sein.

    Ich weis auch, dass es nicht an dem Bitmap liegt da ich mehrere Sprites mit dem selben Bitmap gleichzeitig darstellen lasse, die übrigen bleiben völlig sichtbar.

    Meine einzige Idee wäre, dass ich vielleicht irgendeinen Konstanten-Namen verwende welcher nichtverwendet werden darf. Aber ist soetwas denkbar?

    Ich bin am verzweifeln, ich weis beim besten Willen nicht was hier vorgeht und brauche dringend Hilfe.
    Ich hoffe auf baldige Antworten, vielen Dank im Vorraus!

    Geändert von Cornix (17.12.2011 um 20:14 Uhr)

  2. #2
    Nach vielen durchgehenden Testversuchen habe ich nun die Lösung des Problems erarbeiten können und möchte nun meine erschreckenden Ergebnisse veröffentlichen um alle anderen Entwickler vor diesem Problem zu warnen!

    Es scheint sich bei dem beschriebenen Verhalten tatsächlich um einen Fehler der RPG-Maker-Klassen für Sprites und Viewports zu handeln.

    Bei meiner Fehleranalyse kam ich letzten Endes zu folgendem vereinfachten Script welches den Fehler sehr eindeutig aufzeigen kann:

    Um das Verhalten einmal zu erklären:
    Ich erstelle einen Viewport und einen Sprite. Der Sprite ist dem Viewport zugeordnet.
    Der Sprite besitzt die korrekten Angaben zu Position, src_rect, Bitmap, ox,oy und allem anderen.
    Periodisch wird der Parameter "Sprite.angle" um 1 erhöht.

    Die Versuche haben ergeben, dass die Drehung korrekt funktioniert solange die ox / oy Position des Viewports nicht geändert wird!
    Setzen wir nun für den Viewport einen ox und einen oy Wert und verschieben den Sprite entsprechend zu der korrespondierenden Position so wird der Sprite unsichtbar sobald wir den Winkel beginnen zu verändern.

    Das heist das drehen eines Sprites funktioniert mit den Standardklassen für Viewports und Sprites nur solange das ox und oy des Viewports nicht verändert wird.

    Das kann sehr einfach ausgetestet werden indem ALLE Scripte in einem Projekt gelöscht werden, einschließlich Main, und durch das angegebene ersetzt werden. (* Sicherstellen, dass ein Bitmap mit Namen "a" im Ordner vorhanden ist.)
    In der derzeitigen Konfiguration wird der Sprite korrekt angezeigt und dreht sich auch.
    Entfernt man die Kommentar-Markierungen in dem Script (#) und testet erneut dann sieht man den Sprite nur einmal für einen Bruchteil einer Sekunde aufblinken und anschließend verschwindet er.

    Das ist unvorstellbar für mich wie solch ein Fehler überhaupt existieren kann.
    Ich muss nun noch daran arbeiten eine Lösung hierfür zu finden. Im schlimmsten Fall muss man wahrscheinlich anstatt den Viewport zu scrollen alle weiteren Sprites innerhalb des Viewports in entgegen gesetzte Richtung bewegen.

    Ich bin nach wie vor sehr dankbar für jeden Tipp welchen man mir zu dieser Angelegenheit geben kann.

  3. #3
    Ich hab mich bisher herausgehalten, weil ich dachte, ich hab eh keine Ahnung.
    Ich glaube es ist kein Funktionsfehler der internen Klassen, sondern eine gewollte Funktion. Dummerweise weiss ich nicht genau, wie auf Viewports ox und oy funktionieren, ich selbst verwende es nur bei Sprites und da ist es auch das einzige, wo ich den Sinn und nutzen verstanden hab. Ich hab deine hübsche Testklasse mal genommen, ox einkommentiert, aber auf 20 runtergesetzt. Mein Sprite ist sichtbar und dreht sich auch, allerdings wird stellenweise rechts in Stück abgeschnitten und geht ins Schwarze. - vermutlich genau 20 Pixel? Allerdings hab ich eine Gegenmasnahmen gefunden, die .ox oder .x des Sprites zu veränern um dagegen anzuwirken. Da müsste dir wer anders helfen.

    Allerdings vermute ich stark, dass das kein interner Fehler ist, sondern durchaus die geplante Funktionsweise der .ox-Verschiebung von Viewports ist.

    EDIT: Okay, ich hab nochmal rumgetestet. Weird verhalten wenn ich nen Sprite aufrufe und den Screen shaken lasse (ox verschiebung des map-vps). Mal wird der Sprite lange angezeigt, mal kurz, mal verschwindert er, mal nicht. TOTAL weird.
    Wenn du unbedingt bei deiner .ox verschiebung des VP bleiben willst, warum auch immer, versuch Sprites, die drehbar sind, auf einem anderen, gleichgroßen VP ohne .ox/.oy Verschiebungen. Wo auch immer du die Verschiebung für brauchst, ansonsten nimm sie halt raus.
    Vllt weiss aber auch noch wer anders anere Optionen.

    Geändert von Todu (21.12.2011 um 21:41 Uhr)

  4. #4
    Die Werte für ox und oy, also Offset-X und Offset-Y werden benutzt um auf dem Viewport zu scrollen und damit Sprites in den Bildbereich zu holen welche außerhalb der Bildschirmgrenzen liegen.
    Die Methoden sind häufig verwendet und simpel. Der Maker benutzt diese Variante um auf einer Karte das Scrolling darzustellen. Darauf kann im Grunde nicht verzichtet werden.

    Der naive Ansatz dem von mir beschriebenen Problem beizukommen wäre es komplett auf das Scrolling des Viewports zu verzichten und jede Bewegung des Bildbereiches dadurch zu simulieren indem man alle Sprites welche im Viewport liegen gleichmäßig verschiebt. Das wäre allerdings performance-technisch ein enormer Verlust.

    Das ist ganz sicher kein "Feature" sondern ein Bug der übelsten Sorte.

  5. #5
    Zitat Zitat von Cornix Beitrag anzeigen
    Die Methoden sind häufig verwendet und simpel. Der Maker benutzt diese Variante um auf einer Karte das Scrolling darzustellen. Darauf kann im Grunde nicht verzichtet werden.
    Mein Wissen darüber inkl. einer schnellen Ctrl/Shift/F-Überprüfung sagen mir: Nein. Der Maker nutzt ox-Verschiebung auf einem VIEWPORT nur für Screenshake. Ausser ich überseh etwas internes. Beim Scrolling wird nur auf einer Tilemap verschoben.

    Zitat Zitat
    Das ist ganz sicher kein "Feature" sondern ein Bug der übelsten Sorte.
    Ich bleib dabei, dass das so geplant ist, und du das Problem evtl. falsch angehst. Dummerweise wüsste ich nicht, wie man es richtig anehen soll -.-. Aber irgendwer weiss das bestimmt.

  6. #6
    Todu, es gibt extrem viele Bugs in der RGSS. Es würde mich wundern wenn das jetzt plötzlich ein geistreiches Feature wäre =(

  7. #7
    Das scrolling nicht mit dem Viewport zu realisieren würde doch bedeuten die Positionen aller Sprites auf dem Viewport bei jeder Scroll-Bewegung zu verschieben. Das wäre ja eine Unmenge mehr an Operationen die dafür notwendig wäre.

  8. #8
    Ich weiß leider nicht genau wie sich der Viewport auf ox und oy eines Sprites auswirkt, allerdings sind ox und oy für rotationen extrem wichtig.
    Das setzen von angle bewirkt nämlich nicht, dass das Sprite um den Mittelpunkt des Bitmaps rotiert wird, sondern um ox und oy. Sind ox und oy bei width / 2 respektive height / 2 dreht sich das Sprite einfach. Sind ox und oy 0 rotiert das Sprite um die linke obere Ecke.
    Wenn durch die Interaktion mit dem Viewport nun ox und oy irgendwie beeinflusst werden kann das einfach bedeuten, dass bei einer Rotation um ox und oy das Bitmap so rotiert, dass es selbst bei geringen .angle Veränderungen außerhalb des darstellbaren Bereiches liegt.

    Edit: Ich habe versucht deinen Fehlerfall nachzustellen. Das ist mir jedoch nicht gelungen. Sprich: Es hat alles einwandfrei funktioniert, auch mit Viewport. Und selbst als ich dein Beispiel 1:1 nachgebaut habe, hat alles Funktioniert. Mit welcher Version arbeitest du? Kann sein, dass der Bug vielleicht behoben wurde?

    Geändert von The_Burrito (26.12.2011 um 08:45 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •