Hallo Forengemeinde,
ich habe leider ein mittelschweres Problem. Ich habe einen Pongspiel geschrieben, dass auf Java3D basiert, es ist grafisch soweit fertig, nur es hat noch keinerlei Funktionalität.
Ich habe Schwierigkeiten dabei Funktionen für die Balken und den Ball zu implementieren, ich hoffe einer von euch kann mir helfen, dass Spiel zum laufen zu bringen! Vielen Dank schonmal im Vorraus!
Den Quellcode findet ihr hier:
[HIGHLIGHT="Java"]
import java.awt.Button;
import java.awt.Panel;
import java.awt.event.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.swing.Timer;
public class PingPong3D extends JFrame{
public Canvas3D Spiel3D;
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE);
//Variabeln die für die Positionsinterpolation benötigt werden!
private final float maxLeftRight = 0.95f;
private final long todotime = 4000;
private int startingTime = 3000;
private Button start = new Button("Start");
public PingPong3D(){
//Mechanismus zum Schliessen des Fensters und beenden des Programms
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Spiel3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
SimpleUniverse simpleUniverse = new SimpleUniverse(Spiel3D);
simpleUniverse.getViewingPlatform().setNominalViewingTransform();
//Die Szene wird in dieser Methode erzeugt
createSceneGraph(simpleUniverse);
Panel panel = new Panel();
panel.add(start);
add("North", panel);
//Hinzufügen von Licht
addLight(simpleUniverse);
setTitle("PingPong3D");
setSize(800, 300);
getContentPane().add("Center", Spiel3D);
setVisible(true);
}
public void createSceneGraph(SimpleUniverse simpleUniverse){
//Erzeugen eines weissen Hintergrundes
Background bg = new Background(new Color3f(1.0f,1.0f,1.0f));
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),1000.0);
bg.setApplicationBounds(bounds);
//Zusammenstellung der Szene aus (Hintergrundfarbe, Ball, Balken1, Balken2, Musik)
BranchGroup theScene = new BranchGroup();
theScene.addChild(this.initBall());
theScene.addChild(this.initBalken1());
theScene.addChild(this.initBalken2());
theScene.addChild(bg);
theScene.compile();
simpleUniverse.addBranchGraph(theScene);
}
public void addLight(SimpleUniverse simpleUniverse){
//Einfügen von zwei Lichtquellen
BranchGroup bgLight = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
Color3f lightColour1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lightDir1 = new Vector3f(-1.0f,0.0f,-0.5f);
DirectionalLight light1 = new DirectionalLight(lightColour1, lightDir1);
light1.setInfluencingBounds(bounds);
bgLight.addChild(light1);
Vector3f lightDir2 = new Vector3f(1.0f,0.0f,0.5f);
DirectionalLight light2 = new DirectionalLight(lightColour1, lightDir2);
light2.setInfluencingBounds(bounds);
bgLight.addChild(light2);
/*//Einfügen von Umgebungslicht
Color3f lightColour = new Color3f(0.2f, 2.5f, 4.0f);
AmbientLight ambLight = new AmbientLight(lightColour);
ambLight.setInfluencingBounds(bounds);
bgLight.addChild(ambLight);*/
simpleUniverse.addBranchGraph(bgLight);
}
public TransformGroup initBalken1(){
//Ein rechter Balken, der in der Szene erscheinen soll inklusive Transformationsgruppe
//Die Farben fuer die Appearance
Color3f ambientColourFBalken1 = new Color3f(0.2f,0.2f,0.2f);
Color3f emissiveColourFBalken1 = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourFBalken1 = new Color3f(0.6f,0.6f,0.6f);
Color3f specularColourFBalken1 = new Color3f(0.5f,0.5f,0.5f);
float shininessFBalken1 = 128.0f;
//Die Appearance fuer den Balken1
Appearance balken1App = new Appearance();
balken1App.setMaterial(new Material(ambientColourFBalken1,emissiveColourFBalken1,
diffuseColourFBalken1,specularColourFBalken1,shininessFBalken1));
//Der Balken1 mit Größenangaben und balken1App = Aussehen
Box balken1 = new Box(0.006f,0.06f,0.006f,balken1App);
//Die Transformationsgruppe des Wuerfels mit Math.PI/x ist es möglich
//Balken zu drehen und zu wenden!
Transform3D tfFBalken1 = new Transform3D();
tfFBalken1.rotY(Math.PI/1);
Transform3D rotationX = new Transform3D();
rotationX.rotX(Math.PI/1);
tfFBalken1.mul(rotationX);
TransformGroup tgFBalken1 = new TransformGroup(tfFBalken1);
tgFBalken1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Transform3D seatAxis = new Transform3D();
seatAxis.rotX(Math.PI/2);
Alpha seatAlpha = new Alpha(1,//unendliche male
Alpha.INCREASING_ENABLE, 0, startingTime,
todotime,//time for rotation
0,0,0,0,0);//der rest
PositionInterpolator movSeat = new PositionInterpolator(
seatAlpha, tgFBalken1, seatAxis, 0.0f, maxLeftRight);
movSeat.setSchedulingBounds(bounds);
tgFBalken1.addChild(movSeat);
tgFBalken1.addChild(balken1);
return tgFBalken1;
}
public TransformGroup initBalken2(){
//Ein linker Balken, der in der Szene erscheinen soll inklusive Transformationsgruppe
//Die Farben fuer die Appearance
Color3f ambientColourFBalken2 = new Color3f(0.2f,0.2f,0.2f);
Color3f emissiveColourFBalken2 = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourFBalken2 = new Color3f(0.6f,0.6f,0.6f);
Color3f specularColourFBalken2 = new Color3f(0.5f,0.5f,0.5f);
float shininessFBalken2 = 128.0f;
//Die Appearance fuer den Balken1
Appearance balken2App = new Appearance();
balken2App.setMaterial(new Material(ambientColourFBalken2,emissiveColourFBalken2,
diffuseColourFBalken2,specularColourFBalken2,shininessFBalken2));
//Der Wuerfel
Box balken2 = new Box(0.006f,0.06f,0.006f,balken2App);
//Die Transformationsgruppe des Wuerfels mit Math.PI/x ist es möglich
//Balken zu drehen und zu wenden!
Transform3D tfFBalken2 = new Transform3D();
tfFBalken2.rotY(Math.PI/1);
Transform3D rotationX = new Transform3D();
rotationX.rotX(Math.PI/1);
tfFBalken2.mul(rotationX);
TransformGroup tgFBalken2 = new TransformGroup(tfFBalken2);
tgFBalken2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Transform3D seatAxis = new Transform3D();
seatAxis.rotY(2*Math.PI/2);
Alpha seatAlpha = new Alpha(1,//unendliche male
Alpha.INCREASING_ENABLE, 0, startingTime,
todotime,//time for rotation
0,0,0,0,0);//der rest
PositionInterpolator movSeat = new PositionInterpolator(
seatAlpha, tgFBalken2, seatAxis, 0.0f, maxLeftRight);
movSeat.setSchedulingBounds(bounds);
tgFBalken2.addChild(movSeat);
tgFBalken2.addChild(balken2);
return tgFBalken2;
}
public TransformGroup initBall(){
//Unser Ball, der in der Szene erscheinen soll inklusive Transformationsgruppe
//und Rotation.
Color3f ambientColourBSphere = new Color3f(0.2f,0.2f,0.2f);
Color3f emissiveColourBSphere = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourBSphere = new Color3f(0.6f,0.6f,0.6f);
Color3f specularColourBSphere = new Color3f(0.5f,0.5f,0.5f);
float shininessBSphere = 128.0f;
//Die Appearance fuer die Kugel
Appearance bSphereApp = new Appearance();
bSphereApp.setMaterial(new Material(ambientColourBSphere,emissiveColourBSphere,
diffuseColourBSphere,specularColourBSphere,shininessBSphere));
//Der Ball ohne Tesselierung
//Sphere bSphere = new Sphere(0.1f,bSphereApp);
// Ball mit Tesselierung
PolygonAttributes polygBall = new PolygonAttributes();
polygBall.setPolygonMode(PolygonAttributes.POLYGON_LINE);
bSphereApp.setPolygonAttributes(polygBall);
Sphere bSphere = new Sphere(0.015f, Sphere.GENERATE_NORMALS, 500, bSphereApp);
//Die Transformationsgruppe des Balls
Transform3D tfBSphere = new Transform3D();
tfBSphere.setTranslation(new Vector3f(1.0f,1.0f,-1.0f));
TransformGroup tgBSphere = new TransformGroup();
tgBSphere.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//Ball rotieren lassen
Alpha rotationAlpha = new Alpha(-1, 15000);
RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha, tgBSphere);
rotator.setSchedulingBounds(bounds);
tgBSphere.addChild(rotator);
tgBSphere.addChild(bSphere);
return tgBSphere;
}
public static void main(String[] args) {
new PingPong3D();
}
}
[/HIGHLIGHT]
ich habe leider ein mittelschweres Problem. Ich habe einen Pongspiel geschrieben, dass auf Java3D basiert, es ist grafisch soweit fertig, nur es hat noch keinerlei Funktionalität.
Ich habe Schwierigkeiten dabei Funktionen für die Balken und den Ball zu implementieren, ich hoffe einer von euch kann mir helfen, dass Spiel zum laufen zu bringen! Vielen Dank schonmal im Vorraus!
Den Quellcode findet ihr hier:
[HIGHLIGHT="Java"]
import java.awt.Button;
import java.awt.Panel;
import java.awt.event.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.swing.Timer;
public class PingPong3D extends JFrame{
public Canvas3D Spiel3D;
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE);
//Variabeln die für die Positionsinterpolation benötigt werden!
private final float maxLeftRight = 0.95f;
private final long todotime = 4000;
private int startingTime = 3000;
private Button start = new Button("Start");
public PingPong3D(){
//Mechanismus zum Schliessen des Fensters und beenden des Programms
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Spiel3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
SimpleUniverse simpleUniverse = new SimpleUniverse(Spiel3D);
simpleUniverse.getViewingPlatform().setNominalViewingTransform();
//Die Szene wird in dieser Methode erzeugt
createSceneGraph(simpleUniverse);
Panel panel = new Panel();
panel.add(start);
add("North", panel);
//Hinzufügen von Licht
addLight(simpleUniverse);
setTitle("PingPong3D");
setSize(800, 300);
getContentPane().add("Center", Spiel3D);
setVisible(true);
}
public void createSceneGraph(SimpleUniverse simpleUniverse){
//Erzeugen eines weissen Hintergrundes
Background bg = new Background(new Color3f(1.0f,1.0f,1.0f));
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),1000.0);
bg.setApplicationBounds(bounds);
//Zusammenstellung der Szene aus (Hintergrundfarbe, Ball, Balken1, Balken2, Musik)
BranchGroup theScene = new BranchGroup();
theScene.addChild(this.initBall());
theScene.addChild(this.initBalken1());
theScene.addChild(this.initBalken2());
theScene.addChild(bg);
theScene.compile();
simpleUniverse.addBranchGraph(theScene);
}
public void addLight(SimpleUniverse simpleUniverse){
//Einfügen von zwei Lichtquellen
BranchGroup bgLight = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
Color3f lightColour1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lightDir1 = new Vector3f(-1.0f,0.0f,-0.5f);
DirectionalLight light1 = new DirectionalLight(lightColour1, lightDir1);
light1.setInfluencingBounds(bounds);
bgLight.addChild(light1);
Vector3f lightDir2 = new Vector3f(1.0f,0.0f,0.5f);
DirectionalLight light2 = new DirectionalLight(lightColour1, lightDir2);
light2.setInfluencingBounds(bounds);
bgLight.addChild(light2);
/*//Einfügen von Umgebungslicht
Color3f lightColour = new Color3f(0.2f, 2.5f, 4.0f);
AmbientLight ambLight = new AmbientLight(lightColour);
ambLight.setInfluencingBounds(bounds);
bgLight.addChild(ambLight);*/
simpleUniverse.addBranchGraph(bgLight);
}
public TransformGroup initBalken1(){
//Ein rechter Balken, der in der Szene erscheinen soll inklusive Transformationsgruppe
//Die Farben fuer die Appearance
Color3f ambientColourFBalken1 = new Color3f(0.2f,0.2f,0.2f);
Color3f emissiveColourFBalken1 = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourFBalken1 = new Color3f(0.6f,0.6f,0.6f);
Color3f specularColourFBalken1 = new Color3f(0.5f,0.5f,0.5f);
float shininessFBalken1 = 128.0f;
//Die Appearance fuer den Balken1
Appearance balken1App = new Appearance();
balken1App.setMaterial(new Material(ambientColourFBalken1,emissiveColourFBalken1,
diffuseColourFBalken1,specularColourFBalken1,shininessFBalken1));
//Der Balken1 mit Größenangaben und balken1App = Aussehen
Box balken1 = new Box(0.006f,0.06f,0.006f,balken1App);
//Die Transformationsgruppe des Wuerfels mit Math.PI/x ist es möglich
//Balken zu drehen und zu wenden!
Transform3D tfFBalken1 = new Transform3D();
tfFBalken1.rotY(Math.PI/1);
Transform3D rotationX = new Transform3D();
rotationX.rotX(Math.PI/1);
tfFBalken1.mul(rotationX);
TransformGroup tgFBalken1 = new TransformGroup(tfFBalken1);
tgFBalken1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Transform3D seatAxis = new Transform3D();
seatAxis.rotX(Math.PI/2);
Alpha seatAlpha = new Alpha(1,//unendliche male
Alpha.INCREASING_ENABLE, 0, startingTime,
todotime,//time for rotation
0,0,0,0,0);//der rest
PositionInterpolator movSeat = new PositionInterpolator(
seatAlpha, tgFBalken1, seatAxis, 0.0f, maxLeftRight);
movSeat.setSchedulingBounds(bounds);
tgFBalken1.addChild(movSeat);
tgFBalken1.addChild(balken1);
return tgFBalken1;
}
public TransformGroup initBalken2(){
//Ein linker Balken, der in der Szene erscheinen soll inklusive Transformationsgruppe
//Die Farben fuer die Appearance
Color3f ambientColourFBalken2 = new Color3f(0.2f,0.2f,0.2f);
Color3f emissiveColourFBalken2 = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourFBalken2 = new Color3f(0.6f,0.6f,0.6f);
Color3f specularColourFBalken2 = new Color3f(0.5f,0.5f,0.5f);
float shininessFBalken2 = 128.0f;
//Die Appearance fuer den Balken1
Appearance balken2App = new Appearance();
balken2App.setMaterial(new Material(ambientColourFBalken2,emissiveColourFBalken2,
diffuseColourFBalken2,specularColourFBalken2,shininessFBalken2));
//Der Wuerfel
Box balken2 = new Box(0.006f,0.06f,0.006f,balken2App);
//Die Transformationsgruppe des Wuerfels mit Math.PI/x ist es möglich
//Balken zu drehen und zu wenden!
Transform3D tfFBalken2 = new Transform3D();
tfFBalken2.rotY(Math.PI/1);
Transform3D rotationX = new Transform3D();
rotationX.rotX(Math.PI/1);
tfFBalken2.mul(rotationX);
TransformGroup tgFBalken2 = new TransformGroup(tfFBalken2);
tgFBalken2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Transform3D seatAxis = new Transform3D();
seatAxis.rotY(2*Math.PI/2);
Alpha seatAlpha = new Alpha(1,//unendliche male
Alpha.INCREASING_ENABLE, 0, startingTime,
todotime,//time for rotation
0,0,0,0,0);//der rest
PositionInterpolator movSeat = new PositionInterpolator(
seatAlpha, tgFBalken2, seatAxis, 0.0f, maxLeftRight);
movSeat.setSchedulingBounds(bounds);
tgFBalken2.addChild(movSeat);
tgFBalken2.addChild(balken2);
return tgFBalken2;
}
public TransformGroup initBall(){
//Unser Ball, der in der Szene erscheinen soll inklusive Transformationsgruppe
//und Rotation.
Color3f ambientColourBSphere = new Color3f(0.2f,0.2f,0.2f);
Color3f emissiveColourBSphere = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourBSphere = new Color3f(0.6f,0.6f,0.6f);
Color3f specularColourBSphere = new Color3f(0.5f,0.5f,0.5f);
float shininessBSphere = 128.0f;
//Die Appearance fuer die Kugel
Appearance bSphereApp = new Appearance();
bSphereApp.setMaterial(new Material(ambientColourBSphere,emissiveColourBSphere,
diffuseColourBSphere,specularColourBSphere,shininessBSphere));
//Der Ball ohne Tesselierung
//Sphere bSphere = new Sphere(0.1f,bSphereApp);
// Ball mit Tesselierung
PolygonAttributes polygBall = new PolygonAttributes();
polygBall.setPolygonMode(PolygonAttributes.POLYGON_LINE);
bSphereApp.setPolygonAttributes(polygBall);
Sphere bSphere = new Sphere(0.015f, Sphere.GENERATE_NORMALS, 500, bSphereApp);
//Die Transformationsgruppe des Balls
Transform3D tfBSphere = new Transform3D();
tfBSphere.setTranslation(new Vector3f(1.0f,1.0f,-1.0f));
TransformGroup tgBSphere = new TransformGroup();
tgBSphere.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//Ball rotieren lassen
Alpha rotationAlpha = new Alpha(-1, 15000);
RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha, tgBSphere);
rotator.setSchedulingBounds(bounds);
tgBSphere.addChild(rotator);
tgBSphere.addChild(bSphere);
return tgBSphere;
}
public static void main(String[] args) {
new PingPong3D();
}
}
[/HIGHLIGHT]
Zuletzt bearbeitet von einem Moderator: