Kollisionsabfrage von Wänden außerhalb des Bildschirms

    • Kollisionsabfrage von Wänden außerhalb des Bildschirms

      Hey Leute,

      bin grad mit Husi am quatschen und uns kommt die Frage auf, ob Kollisionsabfragen von Wänden(solid Objects) die nicht auf dem Bildschirm sind an der Performance ziehen können, also ständig mitberechnet werden. Bisher habe ich lediglich animierte statische Objekte und Gegner deaktiviert wenn sie sich ein einem gewissen Bereich ausserhalb des Bildschrims befinden.

      Sollte man das mit Objekten die eine Kollisionsabfrage haben auch machen?

      Das Ding ist, dass meine Roomgröße 28800x6480 ist.... also eine Menge Walls mit Kollisionsabfragen, und die ein oder andere hat dabei auch eine präzize Kollisionsabfrage.

      lg Zhe

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

    • Also ich hab die Collisions außerhalb der view mal ignoriert und dann sind Gegner natürlich plötzlich in und durch Wände gewandert. Wenn es nicht nötig ist, dass sich alle Gegner zur selben Zeit, egal wo, gleich verhalten (also rumstehen dürfen bis sie in Sicht kommen und dann erst ihrer patroullie folgen), dann würde ich sie alle deactivieren.

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • Genau das passiert bei mir auch Aku, habs mal getestet. Ich nutze folgenden Code für Gegner und Walls zum deaktivieren.

      ///deactivate_enemys
      instance_deactivate_object(obj_enemy);
      instance_activate_region(view_xview[0]-512,view_yview[0] - 128,view_wview[0]+512,view_hview[0] +128,true);

      ///deactivate_walls
      instance_deactivate_object(obj_wall);
      instance_activate_region(view_xview[0]-1024,view_yview[0] - 512,view_wview[0]+1024,view_hview[0] +512,true);

      Wie du siehst habe ich die Werte der Walls einfach ein wenig höher gedreht, so das sie früher aktiviert werden wie die Gegner, allerdings klappt das anscheinend nicht so. Gegner die auf den Wänden laufen, hängen jetzt drin fest.

      btw: setz dir doch einen Helm auf wenn dir die Decke auf den Kopf fällt :) Die bösen Krischnowskis ^^

      €: Ich sehe aber grad das ich einen Denkfehler in den view koordinaten habe.

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

    • Hab die Koordinaten jetzt mal angepasst, so wie es richtig passen müsste, funktioniert leider aber auch nicht.

      ///deactivate_staticobjects
      instance_deactivate_object(obj_staticobject);
      instance_activate_region(view_xview[0]-128,view_yview[0] - 128,view_wview[0]+256,view_hview[0] +256,true);

      ///deactivate_walls
      instance_deactivate_object(obj_wall);
      instance_activate_region(view_xview[0]-512,view_yview[0] - 512,view_wview[0]+1024,view_hview[0] +1024,true);

      ///deactivate_enemys
      instance_deactivate_object(obj_enemy);
      instance_activate_region(view_xview[0]-32,view_yview[0] - 32,view_wview[0]+64,view_hview[0] +64,true);
    • Kann es sein das man parents nicht deaktivieren kann, oder besser das die childs nicht mit dieser funktion deaktiviert werden?

      Doch scheint zu gehen, aber irgendwas ist hier sehr seltsam:
      Mit diesem Code:

      instance_deactivate_object(obj_enemy);
      instance_activate_region(view_xview[0]-16,view_yview[0]-16,view_wview[0]+32,view_hview[0]+32,true);

      Also so wie ich es verstehe 16px nach links und 16px nach rechts, kommen trotzem die 3 gegner im grünen kreis ins bild geflogen und der im roten kreis nicht. Und das sind ja mehr wie 100px.
      Die blaue Linie ist in etwa der View bei Spielstart.
      Bilder
      • Untitled-3.png

        589,54 kB, 960×540, 46 mal angesehen

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von zhe73 ()

    • Probier mal einen kleinen Bereich in der View zu benutzen oder die View zu vergrößern und darin einen Bereich zu de/aktivieren.
      Am code selbst sehe ich nix falsches.

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • Ich bin dem Problem jetzt ein wenig mehr auf die Schliche gekommen.
      Und zwar deaktiviere ich 3 Parents: static_objects,enemys,walls

      instance_deactivate_object(obj_staticobject);
      instance_activate_region(view_xview[0]-32,view_yview[0] - 32,view_wview[0]+64,view_hview[0] +64,true);

      instance_deactivate_object(obj_enemy);
      instance_deactivate_object(obj_enemy_nofall);
      instance_activate_region(view_xview[0]-32,view_yview[0] - 32,view_wview[0]+64,view_hview[0] +64,true);

      instance_deactivate_object(obj_wall);
      instance_activate_region(view_xview[0]-1024,view_yview[0] - 1024,view_wview[0]+2048,view_hview[0] +2048,true);

      Für jedes habe ich bisher ein extra Object als Controller sozusagen. Da ich aber bei allen dreien die ganze Region wieder aktiviere, werden die Gegner natürlich auch aktiviert mit der Range der Walls.

      Wie schreibe ich das denn wenn ich nicht eine ganze Region wieder aktivieren will, sondern nur die deaktivierten Enemys,Walls,StaticObjs ?

      Die Docs haben mir da nicht so weitergeholfen, oder ich schnalle das einfach nur nicht.

      Die Funktion instace_activate_object(); gibt es ja, aber da muss ja noch der Bereich hinzu, wann sie wieder aktiviert werden.

      €: Im Bett ist es mir noch eingefallen, ein einfaches with obj..... sollte vollkommen ausreichen :)

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

    • Zu früh gefreut, dachte es würde funktionieren. Aber so falle ich nun selbst durch alle Wände durch, da sie nicht wieder aktiviert werden.

      instance_deactivate_object(obj_enemy);
      with(obj_enemy)
      {
      instance_activate_region(view_xview[0]-32,view_yview[0] - 32,view_wview[0]+64,view_hview[0] +64,true);
      }

      instance_deactivate_object(obj_staticobject);
      with(obj_staticobject)
      {
      instance_activate_region(view_xview[0]-512,view_yview[0] - 128,view_wview[0]+512,view_hview[0] +128,true);
      }

      instance_deactivate_object(obj_wall);
      with(obj_wall)
      {
      instance_activate_region(view_xview[0]-1024,view_yview[0] - 1024,view_wview[0]+2048,view_hview[0] +2048,true);
      }
    • So Problem gelöst, die Reihenfolge war der ausschlaggebende Punkt. Alles in einem Controller, richtige Reihenfolge eingehalten und es funzt.
      Die Deaktivierung des ganzen Krams hat auf meinem Rechner 250fps gebracht, yeah :)

      ///deactivate_objects

      instance_deactivate_object(obj_wall);
      instance_activate_region(view_xview[0]-128,view_yview[0]-128,view_wview[0]+256,view_hview[0]+256,true);

      instance_deactivate_object(obj_enemy);
      instance_deactivate_object(obj_staticobject);
      instance_activate_region(view_xview[0]-16,view_yview[0]-16,view_wview[0]+32,view_hview[0]+32,true);
    • Ahja, an die Reihenfolge habe ich auch erst gedacht, als ich grade deinen vorletzten Beitrag gelesen habe.

      Btw: Danke fürs Abonnieren :) das Loch wird größer

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)