
Noch immer geb ich Gas mit PyGame und das sieht doch schon anständiger aus:

Nun habe ich aber ein neues Projekt begonnen und da geht es weniger taktisch zu - ich mache eine Art Battle City (NES) - Klon (für die die's nicht kennen: 8 BIT Panzergeballere). Nun bin ich ich erstmals auf Performance Probleme gestossen. Es gibt mir schon zu denken, wenn so ein homebrew 8 BIT Klon meinen Quadi zum ächzen bringt, und genau dies ist der Fall. Da die Performance ja von mehreren Faktoren abhängig ist, habe ich mich mal erkundigen wollen, welches "tick" (delta time oder wie auch immer) Ihr da wählen würdet für so ein actionlastiges Game. Bei meinem Tower Defence Zeugs (Screen oben) habe ich einen echt langen Tick von 38 ms. Stört aber nicht weiter und ich habe alle programmiertechnischen Freiheiten - sprich: Ich kann möglichst viel selbst coden und möglichst wenig Pygame Built-In Zeugs benutzen. Genau dies ist auch mein Ziel, denn so hab ich mir meine bescheidenen Kenntnisse soweit beigebracht. Bisher habe ich immer die ganze Szene neu geblittet und den ganzen screen aktualisiert - pygame.display.flip(). In meinem Panzer Game geht das nicht, soweit bin ich schon. Habe auch probiert, auf dem screen nur die relevanten rects mit Hintergrund zu überblitten und diese dann an der neuen Position wieder zu blitten und dann nur die einzelnen Rects upzudaten - pygame.display.update(rectlist). Dies funzt soweit so gut, aber krass Leistung brauchen Kollisionsabfragen...
Das Problem ist Folgendes:
Ich habe 4 Panzer, alle per Pad gesteuert von Spielern. Diese können schiessen, und Tiles sind da auch auf der Map; zum teil zerstörbar, zum Teil nicht. Nun muss ja jeder Panzer in jedem Frame abfragen:
- Bin ich in einem Tile? (Rectkollisionsabfrage mit allen Tiles)
- Bin ich in einem anderen Panzer? (Rectkollisionsabfrage mit allen Gegnern)
- Ist einer meiner Schüsse in einem Tile? (Rectkollisionsabfrage mit allen Tiles)
- Ist einer meiner Schüsse in einem gegn. Panzer? (Rectkollisionsabfrage mit allen Gegnern)
Dies ist ja recht performancelastig... Ich habe das Gefühl, meine eigene Rect Kollisionsabfrage ist nicht sooooooo schlecht; jedoch muss ich, um diese ausführen zu können, jedes Mal die Eckpositionen aller bewegten Objekte updaten. Dafür habe ich eine eigene Methode -> Game_Objekt.blitpos_update(). Game_Objekt ist also quasi meine "Sprite" Klasse. Das fiese ist nur, dass ein pygame.rect.Rect - Objekt im Gegensatz zu meinem Game_Objekt automatisch alle Positionen aktualisiert, wenn man nur eine davon verändert - z.Bsp. wenn man codet: self.rect.centerx += 2 , dann ist auch self.rect.topleft und alles andere angepasst! Das verstehe ich nicht! self.rect.centerx += 2 ist eine Neuzuweisung, wieso kann diese Instanzvariablen verändern? Was geht da ab..? Kann ich selbst sowas coden?
Zum anderen:
Wie genau (im Sinne von zeitlich exakt) arbeitet Pygame? Kann ich damit überhaupt einen Plattformer mit schöner Leistung coden? Welches Tick soll ich nehmen? Ich habe einiges probiert, aber auch wenn ich nicht das ganze Bild jedes Frame update sondern mit Hintergrund überblitte etc und smooth animiere, habe ich das Gefühl, dass es ruckelt, egal welches delta time ich bestimme (auch ohne Kollisionsabfragen etc).
Sorry für den allumfassenden Thread... und bin für jede Antwort dankbar! (Sofern diese denn konstruktiver Natur ist, wohlverstanden

Es grüsst: