Hi again,
To MisterX: The view is following the ship and it looks like Java3d is rendering the transform of the ship first and in the next frame the view follows. How can I change this? perhaps my code makes it more clear???
To Endolf: You mean I should execute every Objecttransform in a seperate Behaviour? Please specifiy (perhaps with a little code strip
) how I should code the transform shown in my code below!!!
Here is the code of my GameTimer Thread. I’ve already coded a single-threaded version of my “game”, but the problem is still there:
//KeyEvents und so
import java.awt.event.*;
//Thread und so
import java.lang.*;
//Java3d Core
import javax.media.j3d.*;
import javax.vecmath.*;
public class GameTimer extends Thread {
//Horizontal und Vertical Speed!
private float hSpeed = 5.0f;
private float vSpeed = 5.0f;
//Position
private float x = 0.0f;
private float y = 0.0f;
private float z = 0.0f;
Vector3f position = new Vector3f(0.0f,0.0f,0.0f);
Transform3D posTrans = new Transform3D();;
//Die TransformGroup die verändert werden soll!
private TransformGroup targetTG;
//ViewPlatformposition
private float vpX = 0.0f;
private float vpY = 0.0f;
private float vpZ = 150.0f;
Vector3f vpPosition = new Vector3f(0.0f,0.0f,150.0f);
Transform3D vpPosTrans = new Transform3D();
//Die TransformGroup die verändert werden soll!
private TransformGroup vpTrans;
//Beschleunigungsmultiplikatoren für smoothed-motion!
private float multiUp = 0.0f;
private float multiDown = 0.0f;
private float multiLeft = 0.0f;
private float multiRight = 0.0f;
//Keypressed booleans
private boolean escape_isPressed = false;
private boolean upArrow_isPressed = false;
private boolean downArrow_isPressed = false;
private boolean leftArrow_isPressed = false;
private boolean rightArrow_isPressed = false;
//Constructor erhält die Transformgroup, die verändert werden soll
public GameTimer(TransformGroup targetTG, TransformGroup vpTrans) {
this.targetTG = targetTG;
this.vpTrans = vpTrans;
vpPosTrans.set(vpPosition);
posTrans.set(position);
}
//Gibt zurück, ob der Keypressedstatus auf TRUE oder FALSE gesetzt ist
public boolean getKeyIsPressed(int keyCode) {
switch(keyCode) {
case KeyEvent.VK_ESCAPE:
return escape_isPressed;
case KeyEvent.VK_UP:
return upArrow_isPressed;
case KeyEvent.VK_DOWN:
return downArrow_isPressed;
case KeyEvent.VK_LEFT:
return leftArrow_isPressed;
case KeyEvent.VK_RIGHT:
return upArrow_isPressed;
default:
return false;
}
}
//Setzt einen Keypressedstatus auf TRUE oder FALSE
public void setKeyIsPressed(int keyCode, boolean is_pressed) {
switch(keyCode) {
case KeyEvent.VK_ESCAPE:
escape_isPressed = is_pressed;
break;
case KeyEvent.VK_UP:
upArrow_isPressed = is_pressed;
break;
case KeyEvent.VK_DOWN:
downArrow_isPressed = is_pressed;
break;
case KeyEvent.VK_LEFT:
leftArrow_isPressed = is_pressed;
break;
case KeyEvent.VK_RIGHT:
rightArrow_isPressed = is_pressed;
break;
default:
break;
}
}
//setze den Horizontal Speed
public void setHorizontalSpeed(float speed) {
hSpeed = speed;
}
//setze den Vertical Speed
public void setVerticalSpeed(float speed) {
vSpeed = speed;
}
//bewege, weil Key gedrückt
private float[] turn(float multi, float speed) {
if(multi <= 1.0f) {
multi += 0.1f;
}
//gib die Änderung zurück
System.out.println(multi);
float[] f = { (multi*speed), multi };
return f;
}
//bewegung Abremsen, weil Taste released
private float[] brake(float multi, float speed) {
//Damit er nicht endlos teilt Grenze auf -0.05f;
if(multi > 0.05f) {
multi /= 1.2f;
//gib die Änderung zurück
float[] f = { (multi*speed), multi };
return f;
}
else {
float[] f = {0,0};
return f;
}
}
//BEWEGE DAS SCHIFF UND DEN VIEW
private void processPositionTransform() {
//Die Bewegungen an Java3d weitergeben!
vpTrans.setTransform(vpPosTrans);
//Der Ziel-TransformGroup die Position einspeisen ;)
targetTG.setTransform(posTrans);
/*Bewegung des Schiffs*/
//Bewege Dich nach Links
if(leftArrow_isPressed) {
float[] f = turn(multiLeft, hSpeed);
x -= f[0];
multiLeft = f[1];
//brakevorgang von rechts beenden
multiRight = 0.0f;
}
else {
float[] f = brake(multiLeft, hSpeed);
x -= f[0];
multiLeft = f[1];
}
//Bewege Dich nach Rechts
if(rightArrow_isPressed) {
float[] f = turn(multiRight, hSpeed);
x += f[0];
multiRight = f[1];
//brakevorgang von links beenden
multiLeft = 0.0f;
}
else {
float[] f = brake(multiRight, hSpeed);
x += f[0];
multiRight = f[1];
}
//Bewege Dich nach oben
if(upArrow_isPressed) {
float[] f = turn(multiUp,vSpeed);
y += f[0];
multiUp = f[1];
//brakevorgang von unten beenden
multiDown = 0.0f;
}
else {
float[] f = brake(multiUp, vSpeed);
y += f[0];
multiUp = f[1];
}
//Bewege Dich nach unten
if(downArrow_isPressed) {
float[] f = turn(multiDown, vSpeed);
y -= f[0];
multiDown = f[1];
//brakevorgang von oben beenden
multiUp = 0.0f;
}
else {
float[] f = brake(multiDown, vSpeed);
y -= f[0];
multiDown = f[1];
}
//Bewege Dich nach vorne
//KOMMT NOCH
//Bewege Dich nach hinten
//KOMMT NOCH
//Position in einen Vector umwandeln
position.x = x;
position.y = y;
position.z = z;
//Transform3D Objekt initialisieren
posTrans = new Transform3D();
//Positionsvector an das Transform3Dobjekt übergeben
posTrans.set(position);
/*Bewegung des Schiffs ENDE */
/*Bewegung der ViewPlatform */
float difX = vpX - x;
if((difX > 0.05f) || (difX < -0.05f)) {
vpX -= (difX)/3.0f;
}
float difY = vpY - y;
if((difY > 0.05f) || (difY < -0.05f)) {
vpY -= (difY)/3.0f;
}
//vpY -= ((multiDown*vSpeed)/2.0f);
vpPosition.x = vpX;
vpPosition.y = vpY;
vpPosition.z = vpZ;
vpPosTrans = new Transform3D();
vpPosTrans.set(vpPosition);
/*Bewegung der ViewPlatform ENDE */
}
private void processRotationTransform() {}//KOMMT NOCH
//Thread Main method
public void run() {
while(!escape_isPressed) {
//Anweisungen
//Beweg Dich
processPositionTransform();
//Dreh Dich
processRotationTransform();
//Versuche 1/25tel Sek zu pennen!
try {
this.sleep(40);
}
catch (InterruptedException e){}
//repaint();
}
}
}
Thank you very much for answering!!!
Greetings Juan!