Seite 1 von 1

Referenzen Problem

Verfasst: Montag 5. Juni 2006, 14:24
von sonium

Code: Alles auswählen

import pygame
from pygame.locals import *
pygame.init()

screen = pygame.display.set_mode((320, 240))
screen.fill((0,255,0))


square =  pygame.Surface((10,10))
square.fill((0,0,255))
rect = pygame.Rect((0,0),square.get_size())

screen.blit(square, rect)
pygame.display.flip()
clock = pygame.time.Clock()

interpolators = {}

class interpolator:
	def __init__(self):
		pass
	def update(self):
		pass
		
class int_pos(interpolator):
	def __init__(self, pos1, pos2, time):
		interpolator.__init__(self)
		self.time = time
		self.pos1 = pos1
		self.pos2 = pos2
		self.etime = 0.0
	def update(self):
		self.etime += clock.get_time()
		if self.etime > self.time:
			return None
		else:
			return self.pos1 * ((self.etime - self.time)/self.time) + self.pos2 * (self.etime/self.time)
		
		
def update_interpolators():
	a = []
	for i in interpolators:
		value = i.update()
		if value is not None:
			interpolators[i] = i.update()
		else:
			a.append(i)
	for i in a:
		del interpolators[i]

interpolators.update({int_pos(0, 100, 5000): rect.centerx})


while 1:
	clock.tick(20)
	update_interpolators()
	print rect.centerx
	screen.fill((0,255,0))
	screen.blit(square, rect)
	pygame.display.flip()
Also ich will ein Attribute mit einem Interpolator Objekt so verbinden, dass jedesmal wenn ich die update funktion des Objektes aufrufe das Attribute aktualisiert wird. Eigentlich dachte ich, dass das ganz einfach wäre, weil ja alles Referencen sind. Auf Attribute scheint das jedoch nicht zu zu treffen. Jednefalls ändert sicher der wert nicht.

Weiß jemand Abhilfe?

Verfasst: Montag 5. Juni 2006, 15:24
von sonium
ok, hab schon ne lösung gefunden. Nämlich objekt und attribute voneinander trennen und erst bei bedarf per __setattr__ zusammensetzen.

Re: Referenzen Problem

Verfasst: Dienstag 6. Juni 2006, 06:57
von BlackJack
sonium hat geschrieben:Also ich will ein Attribute mit einem Interpolator Objekt so verbinden, dass jedesmal wenn ich die update funktion des Objektes aufrufe das Attribute aktualisiert wird. Eigentlich dachte ich, dass das ganz einfach wäre, weil ja alles Referencen sind. Auf Attribute scheint das jedoch nicht zu zu treffen. Jednefalls ändert sicher der wert nicht.

Weiß jemand Abhilfe?
Wenn ich die Frage verstehen würde. Ausser `etime` veränderst Du kein Attribut. Funktioniert das nicht?

Ein paar Anmerkungen zum Quelltext:

Man sollte Funktionen immer so unabhängig wie möglich machen, also den Informationsfluss so gestalten das Informationen nur über die Parameter und den Rückgabewert hinein bzw. hinaus gelangen. So lässt sich das Programm viel einfacher verstehen und einzelne Funktionen isoliert testen. `update_interpolators()` könnte man zum Beispiel so schreiben und aufrufen:

Code: Alles auswählen

def update_interpolators(interpolators):
    result = dict()
    for interpolator in interpolators:
        value = interpolator.update()
        if value is not None:
            result[interpolator] = value
    return result

# ...

interpolators = update_interpolators(interpolators)
In Deiner Funktion wurde die `update()` Methode auf den Interpolator Objekten übrigens zweimal aufgerufen.

Und `i` als Schleifenvariable für etwas anderes als ganze Zahlen zu verwenden ist für viele Programmierer verwirrend, weil das die klassische Integer-Zählvariable ist.

Klassennamen bitte in "CamelCase" schreiben, also `IntPos`. Das ist Konvention bei Python und macht es einfacher Klassen von anderen Objekten zu unterscheiden.

Die `interpolator` Klasse brauchst Du übrigens nicht. Solange Du keine echte Funktionalität in einer Basisklasse hast, solltest Du sie weglassen.