# BlueJ Ufospiel Probleme



## Fridax2000 (6. Mrz 2015)

Hallo, in der Schule müssen wir ein Ufospiel programmieren, in welchem man mit einem Ufo einem Meteoritenfeld ausweichen muss. (GLOOP)

Klasse Scene: (Verwendungspfeil zu Klasse Meteor und Klasse Ufo)

```
import GLOOP.*;
public class Scene{
    Meteor hMeteor;
    GLKamera hKamera;
    GLLicht hLicht1, hLicht2, hLicht3;
    Ufo hUfo;
    GLTastatur hTastatur;
    public Scene(){
        hKamera = new GLSchwenkkamera();
        hLicht1 = new GLLicht(0,-10000,0);
        hLicht2 = new GLLicht(0,10000,0);
        hLicht3 = new GLLicht(0,0,10000);
        hMeteor = new Meteor(hUfo);
        hUfo = new Ufo();
        hTastatur = new GLTastatur();
        while (true)
        {
            hMeteor.falle();
            if(hTastatur.oben()){
                hUfo.verschiebeOben();
            }
            if(hTastatur.unten()){
                hUfo.verschiebeUnten();
            }
            if(hTastatur.links()){
                hUfo.verschiebeLinks();
            }
            if(hTastatur.rechts()){
                hUfo.verschiebeRechts();
            }
            Sys.warte(3);
        }
    }
}
```
Klasse Ufo:

```
import GLOOP.*;
public class Ufo{
    GLTorus hUmriss;
    GLKugel hGlas;
    GLZylinder hBoden;
    GLPrismoid hFluegel1, hFluegel2;

    public Ufo(){
        hUmriss = new GLTorus(0,-200,0,20,10);
        hUmriss.skaliere(2,3,2);
        hBoden = new GLZylinder(0,-200,-10,20,10);
        hBoden.skaliere(2,3,2);
        hBoden.setzeMaterial(GLMaterial.SILBER_POLIERT);
        hUmriss.setzeMaterial(GLMaterial.SILBER_POLIERT);
        hGlas = new GLKugel(0,-200,10,20);
        hGlas.skaliere(2,3,1);
        hGlas.setzeMaterial(GLMaterial.RUBIN);
        hFluegel1 = new GLPrismoid(40,-230,0,10,10,3,2);
        hFluegel1.skaliere(3,9,3);
        hFluegel2 = new GLPrismoid(-40,-230,0,10,10,3,2);
        hFluegel2.skaliere(3,9,3);
        hFluegel1.setzeFarbe(0,0,1);
        hFluegel2.setzeFarbe(0,0,1);
        hUmriss.drehe(270,0,0,hUmriss.gibX(),hUmriss.gibY(),hUmriss.gibZ());
        hBoden.drehe(270,0,0,hUmriss.gibX(),hUmriss.gibY(),hUmriss.gibZ());
        hGlas.drehe(270,0,0,hUmriss.gibX(),hUmriss.gibY(),hUmriss.gibZ());
        hFluegel1.drehe(270,0,0,hUmriss.gibX(),hUmriss.gibY(),hUmriss.gibZ());
        hFluegel2.drehe(270,0,0,hUmriss.gibX(),hUmriss.gibY(),hUmriss.gibZ());
    }

    public void explodiere(){
        hUmriss.verschiebe(1,-1,-0.5);
        hUmriss.drehe(0.5,0.5,0.5);
        hBoden.verschiebe(-1,1,-0.5);
        hBoden.drehe(-0.5,0.5,0.5);
        hGlas.verschiebe(1,-1,-0.5);
        hGlas.drehe(0.5,-0.5,-0.5);
        hFluegel1.verschiebe(1,1,0.5);
        hFluegel1.drehe(-0.5,0.5,-0.5);
        hFluegel2.verschiebe(1,1,-0.5);
        hFluegel2.drehe(0.5,-0.5,0.5);
    }

    public void verschiebeLinks(){
        if(hUmriss.gibX()>-500){
            hUmriss.verschiebe(-1,0,0);
            hBoden.verschiebe(-1,0,0);
            hGlas.verschiebe(-1,0,0);
            hFluegel1.verschiebe(-1,0,0);
            hFluegel2.verschiebe(-1,0,0);
        }
    }

    public void verschiebeRechts(){
        if(hUmriss.gibX()<500){
            hUmriss.verschiebe(1,0,0);
            hBoden.verschiebe(1,0,0);
            hGlas.verschiebe(1,0,0);
            hFluegel1.verschiebe(1,0,0);
            hFluegel2.verschiebe(1,0,0);
        }
    }

    public void verschiebeOben(){
        if(hUmriss.gibY()<300){
            hUmriss.verschiebe(0,1,0);
            hBoden.verschiebe(0,1,0);
            hGlas.verschiebe(0,1,0);
            hFluegel1.verschiebe(0,1,0);
            hFluegel2.verschiebe(0,1,0);
        }
    }

    public void verschiebeUnten(){
        if(hUmriss.gibY()>-300){
            hUmriss.verschiebe(0,-1,0);
            hBoden.verschiebe(0,-1,0);
            hGlas.verschiebe(0,-1,0);
            hFluegel1.verschiebe(0,-1,0);
            hFluegel2.verschiebe(0,-1,0);
        }
    }

    public double ufoX(){
        return hUmriss.gibX();
    }

    public double ufoY(){
        return hUmriss.gibY();
    }

    public double ufoZ(){
        return hUmriss.gibZ();
    }
}
```

