Maskieren von Surfaces (pygame)
Verfasst: Donnerstag 30. August 2012, 23:07
Der obige Teil ist jetzt zum Teil bereits gelöst. Es hakt zwar noch an einerHallo miteinander,
ich habe eine kleine Frage eher der Logik halber, ich bin nämlich
mit meinen grauen Zellen hier am Ende. Ich suche eine Möglichkeit,
eine bestimmte stelle innerhalb eines Surfaces durch ein anderes
Surface zu 'maskieren'. Wobei maskieren vllt nicht ganz der richtige
Ausdruck ist, mal zur Veranschaulichung:
surface_one = ein mit diversen Formen/Farben gefüllter Bereich
surface_two = eine einzelne Form zur Maskierung
Nun soll der Teil von surface_two, welcher Daten enthält, an der Stelle von
surface_one Daten entfernen, wo erst genanntes Surface auftrifft.
Sagen wir also surface_two fällt auf surface_one und bestimmt damit
einen Bereich der von surface_one entfernt wird, basierend auf der
Tiefe die surface_two überlappt.
Allerdings stoße ich bei der surfarray methode an eine kleine Grenze,
denn wie soll ich hier feststellen, an welcher Position sich die Pixel gerade befinden?
Lasse ich einfach nur darüber iterieren, wird logischerweise nur der erste Teil verglichen
und der Rest wird ignoriert weil keine Daten zum Vergleichen mehr vorhanden sind.
Ich habe daraufhin versucht, im Modul 'pygame.mask' etwas passendes zu finden,
allerdings komme ich hier zu keinem Ergebnis.
Vielleicht ist die Lösung absolut trivial, aber ich komme einfach nicht darauf.
Bin über kleine Schubser in die richtige Richtung dankbar.
Mit freundlichen Grüßen,
Arach
schnellen und sauberen Umsetzung, aber das kriege ich hoffentlich
auch noch in den Griff. Ich habe jetzt zu Testzwecken einfach die
zu 'maskierenden' Elemente auf zwei unterschiedliche fiktive Layer
gesetzt (in form von Surfaces) und zeichne lediglich an eine bestimmte
Stelle das Objekt, mit dem ich die untere Fläche maskieren möchte.
Später soll dies aus Performance Gründen dann in in kleine subsurfaces
unterteil werden, da sonst eine Maskierung einer 1280x1024 Fläche
relativ rechenaufwendig wäre. Nun hat sich allerdings ein zweites
Problem aufgetan. Ich zeig euch wohl besser erstmal mein Testskript
(bitte ignoriert erstmal das absolut falsche Programmieren an dieser Stelle,
es geht mir jetzt nur eben um eine bestimmte Funktion innerhalb
des skripts):
Code: Alles auswählen
# Testmodul for masking Surfaces
import pygame
import pygame.locals as pgl
layer_one = pygame.Surface((50,50))
layer_two = pygame.Surface((50,50))
pygame.draw.circle(layer_two,(100,255,100),(2,2),15)
layer_one.fill((255,200,200))
screen = pygame.display.set_mode((50,50))
clock = pygame.time.Clock()
run = True
mask_object = pygame.surfarray.pixels3d(layer_two)
base_object = pygame.surfarray.pixels3d(layer_one)
index = [0,0,0]
for element in base_object:
for part in element:
for parts in part:
if mask_object[index[0]][index[1]][index[2]] != 0:
#print('Es wurde folgender Pixel deleted: ')
#print('%i'%(parts))
#print('In Index: %i %i %i'%(index[0],index[1],index[2]))
#print('Von mask: %i'%(mask_object[index[0]][index[1]][index[2]]))
base_object[index[0]][index[1]][index[2]] = 0
index[2] = index[2] + 1
index[2] = 0
index[1] = index[1] + 1
index[1] = 0
index[0] = index[0] + 1
# hier wirds merkwürdig, ich habe trotz aufruf von
# .unlock eine ValueError Excepion bezüglich blockierter
# surfaces. es zeigt stets eine pygame._view.View
# instance auf diese surfaces.
print(layer_one.get_locks())
layer_one.unlock()
layer_two.unlock()
while run:
clock.tick(20)
for event in pygame.event.get():
if event.type == pgl.QUIT:
run = False
screen.fill((0,0,0))
# screen.blit(layer_one,(0,0))
pygame.surfarray.blit_array(screen,base_object)
pygame.display.flip()
pygame.quit()
Code: Alles auswählen
Traceback (most recent call last):
File "D:/python_projekte/pygame_dev/development_files/array_test.py", line 53, in <module>
screen.blit(layer_one,(0,0))
error: Surfaces must not be locked during blit
und nach dem Aufruf stets eine Instanz von pygame._view.View
zurück, die es mir nicht erlaubt, dass Surface ohne die
methode pygame.surfarray.blit_array zu zeichnen.
Ich hoffe man kann mir im neuen Sachverhalt helfen.
MfG Arach