Frage

Ich mag ein Spiel haben, wo die Ansicht bewegen wird, wie die Maus, um den äußeren Rand des Fensters (ähnlich wie viele RTS-Spiele) erreicht. Ich habe gelesen, dass es erheblichen Aufwand bei der Mouse verwendet wird.

Gibt es vielleicht eine Möglichkeit, eine zweite transparente Komponente innerhalb des Spielfensters (JPanel) zu haben, die nicht Spiel-Spiel nicht beeinflusst, sondern wird registrieren, wenn die Maus die innere Komponente über MouseAdapter.mouseEntered () / mouseExited () verlässt?

boolean mouseOnScreen;
boolean mouseWithinInnerComponent; //is (10 <= mouse.x <= screenWidth - 10) && (10 <= mouse.y <= screenHeight)

if(mouseOnScreen && !mouseWithinInnerComponent)
{
    //do something...
}

Ich bin zu einem Verlust, wie die Bildschirmgrenze zu bestimmen, wurde, ohne überquert vier der oben genannten Komponenten in den Ecken überlappen, um eine Grenze zu bilden, um den Bildschirm, der erkennen kann, ob die Maus zu jeder Kante oder Ecke ist . Das stelle ich mir ziemlich teuer sein (mit jeder Komponente zu überprüfen, während das Spiel läuft) ...

boolean mouseOnScreen;
boolean mouseWithinTopComponent; //is (0 <= mouse.y <= 10)
boolean mouseWithinBottomComponent; //is (screenHeight - 10 <= mouse.y <= screenHeight)
boolean mouseWithinLeftComponent; //is (0 <= mouse.x <= 10)
boolean mouseWithinRightComponent; //is (screenWidth - 10 <= mouse.x <= screenWidth)

if(mouseOnScreen)
{
    if(!mouseWithinBottomComponent)
    {
        //move view up
    }
    if(!mouseWithinTopComponent)
    {
        //move view down
    }
    if(!mouseWithinLeftComponent)
    {
        //move view right
    }
    if(!mouseWithinRightComponent)
    {
        //move view left
    }
}

Genau, wie viel Aufwand existiert mit Mouse? Würde dieses oder ein ähnliches Verfahren vielleicht effizienter sein, wenn die Erfassungen nur entlang der Grenzen eines Spiels Fenster gemacht werden müssen?

. HINWEIS: Dies wird im Fenstermodus so gut wie möglich Vollbild-Anwendung verwendet werden

War es hilfreich?

Lösung

Ich habe das gleiche, was man einen MouseMotionListener verwenden, müssen umgesetzt werden. Ich bin nicht wirklich sicher, warum Sie denken, es Aufwand hinzufügen ... Wenn Sie eine hinzufügen und einfach jedes seiner Methoden fragen an die Konsole drucken (die langsam ist) und die Maus bewegen, werden Sie sehen, es ist ziemlich bissig aus der Sicht des Benutzers.

Meine Implementierung besteht aus vier Hauptelementen: a. Bildlauffenster, rechteckige Bereiche, ein Timer und ein MouseMotionListener

Als erstes habe ich eine Platte, die so genannte AutoScrollPane, die JScollPane erstreckt. Auch wenn es ein JScrollPane ist, können Sie die Bildlaufleisten verstecken. Dies ermöglicht es mir Funktionalität zu nutzen, um ein Ansichtsfenster um auf einer Karte oder ähnlich wie in einem RTS-Spiel zu bewegen, wie Sie sagen.

Zweitens für die Scroll-Regionen, ich habe eigentlich 8: n, ne, e, se, s, sw, w und nw (dh "Nord", im Nordosten“, etc.), mit den Diagonalen ermöglichen diagonal . Scrollen ich sie einfach als Rectangles implementieren Sie werden auf dem Bildschirm oder irgendetwas nicht gezeichnet -.. ich instanziiert nur 8 Rechtecke in meiner Klasse eine geeignete Größe und mit Koordinaten, die die Regionen des Fensters übereinstimmen ich mein Fenster verkleinert werden tatsächlich ermöglichen, so dass ich die Größe der Rechtecke, wenn nötig.

Drittens, ich habe einen Timer, die ein- und ausgeschaltet werden kann. Wenn es eingeschaltet ist, erzeugt jeder „Tick“ ein Runnable. Diese Runnable's Aufgabe ist das Gremium Ansichtsfenster in der entsprechenden Richtung einen gewissen Abstand zu blättern. Jeder Runnable Gabe an die Swing-Ereignis-Warteschlange.

Schließlich habe ich eine MouseMotionListener. Es ist Aufgabe ist die Maus gelangen, verlassen Sie abfangen und Ereignisse bewegen. Jedes Mal ist es ein Ereignis empfängt, überprüft er die aktuelle Mausposition und ob es schneidet eines der Rechtecke. Basierend auf dem Rechteck, wählt er eine Richtung zu bewegen. Es verfolgt, ob die Maus war in einem Scroll-Bereich auf Vorveranstaltung oder nicht. Basierend auf diesen Informationen weiß, ob es Scrollen starten sollte, stoppen Scrollen, oder lassen, was weiter geschieht. Ich wollte meine Scrollen stoppen, wenn die Maus außerhalb der Scheibe geht, wodurch die Verwendung des Ausgangs / Ereignisse eintreten. Wie auch immer, eine Rolle zu starten, speichert der Hörer die Richtung und Entfernung zum Blättern und zeigt den Timer zu starten. Wenn es Zeit ist Scrollen zu stoppen (wie, wenn die Maus eine Scroll-Bereich verlässt), sagt es den Timer zu stoppen.

Es dauerte eine Weile, die richtigen Timer Granularität zu wählen und blättert Abstand für smooth scrolling, aber es ist ziemlich gut funktioniert. Ich hoffe, dieser Umriss etwas Hilfe bereitstellt.

Andere Tipps

Ich glaube, es ist Martin Fowler, der eintrat, dass vorzeitige Optimierung ist die Wurzel aller Übel in der Softwareentwicklung ist. Warum nicht versuchen, die Mouse und denken nur über die Optimierung, wenn Sie feststellen, dass es die Leistung des Spiels beeinflusst.

Es ist nichts falsch mit einem Mouse Wenn man über den Overhead liest es war wohl eine spezifische exmaple

Alles, was Sie in einer beliebigen Programmiersprache tun können, kann getan schlecht oder falsch sein.

Wenn Sie darauf achten, was Sie in Ihrem Zuhörer tun sollte alles in Ordnung sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top