Ja, ich wollte durch die Verwendung einer Klasse nur den Namensraum für die Daten haben. Diesen brauche ich, weil ich einen Slider, um einen nummerischen Wert auszuwählen, so implementiert habe:
Code: Alles auswählen
class Selector:
selectors = []
targetedSelector = None
def __init__(self, x, y, width, start, end, target):
self.x = x
self.y = y
self.width = width
self.height = 30
self.start = start
self.end = end
self.selectors.append(self)
self.sliderx = x + 5
self.slidery = y + 5
self.target = target
self.range = end - start
self.right = self.x + width
self.bottom = self.y + self.height
self.start = start
def colision(self, point):
if point[0] > self.x and point[0] < self.right and point[1] > self.y and point[1] < self.bottom:
return self
def set_state(self, x):
if x > self.x and x < self.right:
self.sliderx = x
self.target(((self.sliderx - self.x) / self.width) * self.range + self.start)
@classmethod
def update(cls, point):
if cls.targetedSelector:
cls.targetedSelector.set_state(point[0])
return True
def _draw(self):
fill(255, 255, 255)
rect(self.x, self.y, self.width, self.height)
line(self.x, self.y + self.height / 2, self.right, self.y + self.height / 2)
ellipse(self.sliderx, self.y + self.height / 2, self.height*0.6, self.height*0.6)
fill(0, 0, 0)
text(((self.sliderx - self.x) / self.width) * self.range + self.start, self.sliderx, self.slidery)
@classmethod
def draw(cls):
for selector in cls.selectors:
selector._draw()
@classmethod
def colisions(cls, point):
for selector in cls.selectors:
if selector.colision(point):
cls.targetedSelector = selector
return selector
@classmethod
def release(cls):
cls.targetedSelector = None
Da es soweit ich weiß in Python keine Referenzen gibt, habe ich Gedacht, dass man den Slidern dann einfach eine Funktion mitgibt, mit dessen Aufrauf dann die zu verändernde Variable verändert wird. Um dann mit der Funktion die Variable verändern zu können musste ich sie aus dem globalen Namensraum in einen seperaten verschieben, weil man die Variablen ja sonst ohne das Verwenden von 'global' nicht verändern kann.
Deshalb auch die Funktion 'valSetter' in Config, um die beschriebene Funktion zu erstellen, und diesen Aufruf zu ermöglichen:
Code: Alles auswählen
Selector(5, 5, 300., 0, 200, Config.valSetter("heightScale"))
Ist das eine gute Lösung, oder gibt es einen besseren Weg die Selector zu implementieren ?
Die Property wollte ich haben, weil der Wert von manchen Variablen ein 'int' sein muss, und ich dann dachte, dass ich im setter der Property dann einfach die Umwandlung machen kann.
Habe es jetzt schlussendlich aber so gelößt:
Code: Alles auswählen
class Config:
noiseDistance = 30
rotationLevelX = 0
rotationLevelY = 0
heightScale = 30
layers = 3
scale = 1
noiseCount = 50
@classmethod
def valSetter(cls, val, func=None):
if func:
def f(x):
cls.__dict__[val] = func(x)
else:
def f(x):
cls.__dict__[val] = x
return f
Code: Alles auswählen
Selector(615, 5, 300., 1, 15, Config.valSetter("layers", int))
Ist zwar nicht wunderlich schön, aber in meinem Fall funktioniert es fürs Erste
