JirkaDellOro / FUDGE_Story

A FUDGE module for the easy development of interactive stories, visual novels and simple adventure games
https://jirkadelloro.github.io/FUDGE_Story/
7 stars 9 forks source link

Ändern der Pose eines Characters ist nicht flüssig #31

Open corayana opened 2 years ago

corayana commented 2 years ago

Ich habe recht viele verschiedene Posen für meine Charactere. Um diese häufig wechseln zu können, hab ich mir folgende Funktion geschrieben:

export async function changePose(character: ƒS.CharacterDefinition, pose: string, position: ƒ.Vector2) {
    await ƒS.Character.hide(character);
    await ƒS.Character.show(character, character.pose[pose], position);
    await ƒS.update(0.2);
  };

-> zu finden hier ganz unten

Leider ist das Ändern einer Pose trotz dieser Funktion nicht konsistent. Teilweise ist die Änderung einer Pose flüssig und schön, teilweise "springt" sie, also kurz ist quasi nichts zu sehen.

Ich konnte leider nicht herausfinden, nach welchem Muster das schief geht. Deshalb kann ich auch keine garantierte Code-Stelle verlinken. Meine vage Vermutung ist, dass zuvor noch nicht genutzte Posen "neu geladen" werden müssen und für die Verzögerung sorgen könnten.

Meine Visual Novel Meine Szenen Die Intro Szene

corayana commented 2 years ago

Ich habe jetzt ausprobiert, die Posen im vorhinein einmal alle komplett (wenn vorhanden) zu laden. Mit folgender Funktion in Main.ts funktioniert der Posenwechsel nun problemlos in allen Szenen.

Object.keys(characters).forEach(characterName => {
      if (typeof characters[characterName].pose !== "undefined") {
        Object.keys(characters[characterName].pose).forEach(characterPose => {
          ƒS.Character.get(characters[characterName]).getPose(characters[characterName].pose[characterPose]);
        }
      }
    });

VSC beschwert sich jetzt mit einigen Errors wegen der types, aber es funktioniert immerhin. Keine Ahnung, ob das für die Abgabe okay ist und damit mein Issue vorerst "geklärt" wäre - eine bessere Lösung (ohne ERRORs) wäre auf jeden Fall wünschenswert. Wäre auf jeden Fall cool, wenn das initiale Laden der Posen direkt über FUDGE geschehen würde. :)

JirkaDellOro commented 2 years ago

Es ist sicher so, dass die Bilder erst geladen werden, wenn sie gebraucht werden. Es gibt noch keine Preload-Funktionalität, die hast Du jetzt gebastelt. Wir lassen den Issue einmal offen, dann können wir das bei Gelegenheit einmal übernehmen.

Was passiert eigentlich, wenn du (ohne Preload) in deinem ersten Ansatz das hide einfach weglässt?

corayana commented 2 years ago

Ohne hide werden die Posen einfach übereinander gelegt. Das sieht schnell sehr komisch aus :D

JirkaDellOro commented 2 years ago

Mach' mal so rum

export async function changePose(character: ƒS.CharacterDefinition, pose: string, position: ƒ.Vector2) {
    await ƒS.Character.show(character, character.pose[pose], position);
    await ƒS.Character.hide(character);
    await ƒS.Character.hide(character);
    await ƒS.Character.show(character, character.pose[pose], position);
    await ƒS.update(0.2);
  };
JirkaDellOro commented 2 years ago

Das ist aber nur ein Workaround. Wenn ich drüber nachdenke stellt, sich die Frage ob es überhaupt sein soll, dass ein Charakter mehrfach erscheint.

@Rina14: hatten wir uns etwas dabei gedacht?

corayana commented 2 years ago

Mach' mal so rum

export async function changePose(character: ƒS.CharacterDefinition, pose: string, position: ƒ.Vector2) {
    await ƒS.Character.show(character, character.pose[pose], position);
    await ƒS.Character.hide(character);
    await ƒS.Character.hide(character);
    await ƒS.Character.show(character, character.pose[pose], position);
    await ƒS.update(0.2);
  };

Wieso 2x hide()? Mit hide() verschwindet der ganze Character und damit auch alle Posen? Aber an sich sollte das funktionieren.

corayana commented 2 years ago

Ich habe jetzt ausprobiert, die Posen im vorhinein einmal alle komplett (wenn vorhanden) zu laden. Mit folgender Funktion in Main.ts funktioniert der Posenwechsel nun problemlos in allen Szenen.

Object.keys(characters).forEach(characterName => {
      if (typeof characters[characterName].pose !== "undefined") {
        Object.keys(characters[characterName].pose).forEach(characterPose => {
          ƒS.Character.get(characters[characterName]).getPose(characters[characterName].pose[characterPose]);
        }
      }
    });

VSC beschwert sich jetzt mit einigen Errors wegen der types, aber es funktioniert immerhin. Keine Ahnung, ob das für die Abgabe okay ist und damit mein Issue vorerst "geklärt" wäre - eine bessere Lösung (ohne ERRORs) wäre auf jeden Fall wünschenswert. Wäre auf jeden Fall cool, wenn das initiale Laden der Posen direkt über FUDGE geschehen würde. :)

Inzwischen konnte ich die type-Errors umgehen, indem ich in der Character Definition den type festgelegt habe. Ist auch nur ein Workaround aber vlt etwas performanter, alle Posen in Main am Anfang zu laden?

JirkaDellOro commented 2 years ago

Mich interessiert es schon, ob mein Workaround oben funktioniert. Zweimal hide, weil mit dem ersten show ein zweiter Charakter erscheint und beide wegmüssen.

corayana commented 2 years ago

Habs gerade ausprobiert, das funktioniert auch.

JirkaDellOro commented 2 years ago

Das ist aber nur ein Workaround. Wenn ich drüber nachdenke stellt, sich die Frage ob es überhaupt sein soll, dass ein Charakter mehrfach erscheint.

@Rina14: hatten wir uns etwas dabei gedacht?

@Rina14 : bitte mal antworten, dann könnte ich das auch anders machen, falls es keinen sinnvollen Grund gibt...

Rina14 commented 2 years ago

Das ist aber nur ein Workaround. Wenn ich drüber nachdenke stellt, sich die Frage ob es überhaupt sein soll, dass ein Charakter mehrfach erscheint. @Rina14: hatten wir uns etwas dabei gedacht?

@Rina14 : bitte mal antworten, dann könnte ich das auch anders machen, falls es keinen sinnvollen Grund gibt...

@JirkaDellOro Mit mehrfach erscheinen meinst Du jetzt schon, ein- und denselben Charakter mit selbiger Pose? Ja, ich meine, dass es im letzten Semester die Anfrage gab, ob das ginge und es war auch gewünscht.

JirkaDellOro commented 2 years ago

Das erscheint mir eher wie ein absoluter Sonderfall und dieser sollte ggf. anders gelöst sein. Mir scheint es intuitiv und erwartbar, dass

await ƒS.Character.show(character, character.pose[pose], position);

bewirkt, dass die Figur character ein andere Pose einnimmt und nicht ein Double erscheint.

JirkaDellOro commented 2 years ago

Man kann für diesen Sonderfall einen zweiten Charakter mit den gleichen Posen erschaffen, oder?