Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2015 / WS I: 3D-Programmierung / Skripte / donut_class.py


Inhaltsbereich

donut_class.py

Python Source icon donut_class.py — Python Source, 3 KB (3231 bytes)

Dateiinhalt

# -*- coding: cp1252 -*-
# 20120702 S. H�ller

# Einbinden der Module f�r 3D, Zufall, Nebenl�ufigkeit
from visual import *
from random import random
from threading import Thread

# Fenstertitel, Kameraabstand und -winkel und KONSTANTEN
scene.title = "Streusel auf den Donut!"         # Fenstertitel
scene.forward = (0,-.5,-1)                      # Blickwinkel
scene.userspin = False                          # keine Drehoption m. Maus
scene.userzoom = False                          # keine Zoomoption m. Maus
#scene.stereo = "redcyan"                       # Anaglyphenbrille dabei?
MAXSTREUSEL = 50                                # Bedingungen f. Spielabbruch 

class Donut(Thread, frame):
    "Klasse modelliert Donut"
    def __init__(self, pos=(0,0,0), axis=(0,1,0)):
        # Aufruf der Oberklassenkonstruktoren
        Thread.__init__(self)
        frame.__init__(self, pos=pos)
        self.teig   = ring(thickness=0.55, color=(.9,.8,.2), axis=axis, frame=self)
        self.glasur = ring(thickness=0.56, color=(.3,.2,.1),\
                     material=materials.plastic, y=0.1, axis=axis, frame=self)
        self.anzeige = label(pos=self.pos, text="Streuselverbrauch", \
                            box=False, line=False, yoffset=50, height=10)
        self.streusel=[]
        self.winkel = 1     # Drehwinkel [�]
        self.klicks = 0     # Anzahl der Mausklicks
        
    def run(self):
        "Thread starten"
        while len(self.streusel) < MAXSTREUSEL:
            rate(50)                                                # 50 Bilder/Sekunde
            self.rotate(angle=radians(self.winkel), axis=(0,1,0))   # Rotieren
            self.garnieren()                                        # Streusel aufbringen
           

    def garnieren(self):
        "Donut via Mausklick mit Streuseln versehen ..."
        # Abfrage: hat sich ein Maus-Event ereignet?
        if scene.mouse.events:
            # Maus-Event in Variable speichern
            sme = scene.mouse.getevent()
            self.klicks += 1
            # Verarbeitung des Maus-Events: Maus �ber Schokoglasur geklickt?
            if sme.pick == self.glasur and sme.press:
                # erzeuge Streusel und f�ge in Liste ein
                self.streusel.append(sphere(pos=self.world_to_frame(sme.pickpos), \
                                    color=color.hsv_to_rgb((random(),1,1)), \
                                    radius=0.05, material=materials.plastic, \
                                    frame=self) )  
                # Winkelgeschwindigkeit mit jedem Streusel erh�hen
                self.winkel += 0.05
            # Winkelgeschwindigkeit mit jedem Klick erh�hen
            self.winkel += 0.05
            self.anzeige.text="Verbrauch: "+str(len(self.streusel))+" Streusel\nbei "+\
                               str(self.klicks/2)+" Klicks"


        # Abfrage: Tastatur-Event ereignet?
        if scene.kb.keys:
            skk = scene.kb.getkey()
            # ESC-Taste zum Beenden gedr�ckt?
            if skk=='esc':
                exit()
            # wechselt Drehrichtung bei Tastaturanschlag
            else:
                self.winkel*=-1



if __name__ == "__main__":
    d1 = Donut()
    d1.start()

Funktionsleiste