Sprites verschieben sich

  • GM 8

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

  • Sprites verschieben sich

    hallo erstmal ich bin neu hier, ich hab mir vor 3 Wochen Gm lite heruntergeladen und kenn mich mit skripten nich so gut aus.

    Also ich erstell grad mein 2. Spiel, das is ein 2d topdown Schooter. Spielprinzip: es handelt sich um große Maps auf denen feindliche Schiffe lauern, welche man mit dem eigenen Schiff und verschiedenen Waffen bekämpfen kann. Des weiteren gibt es für den Feind und den Player zusammenhängende Objekte mit den jeweiligen Sprites (die sprites haben auch entsprechende Kollisionsmasken), zb. wird man am Heck getroffen verlangsamt sich das Schiff. Als Letztes ist noch zu erwähnen das der Feind ab einer bestimmten Reichweite auf einen zufliegt, wenn er noch näher kommt fängt er an zu schießen und wenn er ganz nah ist dann stoppt er (er soll einen ja nicht rammen) schiesst aber weiter. ->das funktioniert so weit auch bestens

    soweit erst mal zur Erklärung des Spiels,

    DAS PROBLEM: wenn der Feind auf den letzten Radius Trifft (wenn er ganz nah ist) und Stoppt, dann knallen alle Kolisionsmasken auf die Unsichtbare Linie welche den innersten Radius beschreibt, andersgesagt sie schieben sich ineinander, das sieht aus wie bei nem Chrashtest gegen ne unsichtbare Mauer. Genauso verhält es sich wenn der Feind auf nen Asteroiden stösst.

    Achso und: Beim erstellen der Karte setze ich nun die Feindobjekte zusammen, so dass es wie ein zusammenhängendes Schiff aussieht, ich verwende bei jedem Feind Objekt im Step Evend volgendes Execute skript :

    image_angle=point_direction(x,y,Player.x,Player.y)
    if(distance_to_point(Player.x,Player.y)<=100)
    {speed=0}



    if(distance_to_point(Player.x,Player.y)<=500 and distance_to_point(Player.x,Player.y)>100)
    {direction=point_direction(x,y,Player.x,Player.y)
    move_towards_point(Player.x,Player.y,2)}



    if (distance_to_point(Player.x,Player.y)>505)
    {speed=0}


    hab mir gedacht das man das Problem lösen könnte indem man nur ein Feindobjekt dem Spieler folgen lässt und die anderen Feindojekte folgen dann diesem erstem Feindobjekt, oder dass das man einen zusätzlichen Code mit position Meeting einfügen könnte sodass sich die objekte wieder ausrichten, oder dass man irgentwie die Mitte des sprites die Befehle ausführen lässt also quasi so:


    if (?mitte des Sprites?)(distance_to_point(Player.x,Player.y)>505)
    {speed=0}



    oder irgenteinene andere Lösung, wie gesagt ich bin ein Anfänger und hab nur die Lite Version, bin dankbar für alle Vorschläge

    :?:

    ps. echt tolles Forum hat mir schon viel weitergeholfen
  • Sprites verschieben sich

    was ich noch vergessen hab zu sagen das Problem tritt auch beim Spieler auf und wenn der Feind den äußeren radius erreicht (also auch wieder bei speed 0) ->siehe skript ^oben^

    UND GANZ WICHTIG: hab mal probiert jedes Sprite mit der Kollisionsmaske komplett auszufüllen , dann is der Fehler weg! aber is halt dämlich so......weil dann kann ja zb. der Feind(bzw.Spieler) auch von vorn ins heck getroffen werden , weil die Kollisionsmasken sich ja dann nich mehr unterscheiden.... oder?
  • also ...
    1. verwende bitte den GML tag für codes ^^
    2. ich werd daraus grad nicht schlau ... was genau passiert da es etwas schwer zu lesen ist ... gmk wär net übel ...
    3.
    image_angle The angle with which the sprite is rotated. You specify this in degrees, counterclockwise. A value of 0
    indicates no rotation. This variable can only be set in the Pro Edition!


    also hast du nicht die light wenn du das benuzen kannst ...

    mfg
    ---- wer fehler findet darf sie behalten ---
  • danke für deine Antwort,

    ok also hier der Execute Code mit GML tag (hoffentlich hab ichs richtig gemacht):

    GML-Quellcode

    1. image_angle=point_direction(x,y,Player.x,Player.y)
    2. if(distance_to_point(Player.x,Player.y)<=100)
    3. {speed=0}
    4. if(distance_to_point(Player.x,Player.y)<=500 and distance_to_point(Player.x,Player.y)>100)
    5. {direction=point_direction(x,y,Player.x,Player.y)
    6. move_towards_point(Player.x,Player.y,2)}
    7. if (distance_to_point(Player.x,Player.y)>505)
    8. {speed=0}




    ja des is a verzwicktes Problem:

    zu erst mal, ich verwende 4 Sprites, für das Heck , die Front, beide Flügel, und die Mitte



    -Also der feindliche Jäger is auf der Map und noch weit entfernt; >er schaut nur in mei Richtung

    -ich nähere mich auf 500 Entfernung an und bleib stehen; ->er folgt mir

    -nach kurzer Zeit ereicht er die 100 Entfernung; -> er wird verschoben, genauer gesagt die sprites schieben sich zusammen

    (also die Front bleibt weitgehend gleich, aber das Heck und der Mittelteil schieben sich in die Nase und die Flügel rutschen nach vorn.



    oder anders erklärt : Alle Sprites schieben sich zusammen bis die Kollisionsmasken am 100er Radius anliegen.



    achso und wenn ma die Pro version nicht kostenlos downloaden kann dan hab ich definitiv die Light version ?(
  • das alle "teile" sich zu dem punkt bewegen ligt daran das sie sich alle zum player bewegen ... zumindest nach deinem code zu urteilen ...
    du müstest also nur die front zum player ausrichten und die anderen teiile zur front ... müste gehen ....

    ich bastel gerade an einem game wo ich ein worm brauche der auch aus einigen teilen besteht ... ich werd dir mal ein example daruas machen ... und lad es gleich hoch

    --- EDIT ---

    so ... die sprites sind nicht die originalen XD ... also nicht wundern ...
    ich habe es auch nicht weiter umgeschrieben ... das wirst du denk ich mal selber schaffen ... ist halt nur der wurm der sich auf die maus zu bewegt ...


    _worm.rar
    ---- wer fehler findet darf sie behalten ---

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Deathshadow ()

  • cool, danke voll fett, momentan begreif ich zwar erst die Hälfte, aber bin noch a blutiger Anfänger der von skripten 0 Ahnung hat
    alles so komplex mit body und so... ich muss mich da erst mal reindenken.....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Christian_S ()

  • na das body[] ist ein array ... also eine variable die ich erstellt habe um die instance id's der einzelnen körperteile zu speichern und im step event ab zu fragen ... und den namen body hat es bekommen weil es halt der körper ist ... macht es übersichtlicher ... ^^

    ps: ich hatte vergessen die abstands abfrage mit rein zu basteln ... ich habs neu hochgeladen ... nun bewegt sich der worm auf die maus zu wenn dr abstand < 500 und > 150 ist ... wenn nicht bremst er langsam ab ...
    ---- wer fehler findet darf sie behalten ---

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Deathshadow ()

  • PROBLEM GELÖST !!!

    also danke nochmal, mit deinen Spiel konnt ich zwar nix anfangen, aber als ich mir deine Formeln so angeschaut hab, is mir ne Idee gekommen es so zu machen wie du am Anfang gesagt hast:

    Ich hab des Problem jetz nähmlich ganz ganz einfach damit gelöst :

    im Step Event von EnemyFlügel, bzw. EnemyFront, bzw. EnemyHeck

    Quellcode

    1. image_angle=point_direction(x,y,Player.x,Player.y)
    2. x = Enemykörper.x
    3. y = Enemykörper.y


    somit verhalten sich die Einzelnen Objekte wie eins, und zwar ohne einfach auseinanderzufallen wie ein Chinesisches Motorrad.