from zaMa import * import math gedragged = None startPos = None mausPos = None raupenShader = None anzahlRaupen = None ############################# # Raupen-Klasse ############################# class raupenAnim: # Initialisieren def __init__(self,raupenWinkel,drehpunktX,drehpunktY,anzElemente,farbe,speed): self.drehpunktX = drehpunktX self.drehpunktY = drehpunktY self.xTrans = 0 self.yTrans = 0 self.xBounce = GetRandom(10,50) self.yBounce = GetRandom(10, 50) #dynamisch machen... spannendere formen! self.raupenWinkel = raupenWinkel self.schritteGemacht = 0 self.schrittLaenge = GetRandom(20,360) self.richtung = 1 self.speed = speed self.anzElemente = anzElemente self.farbe = farbe self.startZeit = GetTime() self.elementListe = [] # Elemente werden in die Element-Liste eingetragen for i in range(0,self.anzElemente): self.elementListe.append(element(self.farbe)) def isDead(self): if GetTime() - self.startZeit > 20: status = 1 else: status = 0 return status # wird beim haupt-onStep aufgerufen def step(self): # Winkel der Raupen-Drehung wird angepasst. self.raupenWinkel = self.raupenWinkel + self.speed * self.richtung #winkel wird normalisiert... z.b. wird -1 zu 359 self.raupenWinkel = normWinkel(self.raupenWinkel) self.schritteGemacht = self.schritteGemacht + self.speed #die Raupe wird gewendet if self.schritteGemacht > self.schrittLaenge: self.raupeWenden() #wird beim haupt-onDraw aufgerufen def draw(self): SetColor(self.farbe) SavePos() #mittelpunkt setzen -> in elemente-klasse verschieben? Translate(self.drehpunktX, self.drehpunktY,0) #die elemente zeichnen for i in range(0,self.anzElemente): SavePos() self.xTrans = math.cos(bogenmass(self.raupenWinkel)) * self.xBounce * i self.yTrans = math.sin(bogenmass(self.raupenWinkel)) * self.yBounce * i #kollision mit der wand '''if self.xTrans + self.drehpunktX >= 800 or self.xTrans + self.drehpunktX <= 0 or self.yTrans + self.drehpunktY >= 600 or self.yTrans + self.drehpunktY <= 0: self.richtung = self.richtung * -1''' self.elementListe[i].draw(self.xTrans, self.yTrans) RestorePos() RestorePos() #hier die spuren zeichnen (vor der translation... damit die spuren nicht verschoben werden) for item in self.elementListe: item.draw_tracks() def raupeWenden(self): #neuen wendepunkt setzen self.schrittLaenge = GetRandom(20,360) self.schritteGemacht = 0 #winkel umkehren #je nach richtung werden noch 2 schritte hinzu- oder weggerechnet, dass keine "doppelten spuren" entstehen self.raupenWinkel = normWinkel(self.raupenWinkel - (180 + 2* self.richtung * self.speed) ) #neuen mittelpunkt vorbereiten (dahin, wo das "letzte" element war) self.drehpunktX = self.xTrans + self.drehpunktX self.drehpunktY = self.yTrans + self.drehpunktY self.richtung = self.richtung * -1 ############################## # Element-Klasse ############################## class element: # Initialisierung def __init__(self, farbe): self.schwanzGlobal = [] #self.quadrat = CreateFaceRectangle(10,10) self.i = None self.schwanzLaenge = 50 self.farbe = farbe # Zeichnungsfunktion: zeichnet das neuste Element def draw(self, xTrans, yTrans): #fŸr jeden eintrag in der liste Point([xTrans, yTrans]) self.schwanzGlobal.append(GetScreenCoord(xTrans, yTrans,0)) #original screen-koordinaten speichern if len(self.schwanzGlobal) == self.schwanzLaenge: self.schwanzGlobal.remove(self.schwanzGlobal[0]) #RestorePos() # Zeichnet den Schwanz def draw_tracks(self): #wird in der raupenklasse vor dem translate aufgerufen self.i = 0.0 #rŸckwŠrts laufen lassen? mit einem for range 10 - 0, zŠhler -1 for item in self.schwanzGlobal: self.i = self.i + 1.0/self.schwanzLaenge SetColor(self.farbe[0], self.farbe[1], self.farbe[2], self.i) #SetColor(self.i, self.farbe[1], self.i, self.i) #farbiger ;-) Point(item) ############################## ####### Hauptprogramm######### ############################## ############################## # Haupt-OnInit () ############################## def OnInit(): SetColor(1,1,1) SetBackgroundColor(1,1,1) SetPointSize(5) SetLineSize(5) global raupenAnimList global anzahlRaupen raupenAnimList=[] anzahlRaupen = 0 global raupenShader raupenShader = Shader() raupenShader.setBlending(SHADER.BLEND_TRANSPARENT) ############################## # Haupt-OnStep() ############################## def OnStep(): global gedragged global startPos global mausPos global raupenAnimList for item in raupenAnimList: if item.isDead() == 1: raupenAnimList.remove(item) else: item.step() ############################## # Haupt-Draw() ############################## def OnDraw(): global mausPos raupenShader.on() for item in raupenAnimList: item.draw() #SetColor(0,0,0) if gedragged == 1: farb = mausPos[0]/1000.0, mausPos[1]/1000.0, 1 SetColor(farb) Line(startPos,mausPos) print(gibDistanz(startPos, mausPos)) raupenShader.off() ############################### # (Hilfs-) Funktionen ############################### # Maus-Bewegung & Button def OnMouseMotion(x,y): global mausPos mausPos = [x,y] def OnMouseButtonDown(x,y,button): global raupenAnimList global gedragged global startPos if button == MOUSE.LBUTTON: gedragged = 1 startPos = [x,y] def OnMouseButtonUp(x,y,button): global gedragged global mausPos global anzahlRaupen global raupenAnimList if button == MOUSE.LBUTTON: gedragged = 0 mausPos = [x,y] #mengenbegrenzung: wenn mehr als 10, alles lšschen if anzahlRaupen <= 10: #raupenAnim(anfangwinkel,x-position, y-position, anzahl Elemente, farbe, speed) neuerWinkel = gibWinkel(startPos, mausPos) anzahlElemente = gibDistanz(startPos, mausPos) / 10 + 2 raupenAnimList.append(raupenAnim(neuerWinkel,startPos[0],startPos[1],anzahlElemente,[mausPos[0]/1000.0, mausPos[1]/1000.0, 1],5)) anzahlRaupen = anzahlRaupen + 1 else: raupenAnimList = [] anzahlRaupen = 0 else: #recht maustaste -> lšschen raupenAnimList = [] anzahlRaupen = 0 ############################### # Winkelfunktionen ############################### def bogenmass(grad): grad = grad / 180.0 * math.pi return grad def grad(bogenmass): bogenmass = bogenmass * 180.0 / math.pi return bogenmass #gibt die distanz zwischen 2 punkten zurŸck. pythagoras def gibDistanz(point1,point2): a = abs(point1[0] - point2[0]) b = abs(point1[1] - point2[1]) c = math.sqrt(a*a + b*b) return c #winkel normalisieren #gibt jeden winkel zwischen 0 und 360 grad zurŸck. inpus: jede zahl def normWinkel(winkel): winkel = winkel%360.0 #modulo: rest, wenn durch 360 geteilt -> 370 mod 360 = 10 if winkel < 0: #minuszahl winkel = 360.0 + winkel return winkel #gibt den winkel von 2 punkten zurŸck. der punkt 1 ist dabei das zentrum (in grad) def gibWinkel(point1, point2): x = point1[0] - point2[0] y = point1[1] - point2[1] winkel = grad(math.atan2(x,y)) if point2[0] <= point1[0]: #bin links if point2[1]>= point1[1]: #bin links oben winkel = 90 + (180-winkel) else: #bin links unten winkel = 180 + (90-winkel) else: #bin rechts if point2[1]>= point1[1]: #bin rechts oben winkel = 90-(winkel+180) else: #bin rechts unten winkel = 360-(winkel+90) return winkel ############################### # Umgebung & Fenster einrichten ############################### SetupEnvironment("RŠupliTschalper",800,600,ENV.WINDOW) SetFramerate(30) StartEnviroment()