def _update_surfaces(self):
        """Updates rectangles in self.oldrects to reduce latency. If the list is empty, update the
        entire screen."""
        if self.oldrects:
            pygame.display.update(self.oldrects)
            self.oldrects = []
        else:
            pygame.display.flip()

    def _check_events(self):
        """Respond to events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    # Move the ship to the right.
                    self.ship.rect.x += 1
                    
    def _update_screen(self):
        """Update surface rects, update individual surfaces on the screen."""
        self.screen.fill(self.settings.bg_color)
        self.char.blit()

        self._add_old_rect(self.char) # Add surface to old list
        self._update_surfaces() # Update individual surfaces

    def run_game(self):
        """Start main game loop."""
        self.screen.fill(self.settings.bg_color)
        self._update_surfaces() # Update sceen
        while True:
            self._check_events()
            
            self._update_screen()

पायगेम दस्तावेज़ीकरण में, यह कहा गया है कि स्क्रीन को अपडेट करने का सबसे अच्छा अभ्यास पूरे डिस्प्ले के बजाय अलग-अलग रेक्ट्स को ब्लिट करना है। मैंने इसे यहां करने का प्रयास किया है, लेकिन जब चरित्र स्क्रीन पर चलता है, तो उनकी पिछली स्थिति की एक प्रति पीछे रह जाती है। मेरा मानना ​​​​है कि यह स्क्रीन अपडेट को संभालने के तरीके से संबंधित है, क्योंकि जब मैं अलग-अलग रेक्ट्स के बजाय पूरी स्क्रीन को रीफ्रेश करता हूं, तो यह ठीक काम करता है।

यहां दस्तावेज़ीकरण ट्यूटोरियल लिंक है जिसे मैं लागू करने का प्रयास कर रहा था: डर्टी रेक्ट एनिमेशन (newbieguide से) ए>

0
pyknight202 1 जिंदा 2020, 22:27

1 उत्तर

सबसे बढ़िया उत्तर

self.screen.fill(self.settings.bg_color), हालांकि, पूरी स्क्रीन को एक पृष्ठभूमि रंग से भर देता है pygame.display.update(self.oldrects) केवल आपके चरित्र के साथ सतह को अपडेट करता है। निशान को गायब करने के लिए आपको पूरी स्क्रीन को अपडेट करना होगा:

def _update_surfaces(self):
    pygame.display.flip()

इसे और अधिक कुशल बनाने के लिए, अपडेट करें कि आपके रेक्ट्स पहले कहां थे:

def _update_surfaces(self):
    """Updates rectangles in self.oldrects to reduce latency. If the list is empty, update the
    entire screen."""
    if self.oldrects:
        pygame.display.update(self.prevoldrects)
        pygame.display.update(self.oldrects)

        self.prevoldrects = self.oldrects.copy() # list.copy makes a new list instead of copying the reference
        self.oldrects = []
    else:
        pygame.display.flip()
1
Tiberiu Telcean 3 जिंदा 2020, 11:21