AMIGA-RESISTANCE
https://forum.amiga-resistance.info/

Primitives wieder löschen ?
https://forum.amiga-resistance.info/viewtopic.php?f=38&t=1656
Seite 1 von 1

Autor:  p-OS [ 12 Feb 2008, 10:44 ]
Betreff des Beitrags:  Primitives wieder löschen ?

Hallo,

komplexe Objekt wie Brushes kann man ja jederzeit wieder löschen. die sog. Promitives wie Linien und Boxen hingegen nicht; haben ja auch keine id, übder die man sie referenzieren könnte.

Wie kann ich sowas am besten wieder löschen, vor allem im Hinblick darauf, der der Hintergrund evtl. sich mittlerweile geändert hat ?

Mir fällt momentan nur die Möglichekit ein, die Linie nochmal zu malen, aber mit Transparenz=100%.

Bessere Ideen ?

Autor:  Clyde [ 12 Feb 2008, 10:52 ]
Betreff des Beitrags: 

Hm, habe mich noch nicht damit beschäftigt, aber spontan würde ich die Primitiven in Layer packen (vorher EnableLayers() aufrufen) und dann kannst Du einfach den entsprechenden Layer löschen, in dem sich die Primitiven befinden.

Wie sieht denn der Code zum Zeichnen und Anzeigen einer Box aus (hab die Doku ja leider nicht hier auf Arbeit :-( )?

Autor:  p-OS [ 12 Feb 2008, 10:56 ]
Betreff des Beitrags: 

Box (x,y,breite,höhe,farbe)

Autor:  Clyde [ 12 Feb 2008, 11:02 ]
Betreff des Beitrags: 

Hm ... Naja, dann scheint mein Vorschlag mit dem Layern sicher erstmal der beste bzw. funktionierende zu sein. Was hältst Du davon?

Autor:  p-OS [ 12 Feb 2008, 11:17 ]
Betreff des Beitrags: 

Das Kapitel zu den Layern hab ich mir noch nicht durchgelesen. Ist zwar ein wichtiger Punkt in Hollywood. Aber wollte mich erstmal mit den Basic´s vertraut machen, also "Datentypen", Verwendung von Tables, Funktionsdefinitionen, Parameterhandling, Initialisierung, Syntax allgemein...

Autor:  Clyde [ 12 Feb 2008, 11:30 ]
Betreff des Beitrags: 

Ist klar, so mache ich das auch. Habe mich nur durch eine Hilfe-Mail in der Mailingliste mal etwas damit beschäftigt. Ich denke aber, mit den Layern wird Dir dann geholfen sein. Mal sehen, ob es aber noch andere Wege gibt. Wenn ich was finden sollte, melde ich mich.

Autor:  p-OS [ 12 Feb 2008, 12:17 ]
Betreff des Beitrags: 

So, hab mich jetzt mal eingelesen.
Grds. sind Layer der richtige Weg.
Auch eine Box ist demnach ein Layer.

Allerdings seh ich ein großes Problem:
Um einen Layer anzusprechen, benötigt man dessen id. Die kann sich während der Laufzeit aber jederzeit ändern (aufgrund anderer Layer).
Man kann zwar jedem Layer eine eindeutige, unveränderliche Bezeichnung mittels SetLayerName() verpassen.
Nur setzt das voraus, daß man die zu dem Zeitpunkt aktuelle id weiß.

Wenn man eine feste Abfolge der Erzeugung (Präsentationen etc.) hat, kein Problem, aber wenn der Zeitpunkt bzw. die Reihenfolge variiert ?

Autor:  Clyde [ 12 Feb 2008, 12:34 ]
Betreff des Beitrags: 

Ja, das ist mir auch schon aufgefallen. Deswegen steht auf meiner Andreas-Hollywood-Wunschliste da auch eine GetLayerId() drauf. :-) Sowas scheint es ja nicht zu geben, wäre aber echt sinnvoll.

In dem Zusammenhang: Verstehe ich das richtig, dass man nur _ein_ Objekt in einen Layer legen kann? Cooler wäre es doch, mehrere Objekte auf einen Layer zu legen und dann einfach Effekte wie Transparenz auf den Layer anzuwenden, um 100 Objekte transparent zu machen, anstatt das 100 mal selbst zu programmieren. Oder weißt Du, ob man mehrere Objekte einem Layer zuordnen kann?

