Nie ineinander stehen!?

  • Nie ineinander stehen!?

    In einem neben Projekt habe ich ein für mich etwas größeres Problem, weil
    ohne eine Lösung kann ich es in die Tonne(Papierkorb) drücken. ;D
    Es ist wie ein Rts Game wo man wenn man auf das Gebäude klickt ein Raumschiff erstellt.-Kein Problem.
    Das Raumschiff wird neben dem Gebäude erstellt.(erstelle es mit x+ random(...))
    Doch wenn ich nun ein 2 erstelle, landet es manchmal im anderen Raumschiff drin.
    Nun habe ich es probiert so zu vermeiden indem ich,
    Collision mit sich selber:

    GML-Quellcode

    1. x-=25+random(25)
    2. y-=25+random(25)

    Und im Create Event

    GML-Quellcode

    1. if !place_empty(x,y){
    2. x-=25+random(25)
    3. y-=25+random(25)}


    Doch das größte Problem ist, dass sich die Raumschiffe immer wieder berühren und weg springen und dann ne mega Kettenreaktion ensteht.
    Aber ich weiss nicht wie ich das sonst regeln soll x.X
    Ich kann sonst auch gerne die Datei hochladen.(oder Link schicken per Pm) Die Codes sind eh nichts besonderes und Grafiken !nicht benutzen!(nichts besonderes aber trotzdem) :)
    Ich möchte halt gerne das die Raumschiffe nebeneinander erstellt werden und sonst sich minmal zur Seite bewegen so das,
    die Raumschiffe nie in einander stehen.
    Vielleicht hat jemand einen Lösungsvorschlag :D
  • Wie wärs, wenn du vor dem Erstellen schon abfragst, ob sich dort ein Raumschiff befindet?!
    Gebäude:

    GML-Quellcode

    1. var xx,yy;
    2. xx=x+ random(...)
    3. yy=y+ random(...)
    4. while !place_empty(xx,yy)
    5. {
    6. xx=x+ random(...)
    7. yy=y+ random(...)
    8. }
    9. instance_create(xx,yy,raumschiff)


    so in etwa...
  • Danke Daniel :)
    Bei 4 Objecten funktionierte es ganz gut doch dann blieb das Spiel hängen.
    Habe slebst aber auch eine Lösung gefunden die einigermaßen funktioniert.

    Das Problem da simmer noch da ist, ist dass die Raumschiffe zum Punkt fliegen wo ich hinklicke
    aber sie dann die ganze Zeit um diesne Punkt fliegen und nie stehen bleiben.
    Weil andere Raumschiffe auch den Platz versperren um den Punkt zu berühren.
    Das erste Raumschiff was diesen Punkt berührt bleibt stehen. Der rest nicht.
    Ich wüsste jetzt auch keine bessere Lösung.
    Und ehrlich egsagt sieht das schon was gumm aus ;D
  • Das Problem ist, dass dann kein Platz mehr frei ist... und dann durchläuft er unendlich lange die Schleife.. Entweder gibst du eine Toleranz an, wie weit der Platz zwischen den Raumschiffen sein muss, sie sich dennoch überschneiden dürfen, oder du musst die Zufallszahl vergrößern..
    Oder irgendjemand hat eine noch bessere Lösung ^^
  • So läuft die Schleife nicht endlos.

    GML-Quellcode

    1. var xx,yy, i, tries;
    2. //Versuche
    3. tries = 10;
    4. for(i = 0; i < tries; i +=1) {
    5. if(place_empty(xx,yy)) {
    6. xx=x+ random(...)
    7. yy=y+ random(...)
    8. instance_create(xx,yy,raumschiff)
    9. break;
    10. }
    11. }
    Alles anzeigen
    On teh internet u pwn noobs - but in real life noobs own you.
  • Das mit den prüfen ob Platz frei ist bedeutet meistens viel Arbeit.

    Für das Problem ineinanderstecken beim Schiffsbau wenn es aus der Fabrik kommt zitiere einmal aus der Hilfe:
    collision_rectangle(x1,y1,x2,y2,obj,prec,notme) This function tests whether there is a collision between the (filled) rectangle with the indicated opposite corners and entities of object obj. For example, you can use this to test whether an area is free of obstacles.
    Das Rechteck sollte also so groß sein wie deine Schiff. Sollte damit funktionieren.


    Zum zweiten Problem des immer um den Kreis herumfahrens:

    Ich würde das nie mit Zufallskoordinaten lösen. Hätte da 2 Ideen:

    1. Sobald das Schiff auf ein Hindernis trifft bleibt es einfach stehen. Hier hat man nun die Entscheidungsmöglichkeit ob es den Befehl hat weiterzufahren oder für immer anzuhalten was relativ sinnlos wäre da etliche neue Befehle vom Spieler gegeben werden müssten.

    2. Einen freien Platz um den Zielpunkt herum suchen. Um den Zielpunkt herum wird in einem Kreis abgefragt (ca. alle 10 grad oder so) ob der Punkt noch frei ist. Wenn z.B. alle Schiffe aus einer Richtung kommen dann ist entgegengesetzt der dieser Richtung natürlich noch Platz nahe dem Punkt. Wenn kein freier Punkt gefunden wurde dann wird in einem größeren Radius abgefragt, solange bis der Radius der entfernung des Schiffes zum Zielpunkt entspricht.
    Ist ein Punkt gefunden wirds interessant, weil das Schiff ja nicht direkt auf den Punkt zusteuern kann. So muss also eine Alternativroute gefunden werden. Am besten wäre ein Zwischenpunkt(ziel) etwas abseits des Zielpunktes und das Schiff fährt dann von dort auf den neuen, freien und nahsten Punkt zum ehemaligen Zielpunkt.

    Soweit verstanden?
    Das wäre meine Idee wie ich soetwas umgehen würde ohne das ich jetzt Endlosschleifen produziere die unter Umständen wirklich das Spiel abstürzen lassen können. Ich habe keine Ahnung wie das in kommerziellen RTS gemacht wird aber wie gesagt meine Idee :)
  • wenn das schiff um den punkt fliegt hast du wahrscheinlich im step event sowas wie direction=point_direction(...).
    um das zu lösen würd ich einfach schreiben:

    GML-Quellcode

    1. if point_distance(x,y,targetx,targety)>=speed
    2. {
    3. direction=point_direction(x,y,targetx,targety)
    4. speed=6
    5. }
    6. else speed=0

    natürlich alles in den step event