2009-06-14 3 views
2

Ich arbeite jetzt schon eine Weile daran. Sie könnten es auch eine "umgekehrte Maske" oder eine "inverse Maske" nennen.Gibt es irgendwelche Gedanken darüber, wie man einen echten "Punch-out" -Bereich in einem Sprite erstellt?

Grundsätzlich erstellen ich ein Ansichtsfenster innerhalb eines Anzeigeobjekts. Ich muss zulassen, dass Objekte auf der Bühne, die sich unter dem Fenster befinden, mit der Maus interagieren können.

Dies ist vergleichbar mit einer WPF-Frage: Use WPF object to 'punch' hole in another?, die eine viel kürzere Writ-up hat.

Ich habe eine Klasse namens PunchOutShield, die einen Sprite erstellt, der die Bühne (oder über einen gewünschten Bereich) abdeckt. Das Graphics-Objekt von Sprite wird mit der Farbe und Transparenz des Modal-Bildschirms von Flex gefüllt. Das Ergebnis ist ein Bildschirm, der aussieht wie der Bildschirm, der hinter einem modalen PopUp erscheint.

PunchOutShield hat eine Methode namens punch, die zwei Argumente akzeptiert - das erste ist ein Shape-Objekt, das die Form des Durchgriffsbereichs definiert; Das zweite ist ein Point-Objekt, das angibt, wo der Durchstoßbereich positioniert werden soll.

Es dauerte einige Experimente, aber ich fand, dass ich erfolgreich einen Punch-out-Bereich erstellen kann (d. H. - der modale Bildschirm wird nicht innerhalb der Grenzen der angegebenen Shape angezeigt). Um dies zu tun, setze ich cacheAsBitmap auf dem Sprite, der zum Erstellen des modalen Bildschirms verwendet wird, auf True und auf das Shape-Objekt, das dem modalen Bildschirm Sprites displayList hinzugefügt wird.

Wenn ich den Mischmodus der Form auf ERASE einstelle, wird ein vollständig transparenter Bereich im modalen Bildschirm erstellt. So weit, großartig.

Das Problem ist, dass Shape InteractiveObject nicht unterklassifiziert, so dass es keine Möglichkeit gibt, mouseEnabled = false darauf festzulegen. Auf diese Weise wird die Interaktion zwischen der Maus und Objekten verhindert, die im Punch-Out-Bereich sichtbar sind.

Darüber hinaus ist InteractiveObject nicht verfügbar, um zu sehen, so kann ich nicht sehen, ob es eine Möglichkeit gibt, zu leihen, was es tut, um die mouseEnabled Funktionalität bereitzustellen und es auf eine Unterklasse von Shape anwenden.

Ich habe versucht, ein anderes Sprite-Objekt, anstatt ein Shape-Objekt, aber die Mischung funktioniert nicht richtig. Ich bin mir nicht sicher, warum es einen Unterschied gibt, aber das Shape-Objekt scheint irgendwie mit dem Erziehungs-Sprite zu kombinieren, wodurch der ERASE-Blend-Modus das gewünschte Punch-Out-Erscheinungsbild erzielen kann.

Es wäre nicht das Ende der Welt, wenn ich den Bildschirm mit einer Reihe von Rechtecken aufstellen müsste, so dass der Punch-Out-Bereich einfach nicht gezeichnet wurde, aber dieser Ansatz wird nicht funktionieren, wenn der Schlag Die Fläche ist komplex. Oder rund.

Irgendwelche Gedanken zu diesem Ansatz oder zu einem alternativen Ansatz?

+0

Eine Antwort auf diese hier zu finden: http://stackoverflow.com/questions/554631/flash-actionscript-draw-a-display-object-onto-another Sie nicht haben Zugriff auf ein Objekt als Bitmap, wenn Sie es als Bitmap zwischenspeichern, aber ich hatte nicht daran gedacht, ein Bitmap des PunchOutShields zu erstellen.Ich werde das versuchen, wenn ich etwas Zeit habe und die Ergebnisse veröffentlichen. –

+0

Eine weitere mögliche Informationsquelle dazu: JSFL hat eine document.punch() -Methode, die genau das macht, wovon ich spreche (nimmt eine Form an und stampft durch andere Ebenen). Dies ist zumindest im Flash Player nachweisbar. –

Antwort

0

Gibt es einen Grund, warum Sie die mask-Eigenschaft von DisplayObject nicht verwenden können? Dadurch können Sie ein Loch in ein beliebiges Anzeigeobjekt einfügen.

+0

Hey, Jacob. Vielen Dank für die Antwort. Das Festlegen einer Maske würde es mir ermöglichen, einen sichtbaren Bereich des DisplayObject zu definieren. In diesem Fall habe ich einen "Bildschirm" (ein halbtransparenter Sprite, der die Bühne bedeckt). Ich möchte ein Loch in diesen "Bildschirm" legen - sagen wir, ein rechteckiger Bereich 400 x 200. Wenn Sie eine Maske auf dem "Bildschirm" einstellen, wird der Bildschirm nur in diesem 400 x 200 Bereich angezeigt. Was ich tun möchte, ist, dass der Bildschirm normal angezeigt wird, _except_ für diesen rechteckigen Bereich von 400 x 200. Grundsätzlich der umgekehrte Vorgang der normalen Maskierung. –

+0

Ich denke ich verstehe jetzt. Ein Ansatz kann darin bestehen, die Maske nicht dynamisch zu zeichnen, sondern eine große Rechteckmaske mit einem Loch zu erzeugen, das groß genug ist, um den ausgeschnittenen Bereich durch Bewegen der Maske auf die Bühne zu bringen. – Jacob

+0

Das ist kein schlechter Plan, aber das muss dynamisch erstellt werden. Außerdem möchte ich in der Lage sein, jede Form zu verwenden, nicht nur Rechtecke. Ihr Vorschlag würde jedoch funktionieren, wenn ich ein Duplikat von allem unter dem "Bildschirm" erstellt und der Anzeigeliste über dem Bildschirm hinzugefügt und den duplizierten Inhalt mit dem Shape als Kind eines InteractiveObject maskiert hätte. Würde nicht gut skalieren, aber ist definitiv etwas zum Nachdenken. –

Verwandte Themen