Klasse Meteor: (Verwendungspfeil zu Klasse Ufo)

```
import GLOOP.*;
public class Meteor
{
    GLKugel[] hMeteor;
    Ufo hUfo;
    double pRadius;
    public Meteor(Ufo pUfo)
    {
        hUfo = pUfo;
        hMeteor = new GLKugel[10];
        for(int i = 0; i < 10; i++)
        {
            pRadius = Math.random()*50+20;
            hMeteor[i] = new GLKugel(Math.random() * 2000 - 1000, Math.random() * 100 - 500, -Math.random()*10000,pRadius);
        }
    }
    public void falle()
    {
        {
            for(int i = 0; i < 10; i++)
            {
                hMeteor[i].verschiebe(0,0,3);
                if(hMeteor[i].gibZ()>-90){
                    if((hUfo.ufoX()-hMeteor[i].gibX())*(hUfo.ufoX()-hMeteor[i].gibX())+(hUfo.ufoY()-hMeteor[i].gibY())*(hUfo.ufoY()-hMeteor[i].gibY())<(pRadius+50)*(pRadius+50)){
                        hUfo.explodiere();
                        
                    }
                }
                if(hMeteor[i].gibZ()>500)
                {
                       hMeteor[i].setzePosition(Math.random() * 2000 - 1000, Math.random() * 1000 - 500, -10000);
                }
            }
        }
    }
}
```

Wenn ihr das Programm startet, wird euch direkt auffallen, was fehlerhaft ist. Das Berechnen, ob ein Meteorit das Ufo berührt. 

```
if(hMeteor[i].gibZ()>-90){
                    if((hUfo.ufoX()-hMeteor[i].gibX())*(hUfo.ufoX()-hMeteor[i].gibX())+(hUfo.ufoY()-hMeteor[i].gibY())*(hUfo.ufoY()-hMeteor[i].gibY())<(pRadius+50)*(pRadius+50)){
                        hUfo.explodiere();
```

Wo ist der Fehler, und wie kann ich es richtig machen. Bitte um sofortige Tipps


----------



## Fridax2000 (7. Mrz 2015)

Ich hatte jetzt die Idee, in der Klasse Meteor ein boolean kollision zu machen, das nach der obigen Formel bei Kollision true ist, else false, aber ich weiß nicht, wie ich diesen boolean dann in die Klasse Scene übertragen kann, die dann die Bewegung des Ufos stoppen kann und es explodieren lässt.


----------

