EDIT: Mein Problem wird hier gelöst -> http://www.java-forum.org/de/topic55714_2d-grafiken-auf-canvas3d.html
Hallo,
ich suche schon seit einiger Zeit nach einer Lösung zu meinem Problem. Ich möchte in meinem 3D-Spiel (bestehend aus einem Auto und einer Straße, das Auto kann sich drehen, vorwärts und rückwarts fahren. Das Auto befindet sich immer im Mittelpunkt, die Umgebung bewegt sich) ein 2D-Bild einbauen. Z.B. beim Drücken auf Escape kommt ein Spielmenü.
Ich habe den Code für diesen Zweck mal auf das minimum reduziert, damit er übersichtlicher ist.
- Imports sind weggelassen
- Umgebung auf nur das Auto(Taxi) verkleinert
- einige Variablen und Methoden habe ich zur besseren Übersicht entfernt
Danke, danke, danke, danke, danke! Ich kanns kaum erwarten, die Antwort zu hören. ^^
Finn
PS/EDIT: Es ist ja nicht so, dass das einfach mit paint(Graphics g) ginge und dann in der Maintask immer repaint(); machen, sonst hätte ich es auch schon. =|
Hallo,
ich suche schon seit einiger Zeit nach einer Lösung zu meinem Problem. Ich möchte in meinem 3D-Spiel (bestehend aus einem Auto und einer Straße, das Auto kann sich drehen, vorwärts und rückwarts fahren. Das Auto befindet sich immer im Mittelpunkt, die Umgebung bewegt sich) ein 2D-Bild einbauen. Z.B. beim Drücken auf Escape kommt ein Spielmenü.
Ich habe den Code für diesen Zweck mal auf das minimum reduziert, damit er übersichtlicher ist.
- Imports sind weggelassen
- Umgebung auf nur das Auto(Taxi) verkleinert
- einige Variablen und Methoden habe ich zur besseren Übersicht entfernt
Code:
public class TotalChaos extends JApplet implements KeyListener
{
private double sleeptime = 50.0;
private double perms = 1000/sleeptime;
private TransformGroup objTrans;
private Transform3D trans = new Transform3D();
private Transform3D scale = new Transform3D();
private Transform3D rotation = new Transform3D();
private double rot_grade;
private double x_move, z_move;
//Unwichtige Variablen für diese Beispiel entfernt
public TotalChaos()
{
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
for(i_obj = 0; i_obj<max_obj; i_obj++)
{
obj[i_obj] = new object();
objTran[i_obj] = new TransformGroup();
}
setobjAts();
c.addKeyListener(this);
addKeyListener(this);
// Create a simple scene and attach it to the virtual universe
BranchGroup scene = createSceneGraph();
SimpleUniverse u = new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
timer= new java.util.Timer();
task= new TimerTask() { public void run() { mainTask(); } };
timer.scheduleAtFixedRate(task, (long)0, (long)sleeptime);
}
public BranchGroup createSceneGraph()
{
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRoot.addChild(objTrans)
// Create a simple shape leaf node, add it to the scene graph.
ObjectFile file = new ObjectFile (ObjectFile.RESIZE);
Scene scene = null;
try
{
scene = file.load("/taxi.obj");
}
catch (FileNotFoundException e)
{
System.err.println(e);
System.exit(1);
}
catch (ParsingErrorException e)
{
System.err.println(e);
System.exit(1);
}
catch (IncorrectFormatException e)
{
System.err.println(e);
System.exit(1);
}
objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Transform3D pos1 = new Transform3D();
scale.setScale(scaler);
pos1.setTranslation(new Vector3f(0.0f, -0.5f, 0.0f));
rotation.rotY(Math.PI / (2*-1));
rotation.mul(pos1);
rotation.mul(scale);
objTrans.addChild(scene.getSceneGroup());
objTrans.setTransform(rotation);
objRoot.addChild(objTrans);
//Licht und Hintergrund: rausgeschnitten, weil unwichtig
return objRoot;
}
//KEYEVENTS: Alle rausgeschnitten, weil unwichtig
public void mainTask()
{
//Berechnung der Geschwindigkeit, Methode weggelassen
calculatespeed(speedup, speeddown);
z_move = Math.cos(rot_grade)*speedinthis;
x_move = Math.sin(rot_grade)*speedinthis;
//Bewegeung der Objekte(Straße etc): Rausgeschnitten
//Falls das Spiel gerade gestartet wurde, Methode auch rausgeschnitten
if(firstrun)
firstrun();
//Drehung der Objekte
if(rotateright && speedinkmh > 0 || rotateleft && speedinkmh < 0 )
{
rotation.rotY(Math.PI/45);
rot_grade = rot_grade + Math.PI/45;
transTotal.mul(rotation);
}
if(rotateleft && speedinkmh > 0 || rotateright && speedinkmh < 0)
{
rotation.rotY(Math.PI/(45*-1));
transTotal.mul(rotation);
rot_grade = rot_grade - Math.PI/45;
}
}
public static void main(String[] args)
{
TotalChaos TC = new TotalChaos();
TC.addKeyListener(TC);
MainFrame mf = new MainFrame(TC, 1000, 700);
}
Danke, danke, danke, danke, danke! Ich kanns kaum erwarten, die Antwort zu hören. ^^
Finn
PS/EDIT: Es ist ja nicht so, dass das einfach mit paint(Graphics g) ginge und dann in der Maintask immer repaint(); machen, sonst hätte ich es auch schon. =|