Gebäude überlagerung verhindern

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

  • Gebäude überlagerung verhindern

    Also ich arbeite im Moment an diesem Projekt und hab nun folgendes Problem:

    Beim platzieren möchte ich verhindern, dass man Gebäude vor Gebäude bauen kann, deshalb hab ich das gemacht:

    Am Anfang des Spieles im Controller Object

    GML-Quellcode

    1. buildings[1] = 0;
    2. array_index = 0;


    Im des Gebäudes

    GML-Quellcode

    1. objController.array_index +=1;
    2. objController.buildings[objController.array_index]= id;
    3. ok = false;


    Zum Prüfen im :

    GML-Quellcode

    1. for(i=0; i < objController.array_index; i+=1)
    2. {
    3. if (objController.buildings[i] == id) ok = true;
    4. else
    5. {
    6. if (!place_meeting(x,y,objController.buildings[i]))
    7. {
    8. ok = true;
    9. }
    10. else {ok = false;}
    11. }
    12. }
    Alles anzeigen


    Dann wenn man bauen klickt:

    GML-Quellcode

    1. if (ok)
    2. {
    3. ok = false;
    4. build = false;
    5. placing = false;
    6. }


    Das Problem ist jetzt, dass man trotzdem übereinander bauen kann und dass wenn man das Gebäude baut auf einmal noch ein zweite Gebäude hat, obwohl ich noch gar kein zweites ausgewählt habe.
    Ich hoffe ihr könnt mir helfen :happy: (ich könnten wetten, ich überseh, was ganz einfaches. :( oder es geht viel einfacher :S)
  • Ich nehme an, das Gebäude wird gebaut, wenn du eine Taste drückst. Kuck doch mal, ob du diese Art hier nutzt:
    Ansonsten Mousebutton Pressed.

    Das Mehrfachbauen könnte auch dadurch kommen, das die Kollisionsabfrage nicht funktioniert. Vielleicht mal schauen ob alles was mit dem Bauen zu tun hat, einfach mal kann.

    Zum bauen über Gebäude hätte ich eine Frage zum platzieren:

    Erscheint eine (transparente) Maske zum bauen, die mit der Maus geführt wird?
    Oder wie sieht das bei dir aus?
    Autosignatur für:

    Danke, Sorry usw. wenn ich mal was vergesse
    ...
  • Jo, man sieht während des Platzieren das Sprite des Gebäudes halb transparent, das der Maus folgt.
    Das Bauen hab ich bereits mit Global left pressed gemacht.
    Aber nicht beim Button auf den man klickt, um das Gebäude zu kaufen :S, wenn ich es in pressed ändere ist das mit dem doppelten Gebäude schon mal weg. Thx :)

    Aber das mit dem übereinander bauen funzt immer noch nicht so ganz, es geht jetzt ab und zu nicht mehr, aber manchmal kann man dann doch übereinander bauen, wenn zwei Gebäude schon genau nebeneinander stehen, kann man das dritte genau zwischen beiden, so dass es beide überlappt, bauen.
    Ich hab auch schon precise collision checking ausgeschaltet, aber das bringt auch nur ein bisschen was, man kann immer noch teilweise übereinander bauen.
  • Kann es sein, dass nicht das Gebäude, sondern die Maus die Kollision prüft?
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ne, die Maus macht bei mir gar nichts, außer sich bewegen xD, die hat auch kein eigenes Objekt. Die Kollisionsprüfung die im ersten Post steht, befindet sich in dem Objekt des Gebäudes das man bauen will und das bewegt sich nur mit der Maus.
  • Und ist es möglich, dass du das Gebäude deshalb setzen kannst, weil du den Mausbutton drückst, wenn das Objekt noch nicht auf dem anderen ist, die Maus aber schon? (Es hinkt ja sicher etwas hinterher)
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Original von Bl@ckSp@rk
    Ich glaube dein Prüfcode stimmt nicht ganz, probier mal das hier:

    GML-Quellcode

    1. var i;
    2. ok = true;
    3. for(i=0; i < objController.array_index; i+=1)
    4. if (objController.buildings[i] != id)
    5. if (!place_meeting(x,y,objController.buildings[i])) {
    6. ok = false;
    7. break;
    8. }


    hmm...der Code funzt nicht, dann kann ich überhaupt nicht mehr bauen, nicht mal das erste Gebäude, aber trotzdem danke. Ich mach jetzt erstmal weiter, vllt komm ich ja noch drauf :) oder wenn jemand noch eine andere Idee hat, wäre ich dankbar, wenn er sie posten würde:)
  • GML-Quellcode

    1. for(i=0; i < objController.array_index; i+=1)
    2. {
    3. if (objController.buildings[i] == id) ok = true; //Ich vermute hier liegt das Problem
    4. else
    5. {
    6. if (!place_meeting(x,y,objController.buildings[i]))
    7. {
    8. ok = true;
    9. }
    10. else {ok = false;}
    11. }
    12. }
    Alles anzeigen


    Die Variable ok muss wahr sein, wenn etwas gebaut werden kann und die Maske erhällt automatisch ok, wenn diese sich selbst (von der id) findet.

    Ich würde das mal so versuchen:

    GML-Quellcode

    1. for(i=0; i < objController.array_index; i+=1)
    2. {
    3. if (!place_meeting(x,y,objController.buildings[i]))
    4. {
    5. ok = true;
    6. }
    7. else {ok = false;}
    8. }


    Du müsstest evtl. nur dafür sorgen, das dieser Script nur aufegrufen wird, wenn das Gebäude überhaupt gebaut wird.
    Autosignatur für:

    Danke, Sorry usw. wenn ich mal was vergesse
    ...
  • Bl@ckSp@rks Idee war richtig, hatte nur nen kleinen Schönheitsfehler, so muss es sein:

    GML-Quellcode

    1. var i;
    2. ok = true;
    3. for(i=0; i < objController.array_index; i+=1)
    4. if (objController.buildings[i] != id)
    5. if (place_meeting(x,y,objController.buildings[i])) {
    6. ok = false;
    7. break;
    8. }


    Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!