Hi, ich habe im folgenden Code die "Enterprise" und mein Ziel ist es,
dass man sie mit der maus zwar drehen kann, aber nur bis zu einem bestimmtem Winkel,
135 oder -135 Grad, was mache ich falsch?
Das Problem, keine Excception, wenn man die rechte Taste drückt, funktionierts auch wie gewünscht, aber mit der linken maustaste kann man sich unendlich oft im Kreis drehen
dass man sie mit der maus zwar drehen kann, aber nur bis zu einem bestimmtem Winkel,
135 oder -135 Grad, was mache ich falsch?
Java:
package Enterprise_Astroids;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.PointArray;
import javax.media.j3d.PointAttributes;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JProgressBar;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.universe.SimpleUniverse;
@SuppressWarnings("serial")
public class Game extends JFrame implements KeyListener {
JProgressBar bar;
SimpleUniverse u;
boolean right = true;
boolean left = true;
TransformGroup Charakter;
Transform3D charakter;
Vector3f cvector;
float cx = 0;
float cz = -4;
float ry = 180;
TransformGroup View;
Transform3D view;
Vector3f vector;
float x = 0;
float z = 0;
class WindowListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
@SuppressWarnings("static-access")
public Game() {
super("Start Trek - Astroids");
this.setUndecorated(true);
Toolkit tk = null;
Dimension d = tk.getDefaultToolkit().getScreenSize();
this.setSize(d);
this.addWindowListener(new WindowListener());
JMenuBar b = new JMenuBar();
bar = new JProgressBar();
bar.setValue(50);
b.add(bar);
this.setJMenuBar(b);
GraphicsConfiguration config = SimpleUniverse
.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
canvas.addKeyListener(this);
canvas.setBounds(0, 0, d.width, d.height);
this.add(canvas);
u = new SimpleUniverse(canvas);
BranchGroup scene = createSceneGraph();
u.addBranchGraph(scene);
this.setVisible(true);
this.setLayout(null);
}
public BranchGroup createSceneGraph() {
final BranchGroup objRoot = new BranchGroup();
objRoot.addChild(new StarBoxes());
createStarBackground(objRoot);
// //////////////////// //////////////////////////
charakter = new Transform3D();
cvector = new Vector3f();
cvector.setX(cx);
cvector.setY(-0.8f);
cvector.setZ(cz);
charakter.rotY(Math.toRadians(ry));
charakter.setTranslation(cvector);
Charakter = new TransformGroup();
Charakter.setTransform(charakter);
Charakter.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Charakter.addChild(new EnterPrise(0.5f));
objRoot.addChild(Charakter);
view = new Transform3D();
vector = new Vector3f();
vector.setX(x);
vector.setY(0);
vector.setZ(z);
view.setTranslation(vector);
View = new TransformGroup();
View.setTransform(view);
View.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
View = u.getViewingPlatform().getViewPlatformTransform();
(new Thread() {
@Override
public void run() {
while (!isInterrupted()) {
// //////////////////////////////////////////////
// das Bewegen
// grundsätlich geradeaus
z = z - 0.1f;
cz = cz - 0.1f;
vector.setX(x);
vector.setZ(z);
view.setTranslation(vector);
View.setTransform(view);
cvector.setX(cx);
cvector.setZ(cz);
charakter.rotY(Math.toRadians(ry));
charakter.setTranslation(cvector);
Charakter.setTransform(charakter);
if (ry == 135) {
right = false;
} else if (ry == -135) {
left = false;
} else {
right = true;
left = true;
}
System.out.println(vector);
// //////////////////////////////////////////////
try {
sleep(10);
} catch (InterruptedException e) {
interrupt();
}
}
}
}).start();
Color3f lightColor = new Color3f(.5f, .6f, .6f);
AmbientLight ambientLight = new AmbientLight(lightColor);
ambientLight.setInfluencingBounds(new BoundingSphere(new Point3d(),
100000000000000000000000000000000000000000000.0));
objRoot.addChild(ambientLight);
DirectionalLight directionalLight = new DirectionalLight();
directionalLight.setColor(lightColor);
directionalLight.setInfluencingBounds(new BoundingSphere(new Point3d(),
100000000000000000000000000000000000000000000.0));
objRoot.addChild(directionalLight);
objRoot.compile();
return objRoot;
}
void createStarBackground(BranchGroup bg) {
java.util.Random rand = new java.util.Random();
float mag;
BranchGroup BGBranch = new BranchGroup();
Background BG = new Background();
PointArray starfield = new PointArray(15000, PointArray.COORDINATES
| PointArray.COLOR_3);
float[] point = new float[3];
float[] brightness = new float[3];
for (int i = 0; i < 15000; i++) {
point[0] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f : rand
.nextFloat();
point[1] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f : rand
.nextFloat();
point[2] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f : rand
.nextFloat();
starfield.setCoordinate(i, point);
mag = (rand.nextFloat() + 1.5f) / 1.5f;
brightness[0] = mag;
brightness[1] = mag;
brightness[2] = mag;
starfield.setColor(i, brightness);
}
Shape3D StarShape = new Shape3D(starfield);
StarShape.setAppearance(new Appearance());
StarShape.getAppearance().setPointAttributes(
new PointAttributes(1f, true));
BGBranch.addChild(StarShape);
BG.setGeometry(BGBranch);
BG.setApplicationBounds(new BoundingSphere(new Point3d(),
100000000000000000000000000000000000000000000.0));
bg.addChild(BG);
}
public void keyPressed(KeyEvent arg0) {
if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
x = x - 1;
cx = cx - 1;
vector.setX(x);
vector.setZ(z);
view.setTranslation(vector);
View.setTransform(view);
cvector.setX(cx);
cvector.setZ(cz);
if (left == true) {
ry = ry + 1;
}
charakter.rotY(Math.toRadians(ry));
charakter.setTranslation(cvector);
Charakter.setTransform(charakter);
} else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
x = x + 1;
cx = cx + 1;
vector.setX(x);
vector.setZ(z);
view.setTranslation(vector);
View.setTransform(view);
cvector.setX(cx);
cvector.setZ(cz);
if (right == true) {
ry = ry - 1;
}
charakter.rotY(Math.toRadians(ry));
charakter.setTranslation(cvector);
Charakter.setTransform(charakter);
}
}
public void keyReleased(KeyEvent arg0) {
}
public void keyTyped(KeyEvent arg0) {
}
public static void warte(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
}
Das Problem, keine Excception, wenn man die rechte Taste drückt, funktionierts auch wie gewünscht, aber mit der linken maustaste kann man sich unendlich oft im Kreis drehen