Parallax Background stockt bei Sprüngen und kurzen Bewegen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Parallax Background stockt bei Sprüngen und kurzen Bewegen

    Hi, ich habe in meinem Spiel einen 3 Backgrounds tiefen Hintergrund, bei dem sich jeder background unterschiedlich schnell mit der Spielerbewegung mitbewegt. Der Code dafür ist in einem controller objekt (code unten). Das funktioniert soweit auch, wenn der Spieler aber springt gibt es beim Höhepunkt einen kleinen Ruckler in der horizontalen Bewegung der Hintergründe. (hoch und rechts taste die ganze Zeit über gedrückt). Bei kleinen Bewegungen gibt es auch Ruckler, dann springt der Background wieder zurück in seine vorherige Position. Ich vermute, dass das etwas mit den 5 Pixeln in dem parallax script zu tun hat, weiß aber nicht wie ich das lösen kann.

    Das Create-event des parallax controller objekts:

    Quellcode

    1. parallax[10] = 0; //to initially create the array for the backgrounds. (Not really necessary)
    2. parallax[0] = background_x[0] /100; //adding the backgrounds
    3. parallax[1] = background_x[1] /100;
    4. parallax[2] = background_x[2] /100;


    Das Step-event des parallax controller objekts:

    Quellcode

    1. if(keyboard_check(vk_right) && view_xview <= view_wport[0] - 5) { //check if right is pressed and if the view has enough space to move 5 px
    2. view_xview += 5 * keyboard_check(vk_right)* global.delta; // added * global.delta to smooth out, effective?
    3. }
    4. if(keyboard_check(vk_left) && view_xview >= view_wport[0] - 5) { //check if right is pressed and if the view has enough space to move 5 px
    5. view_xview -= 5 * keyboard_check(vk_left)* global.delta; // added * global.delta to smooth out, effective?
    6. }
    7. for(var i = 0; background_visible[i]; i++) { //gets all backgrounds in the room (variable i)
    8. if( view_xview >= 0 && view_xview <= 640) {
    9. background_x[i] = parallax[i] * view_xview; //function to set the background x factor based on the view (view_xview)
    10. }
    11. }
    Alles anzeigen


    Hat jemand eine Idee wie man das ganze "smoother" machen kann?
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-
  • Hi, old school hat man das mit Delta-Time und Floats gelöst, da wurde eben pro Bild, z.B. ein
    0,021 hinzu gefügt, an Stelle von 2 Pixel pro Sekunde.
    Aber Delta-Time scheinst Du ja schon zu verwenden oder ist der Variablenname nur Zufall?
    Bei Delta ist es nur wichtig, dass Du Deinen Wert(die 5 Pixel) eben immer durch Deine Frame
    Rate teilst(z.B. 60) und dann wirklich pro Frame das Teilergebnis addierst MIT Kommastellen.

    Aber da Du Fortgeschrittener bist, versucht wahrscheinlich gerade das Ei, der Henne, etwas zu
    erklären ;)

    Miradur
  • Miradur schrieb:

    Hi, old school hat man das mit Delta-Time und Floats gelöst, da wurde eben pro Bild, z.B. ein
    0,021 hinzu gefügt, an Stelle von 2 Pixel pro Sekunde.
    Aber Delta-Time scheinst Du ja schon zu verwenden oder ist der Variablenname nur Zufall?
    Bei Delta ist es nur wichtig, dass Du Deinen Wert(die 5 Pixel) eben immer durch Deine Frame
    Rate teilst(z.B. 60) und dann wirklich pro Frame das Teilergebnis addierst MIT Kommastellen.

    Aber da Du Fortgeschrittener bist, versucht wahrscheinlich gerade das Ei, der Henne, etwas zu
    erklären ;)

    Miradur


    Sorry fürs späte antworten, ich hatte viele andere sachen zu tun..
    Deltatime verwende ich, aber dann verstehe ich nicht, wie das mit den 0,021 funktionieren soll. Mein Step-Event soll den background ja nur bewegen, wenn der player sich auch bewegt. Die backgrounds funktionieren mit den tile_x optionen im raumeditor, welche dann im script für die Geschwindigkeit sorgen.
    Link zum Tutorial, von dem ich mein System habe:
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-
  • Hi, hier ein Beispiel, dass sich rein an einen angepaßten Ablauf orientiert(es läuft daher bei 30 Frames
    langsamer als bei 60):

    Quellcode

    1. ​// Create - Event
    2. x = -30
    3. y = 100
    4. speed_ = .5
    5. frame = 0
    6. move = 0
    7. // **************************************************
    8. // Step - Event
    9. // die 1 repräsentiert eine Keyboard-Eingabe
    10. x += 1 * speed_ * delta_time * room_speed / 1000000
    11. frame = delta_time * room_speed / 1000000
    12. move = 1 * speed_ * delta_time * room_speed / 1000000
    13. if (x > 830) {
    14. x = -30
    15. }
    16. // **************************************************
    17. // Draw - Event
    18. draw_self()
    19. // **************************************************
    20. // DrawGui - Event
    21. draw_text(10,10, "Frames: " + string(frame))
    22. draw_text(10,30, "Pixel : " + string(move))
    Alles anzeigen


    Bei 60 Frames, bekommt man eine absolut gleichmäßige Bewegung hin, selbst bei den hier eingestellten
    0,5, als Geschwindigkeit.

    Miradur
  • Miradur schrieb:

    Hi, hier ein
    Bei 60 Frames, bekommt man eine absolut gleichmäßige Bewegung hin, selbst bei den hier eingestellten
    0,5, als Geschwindigkeit.
    Miradur


    Das würde ja die deltatime sinnlos machen, wenn nur die Hälfte an deltatime gebunden ist und der Rest an eine feste Framerate, oder nicht?
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-
  • TrunX schrieb:

    Wieso bewegst du den den View im controller object seperat von der Spielerposition?
    Manipulierst du die view position evtl noch ein mal im Spieler Objekt (oder über die room settings)?


    Darin könnte das Problem liegen, ja..
    Ich habe in den room settings eingestellt, dass die view dem player folgen soll (mit hbor und vbor). Das Ruckeln könnte also zB dadurch kommen, dass erst der parallax controller die view weiterbewegt, und dann aber der hbor der view auf den player das ganze wieder zurückruckeln lässt. Es gibt ja aber auch diese "zurückruckler" in den Backgrounds wenn ich die pfeiltasten nur kurz antippe..
    Im player habe ich mit views nichts programmiert, das läuft komplett über die room settings.
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-
  • Vielleicht versteh ich auch was falsch, so wie GM das macht, aber normalerweise, legst Du als
    Programmierer die Framerate fest und nicht der Computer des Nutzers.
    Daher gehe ich davon aus, dass GM, bei eingestellten 30 oder 60 Frames, immer versucht, diese
    zu erreichen, unabhängig wie schnell der PC ist.
    Als guter Programmierer muss man so und so dafür Sorge tragen, dass ein Spiel weder eine gewisse
    Framerate unterschreitet, aber auch nicht überschreitet. Wenn Dein Spiel zum Beispiel ins stocken
    kommt, mußt ja Du als Programmierer entscheiden, wie es weiter geht. Bei Single Spielen vielleicht
    nicht so wichtig, aber bei Multiplayer schon. Ich gehe daher davon aus, dass GM zumindest den
    eingestellten Wert, zu erhalten versucht und ich kümmere mich um die gleichmäßige Fortbewegung.

    Daher ist mein Ansatz ja auch nicht darauf ausgelegt, bei jedweder Framerate, ein gleichbleibendes
    Ergebnis zu liefern, sondern bei der gewünschten Framerate ein gleichmäßiges.
    Aber wenn ich damit falsch liege, dann bitte ich um Aufklärung, denn über Delta-Time und dessen
    Einsatz, kann man wahrscheinlich mehrere Bücher schreiben :)
    Ich habe auch schon gesehen, dass sich viele DT merken und dann den alten vom neuen Wert abziehen,
    aber das verstehe ich nicht, da in der Hilfe steht, DT enthält bereits die vergangene Zeit vom letzten
    Frame. Vielleicht kann sich ja mal ein Profi dazu äußern.

    Miradur
  • Jojo_13 schrieb:



    Darin könnte das Problem liegen, ja..
    Ich habe in den room settings eingestellt, dass die view dem player folgen soll (mit hbor und vbor).

    Ja, daran wird es liegen. View bewegt sich -> Background Positionen werden angepasst -> View bewegt sich erneut, diesmal ohne Parallax Effekt.
  • TrunX schrieb:

    Jojo_13 schrieb:



    Darin könnte das Problem liegen, ja..
    Ich habe in den room settings eingestellt, dass die view dem player folgen soll (mit hbor und vbor).

    Ja, daran wird es liegen. View bewegt sich -> Background Positionen werden angepasst -> View bewegt sich erneut, diesmal ohne Parallax Effekt.


    Ich hab nochmal ein bisschen rumprobiert, aber es ruckelt immer noch.. kann man das mit 2 unterschiedlichen views oder so machen und wenn ja wie?
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-
  • TrunX schrieb:

    Du könntest die verfolgung vom player via code selber umsetzen, dann hast du die volle Kontrolle darüber wann sich der view bewegt und wann du den background verschiebst.
    Sorry dass ich diesen Thread immer "wiederbelebe", ich hab grade mit Schule ziemlich viel zu tun und komm nicht zum programmieren :/

    Kannst du mir erklären wie du das machen würdest oder mir ein Tutorial zu dem System zeigen?
    Bei dem Tutorial welchem ich gefolgt bin sind die Einstellmöglichkeiten recht eingeschränkt, dafür funktioniert der parallax effekt schnell.
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-