2010-11-25 18 views
0

Ich benutze Pygame um eine kleine Szene zu erstellen. Im Moment arbeite ich mit Linien.Python (pygame): Wie kann ich eine Zeile löschen?

Ich habe ein Array von Zeilen, die auf den Bildschirm gezeichnet werden und wenn eine Zeile aus dem Array gelöscht wird, möchte ich die Zeile vom Bildschirm verschwinden.

Das Problem, das ich gefunden habe, ist, dass die Linie auf dem Bildschirm gezeichnet wird und statisch bleibt. Ich kann keine Möglichkeit finden, den Bildschirm zurückzusetzen (ich verwende ein JPEG als Hintergrund).

Gibt es eine Möglichkeit, eine gezeichnete Linie vom Bildschirm zu entfernen?

Dank

Antwort

1

Wenn Sie screen.fill ([0,0,0]) verwenden wird es im Hintergrund füllen (oder was auch immer Sie haben, stellen Sie Ihren Hintergrund sein).

Dies löscht alle auf dem Bild gezeichneten Linien und entfernt im Wesentlichen alles, was auf den Hintergrund gezeichnet wurde.

0

Sie müssen wahrscheinlich den Befehl ausführen, um die Anzeige zu aktualisieren, wie in the documentation erläutert. Der Befehl, um die volle Anzeigefläche zu aktualisieren:

pygame.display.update() 

Es kann möglich sein, ein Argument an die Funktion zu übergeben, um nur den gewünschten Teil zu aktualisieren, die effizienter wäre, aber ohne den vollständigen Code kann ich nicht erzähle dir, was dieses Argument wäre.

4

Obwohl es nicht sehr effizient scheint, denke ich, dass der einfachste und auch der beste Weg es zu tun ist, alles neu zu zeichnen. In vielen Spielen wird der Bildschirm bei jedem Frame komplett neu gezeichnet, auch ohne 3D-Karten (erinnern Sie sich an die alten Doom-Spiele?). Das Zeichnen einiger Zeilen über einen Hintergrund wird also sehr schnell sein, sogar in Python.

würde ich so etwas vorstellen:

import pygame 
import random 

SCREEN_WIDTH = 320 
SCREEN_HEIGHT = 200 

class Line(object): 
    def __init__(self, start_pos, end_pos, color, width): 
     object.__init__(self) 
     self.start_pos = start_pos 
     self.end_pos = end_pos 
     self.color = color 
     self.width = width 

def CreateRandomLine(): 
    rnd = random.randrange 
    start_pos = (rnd(SCREEN_WIDTH), rnd(SCREEN_HEIGHT)) 
    end_pos = (rnd(SCREEN_WIDTH), rnd(SCREEN_HEIGHT)) 
    color = (rnd(255), rnd(255), rnd(255)) 
    width = rnd(10) + 1 
    return Line(start_pos, end_pos, color, width) 

def DrawScene(screen_surface, background_image, lines): 
    screen_surface.blit(background_image, (0, 0)) 
    for line in lines: 
     pygame.draw.line(screen_surface, line.color, \ 
         line.start_pos, line.end_pos, line.width) 

pygame.init() 
screen_surface = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) 
background_image = pygame.Surface(((SCREEN_WIDTH, SCREEN_HEIGHT))) 
background_image.fill((200, 100, 200)) # I kinda like purple. 
# Alternatively, if you have a file for your background: 
# background_image = pygame.image.load('background.png') 
# background_image.convert() 
lines = [] 
for i in range(10): 
    lines.append(CreateRandomLine()) 

for frame_id in range(10): 
    del lines[0] # Remove the oldest line, the one at index 0. 
    lines.append(CreateRandomLine()) # Add a new line. 
    DrawScene(screen_surface, background_image, lines) 
    pygame.display.flip() 
    pygame.time.wait(1000) # Wait one second between frames. 

Dieses Skript zeigt zufällige Linien auf einem Hintergrund. Es gibt 10 Frames, jeder Frame dauert eine Sekunde. Zwischen jedem Rahmen wird die erste Zeile aus der Liste der Zeilen entfernt und eine neue Zeile hinzugefügt.

Entfernen Sie einfach die pygame.time.wait und sehen Sie, wie schnell es geht: D.