Ich möchte ein Energiesystem wie das Redstone-System in Minecraft implementieren.
Ich habe n Stromquellen und m Kabel. Wenn ich die Stromquelle oder ein Kabel abtrenne, sollte sich der Stromkreis ausschalten.
Wie vermeide ich Kreise? Wenn jedes Kabel mit dem Status "Ein" die in der Nähe befindlichen Kabel mit Strom versorgt, kann ich unendliche Kreise erstellen, in denen keine Stromquelle beteiligt ist (siehe Bild). Plus Seite ist, dass es in T = m läuft
Ich könnte ab jeder Stromquelle einen Stromstoß durch die Grafik senden und bei jedem Update-Aufruf jedes Kabel ausschalten. Problem ist, dass es in T = n * m läuft.
Gibt es eine bewährte Methode? In Minecraft war das Redstone-System sehr langsam, daher habe ich etwas übersehen.
BEARBEITEN: Das System sollte ohne entfernungsbasierten Zerfall funktionieren.
Antworten:
Rekursive Ausbreitung. Zum Beispiel haben Sie eine Lampe, die über N Kabelobjekte mit einer Batterie verbunden ist. Die Lampe fragt das N-te Kabel, ob es mit Strom versorgt wird (dies ist das Kabel, das direkt an die Lampe angeschlossen ist). Das N-te Kabel fragt dann das N-1-Kabel, ob es mit Strom versorgt wird und so weiter. Jedes Mal, wenn ein Objekt gefragt wird, ob es mit Strom versorgt wird oder nicht, setzt es eine
lastEvaluated
Variable auf die aktuelle Frame-Zeit. Die Rekursion endet auf einem Endknoten wie einer Batterie oder wenn sie ein Objekt erreicht, das bereits in diesem Frame ausgewertet wurde (dies vermeidet eine unendliche Rekursion). Diese Weitergaben treten nur auf, wenn sich das System ändert. Zu den Änderungen gehört das Hinzufügen / Entfernen von Teilen oder Schaltern, die umgeschaltet werden.Bei diesem System gibt es keinen Abstandsabfall oder ähnliche Einschränkungen. Ich habe es verwendet, um einen Logikgattersimulator zu erstellen, und es funktioniert für verschiedene Logikbeispiele wie ein Flip-Flop.
quelle
In Minecraft gibt es einen entfernungsbasierten Zerfall mit einer sehr kurzen Zerfallsentfernung (16 Blocks Reichweite).
Was Sie brauchen, ist ein Konnektivitätstest zwischen Grafiken .
Eine Möglichkeit wäre, wiederholt jede Kante zu nehmen und die verbundenen Knoten zu einem einzigen Knoten zu kombinieren. Nachdem alle Kanten verschwunden sind, erhalten Sie für jedes Netzwerk einen Knoten. Dann ist das Senden von Strom trivial.
quelle
Ein mit Strom versorgter Block verfügt über mehrere Eingangs- / Ausgangsanschlüsse, aber an einem Startpunkt wissen wir nicht, wann er ein- oder ausgegeben wird.
Jeder Block hat eine "Spannung", die die Energie ist, die zu ihm kommt, abzüglich des Verlusts / Verbrauchs.
Ein mit Strom versorgter Block versorgt alle umgebenden Blöcke mit Strom, und jeder Block nimmt die höhere Spannung von den umgebenden Blöcken als Eingang. Sie könnten das System auch komplizieren, indem Sie eine Intensität definieren, aber ich werde der Einfachheit halber nur bei Voltage bleiben.
Jedes Mal, wenn eine Änderung an der Schaltung durch Hinzufügen / Entfernen von Blöcken oder durch die Schaltung selbst durchgeführt wird, muss die Änderung bis zur Stabilität auf die gesamte Schaltung übertragen werden.
Ich würde Ihnen vorschlagen, eine Schnittstelle für jedes angetriebene Objekt (Cube in MC) zu entwerfen:
Angenommen, Sie implementieren addSibling und removeSibling. Der wichtigste Teil ist die Propagate-Funktion:
Als rekursive Lösung sollte jeder Block die Energie ein wenig reduzieren, niemals erhöhen. Die Stromquelle kann einen festen Wert einstellen, jedoch niemals basierend auf den Eingaben erhöhen. Das sollte kein Problem sein, da alle "echten" Systeme auf diese Weise funktionieren.
quelle