Login
Newsletter
Werbung

So, 18. Juli 2004, 00:00

Programmieren mit Looking Glass 3D

Interaktivität

Jetzt kommen wir wieder zu einem neuen Konzept. Und zwar Interaktivität. Der Benutzer löst durch die Maus, die Tastatur usw. sogenannte Events aus. Diese werden dann über EventAdapter an Actions weitergegeben, die eine Aktion darauf ausführen.

new MouseClickedEventAdapter(closeButton,
 new ActionNoArg() {
 public void performAction(LgEventSource source) {
 changeActivity(false);
 }
 });

Wenn der Benutzer mit der Maus den closeButton anklickt, wird eine Aktion (ohne Argumente) ausgeführt. Dazu wird ein Objekt der Klasse ActionNoArg angelegt. Die Methode performAction() wird vom EventAdapter aufgerufen. Hier wird mittels changeActivity() das ganze PingPong-Objekt deaktiviert und somit beendet.

Nun schauen wir nochmal auf solche Events und Actions. Und zwar möchten wir, dass beim Bewegen der Maus über unserer Anwendung diese weniger transparent wird. Beim Verlassen soll sie transparenter werden.

TransparencyAttributes at = TableApp.getTransparencyAttributes();
new MouseEnteredEventAdapter(this,
 new ColorAlphaChangeAction(this,
 at, 0.7f, 1.0f, 500));

Dazu befragen wir unser PingPong-Objekt zuerst nach den momentanen Transparenz-Attributen. Danach installieren wir eine ColorAlphaChangeAction. Diese Klasse ist bereits in LG3D definiert, darum fällt dieser Eintrag recht schlank aus. Beachten Sie, dass sowohl für den MouseEnteredEventAdapter sowie für die ColorAlphaChangeAction this als Objekt angegeben wird. Der Event und die Action gehören also zur gesamten Anwendung, auch zum (fliegenden) Ball. :-)

Der erste Parameter des Konstruktors von ColorAlphaChangeAction ist wie gesagt this. Danach verlangt er die momentanen Transparenz-Einstellungen. Der dritte Parameter ist der Alpha-Wert, wenn der Cursor außerhalb ist. Der vierte Wert der Alpha-Wert, wenn der Cursor innerhalb ist. Als letzter Wert ist die Zeit in Millisekunden, die für den Übergang von einem Zustand in den anderen gewartet wird, anzugeben.

new MouseEnteredEventAdapter(this,
 new ActionBoolean() {
 public void performAction(LgEventSource source, boolean flag) {
 requestHighlight(flag);
 }
 });

Jetzt zur zweiten von der Cursor-Position abhängigen Aktion. MouseEnterEventAdapter verlangt (wie oben) nach einer ActionBoolean. Das heißt, dass die Aktion von einem Zustand mit zwei Werten abhängt. Weiter oben wurde ActionNoArg verwendet. Dort ist der Zustand immer der gleiche.

Ähnlich zum weiter oben liegenden Fall mit dem MouseClickedEventAdapter wird hier die performAction()-Methode verwendet. Sie hat hier einen zweiten Parameter, der uns angibt, ob die Maus innerhalb oder außerhalb unseres 3D-Objekts liegt. Abhängig davon wird requestHighlight() aufgerufen. Dies sorgt z.B. für die Markierung unseres Icons (das wir noch nicht haben) in einem Taskbar.

Wir wollen das ganze Tischtennis-Demo auch in der Landschaft verschieben. Dazu verwenden wir eine ComponentMover-Klasse. Das funktioniert überaschend einfach:

setCursor(Cursor3D.MOVE_CURSOR);
new ComponentMover(this);

Tatsächlich ist nur die Erzeugung eines ComponentMover Objekts notwendig. Davor setzen wir noch den Cursor über unserer Anwendung auf einen Verschiebe-Cursor. Der Cursor für den Schließ-Knopf bleibt aber dennoch der kleine Pfeil.

Abschließend drehen wir das ganze PingPong-Objekt um 65° um die X-Achse, damit wir den Tisch von der Seite und nicht von oben betrachten.

setRotationAxis(1.0f,0.0f,0.0f);
setRotationAngle((float)Math.toRadians(-65));

Ganz am Ende wird der top Container3D noch in die Klasse eingefügt. Bevor die Anwendung überhaupt laufen kann, ist noch ein Aufruf von setCapabilities() notwendig.

addChild(top);
setCapabilities();

Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Traut euch!
Neue Nachrichten
Werbung