# Bewegung/Kollision von Objekten auf Tastendruck



## Franziska (4. Mai 2006)

Hallo,
ich möchte auf  ein Objekt sich auf ein anderes zubewegen und bei Kollision stoppen lassen. Hierfür soll später noch ein Kollisionsverhalten folgen.
Die Bewegung soll erst auf Tastendruck oder ähnliches starten.  Bis jetzt bewegt sich mein Objekt wie folgt:


```
PositionInterpolator posIPObject= new PositionInterpolator(objectAlpha, tgObject,movementAxis,
	                                                   -2.0f,1.0f);
	    
	    posIPObject.setSchedulingBounds(bounds);
	    posIPObject.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	 	    
	    tgObject.addChild(posIPObject);
```

Die Bewegung startet mit Beginn der Szene.

Wie kann man diese Bewegung erst auf einen Tastendruck oder ähnliches starten lassen?
Mit einem Behavior?
Müsste dies zusammen mit dem Kollisonsverhalten in einem Behavior geschehen?


----------



## Illuvatar (4. Mai 2006)

Mach einen Behavior, der auf den Tastendruck reagiert, und in dem aktivierst du dann den anderen Behavior.
Das Kollisionsverhalten wäre dann noch ein weiterer Behavior.


----------



## Franziska (4. Mai 2006)

Wie wird dann die Bewegung im Behavior realisiert? 
Auch mit dem PositionInterpolator?  Wird der dann als Child an das Objekt im Behavior gehängt?


----------



## Illuvatar (4. Mai 2006)

Den PostionInterpolator hast du doch schon realisiert, oder? Den machst du eben anfangs auf setEnable(false). Und im processStimulus von deinem eigenen Behavior setzt du das flag auf true.


----------



## Franziska (4. Mai 2006)

setEnable<- geht leider nicht. 
Die Bewegung startet zum gleichen Zeitpunkt wie vorher, man sieht sie nur nicht. Drücke ich eine Taste sehe ich mein Objekt die Bewegung zu Ende ausführen. Wenn ich mit dem Tastendruck lange warte hat das Objekt die Endposition erreicht. 
Die Bewegung soll aber erst ab tastendruck starten.


----------



## Illuvatar (4. Mai 2006)

Stimmt natürlich, da das Alpha weiterläuft. Vielleicht ist es also das sinnvollste, einfach das Alpha anzuhalten.

Da ich da selber etwas rumprobieren musste, ist dabei ein Beispiel entstanden  Kannst es anschauen, wenn du willst:

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.util.*;
import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.geometry.ColorCube;

public class StartOnKeyTest extends JFrame implements ActionListener
{
  public static final int BUTTON_PRESSED_ID = 987;
  private Behavior b;
  public StartOnKeyTest()
  {
    super ("StartOnKeyTest");
    setSize (500, 500);
    setLayout (new BorderLayout());
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo (null);  //zentrieren
    JPopupMenu.setDefaultLightWeightPopupEnabled (false);
    setCloseMenuBar (this);
    //Jetzt kommt der 3D-Teil
    Canvas3D c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());  //So am besten
    SimpleUniverse simpleU = new SimpleUniverse (c3d);  //Das VirtualUniverse, hier wird auch schon der View hinzugefügt
    BranchGroup bg = createSceneGraph();  //Haupt-BranchGroup
    bg.compile();  //Optimiert das Rendern
    simpleU.addBranchGraph (bg);  //Fügt den SceneGraph hinzu
    simpleU.getViewingPlatform().setNominalViewingTransform();  //Versetzt die Kamera so, dass man gleich etwas sehen kann
    //So einfach war das :)
    add (c3d, BorderLayout.CENTER);
    setVisible (true);
  }
  private BranchGroup createSceneGraph()
  {
    BranchGroup scene = new BranchGroup();
    TransformGroup tg = new TransformGroup();
    tg.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE);
    scene.addChild (tg);
    ColorCube cc = new ColorCube(0.4f);
    tg.addChild(cc);
    Alpha a = new Alpha (1, 5000);
    Transform3D axis = new Transform3D();
    axis.rotY(Math.PI / 2);
    Interpolator mover = new PositionInterpolator (a, tg, axis, 0, 10);
    mover.setSchedulingBounds (new BoundingSphere (new Point3d(), 1000));
    tg.addChild (mover);
    a.setStartTime (System.currentTimeMillis());
    a.pause();
    MyBehavior mb = new MyBehavior (mover);
    mb.setSchedulingBounds (new BoundingSphere (new Point3d(), 1000));
    tg.addChild (mb);
    return scene;
  }
  //Beenden-Menu
  private void setCloseMenuBar (JFrame f)
  {
    JMenuBar jmb = new JMenuBar();
    JMenu jm = new JMenu ("Datei");
    jmb.add (jm);
    JMenuItem close = new JMenuItem ("Beenden");
    jm.add (close);
    close.addActionListener (this);
    f.setJMenuBar (jmb);
  }
  public void actionPerformed (ActionEvent evt)
  {
    if ("Beenden".equals (evt.getActionCommand())){
      System.exit (0);
    }
  }
  //Startmethode
  public static void main (String[]args)
  {
    new StartOnKeyTest();
  }
}
class MyBehavior extends Behavior
{
  private WakeupCondition wc = new WakeupOnAWTEvent (AWTEvent.KEY_EVENT_MASK);
  private Interpolator b;
  public MyBehavior(Interpolator b)
  {
    this.b = b;
  }
  public void processStimulus (Enumeration criteria)
  {
    b.getAlpha().resume();
  }
  public void initialize()
  {
    wakeupOn (wc);
  }
}
```


----------



## Franziska (4. Mai 2006)

Das hilft mir weiter. Vielen Dank.


----------

