ich hab ein nerviges Problem. Ich code zurzeit an einem Micro Machines - Klon (ein bisschen SNES like). Hab soweit schon ziemlich was beisammen und im wenn man allein spielt, funktioniert das ganz gut. Ich rendere alles auf einen Buffer 320 x 240 und skaliere das ganze dann hoch. Das Level besteht aus einem Hintergrund Sprite, dem Level Sprite, dem Track Sprite und dann werden noch die Hindernisse geblittet. Es werden immer nur diejenigen Ausschnitte (areas) aus den Surfaces geblittet, die gerade auf dem Bildschirm sind. Demnach befindet sich der Bildausschnitt nicht immer am selben Ort - das Bild "fährt mit". Ich errechne also jedes Frame die topleft Position, wo sich der Bildschirm befindet, und dies anhand der Position des Fahrzeugs. Mit einem Player funktioniert das wunderbar, aber wenn man zu zweit spielt, soll ja der Mittelpunkt zwischen beiden Autos die Mitte des Bildschirms sein, daraus errechne ich dann die topleft Position des Screens. Soweit, so gut und das stimmt soweit auch, aber wenn man zu zweit spielt und beide Autos in dieselbe Richtung fahren mit konstanter Geschwindigkeit, dann ruckelt's irgendwie. Nicht von wegen Performance oder so; ich habe das Gefühl dass es daran liegt, dass der errechnete Mittelwert nun manchmal ein float ist (bei einem Spieler ist's ja einfach immer ein int, da geht's immer auf). Aber auch wenn ich die errechnete Position runde mit round() ruckelt's noch immer, obwohl das Prinzip genau immer dasselbe ist...
evtl. hilft ein wenig Code:
Diese Methode errechnet die topleft pos vom Bildschirm (Game.screenpos):
Code: Alles auswählen
def screenpos_update(self):
n = len(self.cars)
if n == 1:
car = self.cars[0]
x = car.rect.centerx - RES[0] / 2
y = car.rect.centery - RES[1] / 2
else:
x_sum = 0
y_sum = 0
for car in self.cars:
x_sum += car.x
y_sum += car.y
mid_x = x_sum / n
x = round(mid_x - self.res[0] / 2)
mid_y = y_sum / n
y = round(mid_y - self.res[1] / 2)
if x < 0:
x = 0
elif x > self.level.rect.width - self.res[0]:
x = self.level.rect.width - self.res[0]
if y < 0:
y = 0
elif y > self.level.rect.height - self.res[1]:
y = self.level.rect.height - self.res[1]
self.screenpos = (x, y) # topleft
Danke
Henry