ich hab jetzt ein gut funktionierendes bewegungssystem wo man sich auch umsehen kann, aber das mit der kollsion krieg ich nicht wirklich hin. ich hab da um den spieler eine boundingbox, die sich auch mit dem spieler die ganze zeit mit bewegt. da ist dann noch eine colorcube, wo eine kollision auch korrekt erkannt wird. alle 25ms wird ein timer durchlaufen der die rotation und die position des spielers festlegt. ich dachte ich speichere die spielerposition ganz am anfang der schleife in einer temporären variable, und immer wenn eine kollision erkannt wird setze ich den spieler auf diese temporäre position. das klappt aber nicht wirklich, er bleibt einfach auf der stelle sobald er mit dem objekt kollidiert.
also wie mach ich das? früher als ich das bei nem 2d spiel gemacht hab ging diese technik, dass die position einfach zurückgesetzt wird wenn es kollision gibt.
ich habs mit nem behavior versucht aber da wird die kollision gar nicht erst erkannt, egal ob ich die bounds vom spieler oder die von der colorcube benutze.
Java:
java.util.TimerTask task=new java.util.TimerTask()
{
Point3d tmpPlayerPos;
public void run()
{
tmpPlayerPos=new Point3d(player.position.getX(),player.position.getY(),player.position.getZ()); //hier wird die aktuelle spielerposition gespeichert.
Transform3D rotY=new Transform3D();
Transform3D rotX=new Transform3D();
Transform3D rotZ=new Transform3D();
Transform3D trans=new Transform3D();
if(mouseEntered==true)
{
int x=(int)MouseInfo.getPointerInfo().getLocation().getX();
int y=(int)MouseInfo.getPointerInfo().getLocation().getY();
Transform3D tmp=new Transform3D(); view.getTransform(tmp);
double diffX=-((x-mousePos.getX())/mouseSens);
double diffY=-((y-mousePos.getY())/mouseSens);
player.yRotation+=diffX;
player.xRotation+=diffY;
rotY.rotY(Math.toRadians(player.yRotation));
rotX.rotX(Math.toRadians(player.xRotation));
rotY.mul(trans);
rotY.mul(rotX);
trans.mul(rotY);
trans.setTranslation(new Vector3d(player.position.getX(),player.position.getY(),player.position.getZ()));
view.setTransform(trans);
mousePos.setX(x); mousePos.setY(y);
if(mouseEntered==true)
{
robot.mouseMove(250, 250);
mousePos.setX(250);mousePos.setY(250);
}
if(player.dz==1)
{
player.move(player.yRotation);
}
else if(player.dz==-1)
{
player.move(player.yRotation+180);
}
if(player.dx==1)
{
player.move(player.yRotation+90);
}
else if(player.dx==-1)
{
player.move(player.yRotation-90);
}
if(player.bounds.intersect(cube.getBounds()))
{
System.out.println(tmpPlayerPos+"|"+player.position);
player.position=tmpPlayerPos; //hier sollte der spieler auf die position zurückgeworfen werden, er bleibt aber nur in der collisionszone stecken. bei einem bewegungsversuch werden für die spielerposition geringfügig andere werte ausgegeben als tmpPlayerPos
}
player.checkRotation();
player.updateBounds();
}
}
};
Java:
cubeTGTrans.setTranslation(new Vector3f(0,0,10));
cube.setBoundsAutoCompute(false);
cube.setBounds(new BoundingBox(new Point3d(-1,-1,9),new Point3d(1,1,11)));
also wie mach ich das? früher als ich das bei nem 2d spiel gemacht hab ging diese technik, dass die position einfach zurückgesetzt wird wenn es kollision gibt.
ich habs mit nem behavior versucht aber da wird die kollision gar nicht erst erkannt, egal ob ich die bounds vom spieler oder die von der colorcube benutze.
Java:
class collisionBehavior extends Behavior
{
Bounds boundingBox;
WakeupCriterion criterion;
public collisionBehavior(Bounds targetBounds)
{
setSchedulingBounds(bounds);
this.boundingBox=targetBounds;
criterion=new WakeupOnCollisionEntry(targetBounds);
}
public void initialize()
{
this.wakeupOn(criterion);
System.out.println("initialized");
}
public void processStimulus(Enumeration e)
{
System.out.println("collision");
this.wakeupOn(criterion);
}
}
Zuletzt bearbeitet: