mp_potential_step Problem

  • GM 7

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

  • mp_potential_step Problem

    Hi,

    ich hab da zwei gößere Probleme undzwar ,
    1.lass ich meine Einheiten mit mp_potential_step zu Positionen bewegen und um zu sehen wo diese Position ist hab ich ein Objekt erstellt das solid ist und wenn dann 1-2 einheiten sich dort hinbewegen umkreisen sie das Objekt was auch gewolt ist doch wenn dann mehrere Einheiten kommen versuchen alle Einheiten sich gegenseitig aus zu weichen und bleiben stecken was solle ich dagegen tun ?(
    2.Bleiben manchmal Einheiten stecken (die ich ebenfals mit mit mp_potential_step bewege) wenn sie Materialen holen sollen in nicht soliden Objekten oder hören auf sich zu bewegen
    hier ist der code vom Step event vom Sammler:

    GML-Quellcode

    1. image_angle = direction
    2. Mat = instance_nearest(x,y,Ressource)
    3. if instance_number(Ms_Position) > 0 and distance_to_object(Mat) > 100 and res =false
    4. {
    5. mp_potential_step(Ms_Position.x,Ms_Position.y,3,false);
    6. }
    7. if distance_to_object(Mat) < 100 and res = false
    8. {
    9. mp_potential_step(Mat.x,Mat.y,3,false);
    10. }
    11. if res = true
    12. mp_potential_step(Marth.x,Marth.y,3,false);
    13. if place_meeting(x,y,Marth) and res = true
    14. {
    15. res = false
    16. Marth.Platin +=5
    17. }
    Alles anzeigen


    Ich hoffe ihr könnt mir diese Fragen beantworten
  • Versuche mal die mp_potential_step einzustellen. Dafür gibt es die funktion:

    mp_potential_settings(maxrot,rotstep,ahead,onspot) The previous function does its work using a number of parameters that can be changed using this function. Globally the method works as follows. It first tries to move straight towards the goal. It looks a number of steps ahead which can be set with the parameter ahead (default 3). Reducing this value means that the instance will start changing direction later. Increasing it means it will start changing direction earlier. If this check leads to a collision it starts looking at directions more to the left and to the right of the best direction. It does this in steps of size rotstep (default 10). Reducing this gives the instance more movement possibilities but will be slower. The parameter maxrot is a bit more difficult to explain. The instance has a current direction. maxrot (default 30) indicates how much it is allowed to change its current direction in a step. So even if it can move e.g. straight to the goal it will only do so if it does not violate this maximal change of direction. If you make maxrot large the instance can change a lot in each step. This will make it easier to find a short path but the path will be uglier. If you make the value smaller the path will be smoother but it might take longer detours (and sometimes even fail to find the goal). When no step can be made the behavior depends on the value of the parameter onspot. If onspot is true (the default value), the instance will rotate on its spot by the amount indicated with maxrot. If it is false it will not move at all. Setting it to false is useful for e.g. cars but reduces the chance of finding a path.
    Der potential step hat ein paar einstellungen, ich denke mal dass das problem mit dem hängenbleiben zu lösen ist wenn du den objekten ein bisschen mehr freiheit gibst, indem du den maxrot änderst. Der bestimmt wie eng eine kurve sein darf die dein objekt macht. Spiel einfach mal ein bisschen mit den einstellungen, dann sollte sich das problem eigentlich lösen! ;)
  • Ich konte das Prolbem nun mehr oder weniger lösen ^^ , aber ich bin mit dem Ergebnis zufrieden.Doch ich hab noch eine Frage , undzwar ist es möglich mit instance_nearest nach der nährsten Instanz zu suchen bei der die var z.b. free = true ist also so das er(mit "er" meine ich das Objekt) zu der nährsten Instanz geht wo die var frei = true ist ?(
  • Dieser Code würde nur dazu führen, dass die nächste Instanz nur dann von Bedeutung ist,
    wenn free==true. Das ist aber nicht das, was Taz will.
    Die einzigste Möglichkeit ist, alle existierenden Objekte durchzugehen:

    GML-Quellcode

    1. dis=10000000;
    2. ob=noone;
    3. for (i=0;i<instance_number(OBJEKTTYP);i+=1){
    4. ii=instance_find(OBJEKTTYP,i);
    5. if (ii.free)&&(point_distance(x,y,ii.x,ii.y)<dis){
    6. ob=ii;
    7. dis=point_distance(x,y,ii.x,ii.y);
    8. }
    9. }

    Das dürfte in etwa das Richtige sein.
    In ob ist nachher die ID des betreffenden Objektes gespeichert.
    Gruß, Spellmaker
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____