import sas_pygame as sas
WIDTH = 400
HEIGHT = 600
#DIe Bilder  xwingklein.png tie.png, trenchlang.png und explosion.png müssen hochgeladen werden
class Laser:
    def __init__(self, pX, pY, pBreite, pAsteroid):
        self.asteroids = pAsteroid
        self.laser1 = sas.Rectangle(pX+2, pY - 11, 3, 20, "red")
        self.laser2 = sas.Rectangle(pX + pBreite - 5, pY - 11, 3, 20, "red")
        self.visible = False
        self.verstecken()
        self.laserErgebnis = False

    def verstecken(self):
        self.visible = False
        self.laser1.setHidden(True)
        self.laser2.setHidden(True)

    def zeigen(self):
        self.visible = True
        self.laser1.setHidden(False)
        self.laser2.setHidden(False)

    def laserSichtbar(self):
        return self.visible

    def bewegen(self):
        self.laser1.move(0,-16)
        self.laser2.move(0,-16)

    def bewegeZu(self, pX, pY, pBreite):
        self.laser1.moveTo(pX + 2, pY - 11)
        self.laser2.moveTo(pX + pBreite - 5, pY - 11)

    def bewege(self, pX, pY):
        if not self.visible:
            return()
        self.laser1.move(pX, pY)
        self.laser2.move(pX, pY)
        if self.laser1.getShapeY() + self.laser1.getShapeHeight() < 0:
            self.verstecken()

    def istKollidiert(self):
        self.laserErgebnis = False

        for asteroid in self.asteroids:
            if self.laser1.intersects(asteroid.kreis):
                self.laserErgebnis = True
                asteroid.verstecken()

        if not self.laserErgebnis:
            for asteroid in self.asteroids:
                if self.laser2.intersects(asteroid.kreis):
                    self.laserErgebnis = True
                    asteroid.verstecken()

        return self.laserErgebnis
    
class Asteroid:

    def __init__(self,pX, pY, pFensterBreite):
        self.fensterBreite = pFensterBreite
        self.kreis = sas.Picture(pX, pY,40, 34, "tie.png")
        self.zaehler = 0

    def bewege(self):
        if self.kreis.getShapeY() > HEIGHT:
            zufallszahl = sas.Tools.randomNumber(0, self.fensterBreite - 20)
            self.kreis.moveTo(zufallszahl, -40)
            self.zaehler = 1
            self.kreis.setHidden(False)
        else:
            self.kreis.move(0,2)
            self.zaehler = 0

    def verstecken(self):
        self.kreis.setHidden(True)


class Ufo:

    def __init__(self,pX, pY, pAsteroid):
        self.ufoBild = sas.Picture(pX, pY, 78, 64, "xwingklein.png")
        self.explosionsBild = sas.Picture(pX - 5, pY - 35, 65, 64, "explosion.png")
        self.explosionsBild.setHidden(True)
        self.asteroids = pAsteroid
        self.ergebnis = False
        self.laser = Laser(self.ufoBild.getShapeX(), self.ufoBild.getShapeY(), self.ufoBild.getShapeWidth(), self.asteroids)
        self.laser.verstecken()

    def schiessen(self):
        if not self.laser.laserSichtbar():
            self.laser.bewegeZu(self.ufoBild.getShapeX(), self.ufoBild.getShapeY(), self.ufoBild.getShapeWidth())
            self.laser.zeigen()

    def laserBewegen(self):
        self.laser.bewege(0, -3)

    def laserTreffer(self):
        self.laser.istKollidiert()

    def bewegeLinks(self):
        if self.ufoBild.getShapeX() > 1:
            self.ufoBild.move(-5,0)
            self.explosionsBild.move(-5, 0)

    def bewegeRechts(self):
        if self.ufoBild.getShapeX() + self.ufoBild.getShapeWidth()< WIDTH:
            self.ufoBild.move(5,0)
            self.explosionsBild.move(5, 0)

    def bewegeHoch(self):
        if self.ufoBild.getShapeY() > 1:
            self.ufoBild.move(0,-5)
            self.explosionsBild.move(0, -5)

    def bewegeRunter(self):
        if self.ufoBild.getShapeY() < HEIGHT:
            self.ufoBild.move(0,5)
            self.explosionsBild.move(0, 5)

    def istKollidiert(self):
        if self.ergebnis:
            return True  # bereits zerstört
        for asteroid in self.asteroids:
                if self.ufoBild.intersects(asteroid.kreis):
                    self.ergebnis = True
                    self.ufoBild.setHidden(True)
                    self.explosionsBild.moveTo(self.ufoBild.getShapeX() - 5,self.ufoBild.getShapeY() - 35)
                    self.explosionsBild.setHidden(False)
                    self.explosionsBild.scale(1.5, 1.5)
                    self.laser.verstecken()
                    return True
        return False


class Ufospiel:

    def __init__(self, view):
        self.view = view
        self.spielendeErreicht = False
        self.hintergrund = sas.Picture(0, -HEIGHT, 400, 1846, "trenchlang.png")
        self.derAsteroid = []
        for i in range(10 ):
            zufallX = sas.Tools.randomNumber(20,WIDTH-20)
            zufallY = sas.Tools.randomNumber(0,HEIGHT)
            self.derAsteroid.append(Asteroid(zufallX, -zufallY, WIDTH))
        self.gesamtzahl = 0
        self.dasUfo = Ufo(WIDTH / 2, HEIGHT - 100, self.derAsteroid)
        self.punktneu1 = sas.Text(270, 10, f"Treffer: {self.gesamtzahl} ","white")

    def update(self):
        for asteroid in self.derAsteroid:
            asteroid.bewege()
        if self.hintergrund.getShapeY() < -1:
            self.hintergrund.move(0,1)
        else:
            self.hintergrund.move(0, -HEIGHT)
        if not self.dasUfo.ergebnis:
            if self.view.keyPressed(' '):
                self.dasUfo.schiessen()
            if self.view.keyLeftPressed():
                self.dasUfo.bewegeLinks()
            if self.view.keyRightPressed():
                self.dasUfo.bewegeRechts()
            if self.view.keyUpPressed():
                self.dasUfo.bewegeHoch()
            if self.view.keyDownPressed():
                self.dasUfo.bewegeRunter()
            self.dasUfo.laserBewegen()
            self.dasUfo.laserTreffer()
        kollision1 = self.dasUfo.istKollidiert()
        for asteroid in self.derAsteroid:
            self. gesamtzahl += asteroid.zaehler
        if not kollision1:
            self.punktneu1.setText(f"Treffer: {self.gesamtzahl}")

def main():
    view = sas.createView(WIDTH,HEIGHT,"black","Ufo-Spiel")
    ufospiel = Ufospiel(view)
    while view.running:
        ufospiel.update()
        view.step()
    view.quit()

main()
            
            


        