Autor:  p-OS [ 12 Feb 2008, 13:05 ]
Betreff des Beitrags: 

Ohne ein GetLayerId() kann man eine Verwendung in wiederverwendbaren Funktionen praktisch vergessen.

So wie ich das seh, ist jedes Objekt ein eigener Layer. Mehrere Objekte (z.B. die Linien eines Dreiecks) erfordern also mehrfache Aktionen. Man kann natürlich die Objekte der Einfachheit halber in einer table gruppieren.
dreieck=Function(x1,y1,x2,y2,x3,y3)
             Local tabelle
             tabelle=
            {
              linie1_id
              linie2_id
              linie3_id
              settransparency=Function(value)
                                         SetLayerTransparency(tabelle.linie1_id,value)  
                                         SetLayerTransparency(tabelle.linie2_id,value)  
                                         SetLayerTransparency(tabelle.linie3_id,value)  
                                       EndFunction
             }
             Line(x1,y1,x2,y2,#BLACK)
             tabelle.linie1_id=1            
             Line(x2,y2,x3,y3,#BLACK)
             tabelle.linie2_id=2
             Line(x3,y3,x1,y1,#BLACK)
             tabelle.linie3_id=3
             Return(tabelle)
             EndFunction

EnableLayers()
obj1:=dreieck(2,2,100,100,200,200)
obj1.settransparency(177)
Sicher noch verbesserungswürdig, aber etwa so im Prinzip.

Autor:  Clyde [ 12 Feb 2008, 13:12 ]
Betreff des Beitrags: 

Yup, coole Sache! Muss ich mir heute Abend mal genauer anschauen. Klasse!

Autor:  p-OS [ 12 Feb 2008, 14:41 ]
Betreff des Beitrags: 

Hab mir das mit GetLayer() nochmal durchn Kopf gehn lassen. Eine Funktion, die einfach die id des zuletzt erzeugten Layers liefert, ist nicht unproblematisch, da evtl. zwischenzeitlich ja ein andrer Layer erzeugt worden sein könnte, und zwar von einer Funktion, die mittels SetInterval() gestartet wird.

Am besten wäre es wohl, wenn jeder Layer beim Erzeugen einfach eine eindeutige, unveränderliche id zurückgeben würde.

Autor:  Clyde [ 12 Feb 2008, 14:56 ]
Betreff des Beitrags: 

Verdammt. Hast recht. :-) Hm, hast Du mal probiert, ob das die Layerfunktion nicht einfach macht und es ist vielleicht nur nicht dokumentiert? Ich probier das auf alle Fälle dann mal. Ansonsten ändere ich dann noch mein feature request hier.

Danke für's Mitdenken!

Autor:  Robin [ 12 Feb 2008, 15:46 ]
Betreff des Beitrags: 

Und wenn ihr einfach ein leeren,tranparenten Brush erzeugt ?
Dort rein einfach eure Line,Box etc ... und wenn ihr löschen
wollt einfach die Brush kicken.

Autor:  p-OS [ 12 Feb 2008, 16:15 ]
Betreff des Beitrags: 

@Robin:
Der GEdanke ist mir inzwischen auch gekommen. Nur bin ich mir nicht sicher, ob der Brush dann nicht eindach als separates Display gilt, innerhalb dessen jedes Grafikobjekt einen eigenen Layer repräsentiert.

Autor:  Clyde [ 12 Feb 2008, 19:30 ]
Betreff des Beitrags: 

Clyde hat geschrieben:
Hm, hast Du mal probiert, ob das die Layerfunktion nicht einfach macht und es ist vielleicht nur nicht dokumentiert? Ich probier das auf alle Fälle dann mal.
Hab's probiert, die InsertLayer()-Methode liefert nur "nil" zurück. :-( Schade.

EDIT: Ach, ist ja auch Quatsch, bei InsertLayer() gebe ich ja sogar die Id mit. Dennoch kommt man nicht ran. Besser wäre es, das Objekt, dass man einfügt, kennt seine eigene Layer-Id, da sich die Ids ja ändern können, wenn man neue Layer einfügt, wie wir schon festgestellt haben.

Seite 1 von 1 Alle Zeiten sind UTC

Powered by phpBB® Forum Software © phpBB Limited

Deutsche Übersetzung durch phpBB.de