{lang: 'de'}
Flashhilfe.de - Flash Community

MovieClips von Bühne löschen [Flash 8]

 


AntwortenRegistrieren Seite1 2  

Jule88#1
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

12.06.2010, 14:47

Tach zusammen,

Ich habe ein kleines "Malprogramm" bei dem ich mit verschiedenen Objekten in einer .swf malen kann. Nun meine frage: wie kann ich das gemalte wieder löschen, nachdem man den entsprechenden Button drückt. Ich hab schon sämtliche Varianten mit "remove", "clear" und "delete" versucht, aber bekommen es einfach nicht hin.

Hier der Code, zum zeichnen. Am Ende befindet sich der Button, über den das gemalte wieder gelöscht werden soll.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//erster Buttons zum zeichnen
btn1.onRelease = function () {
     rot=true;
     blau=false;
};

//zweiter Button zum zeichnen
btn2.onRelease = function () {
     rot=false;
     blau=true;
};

var a:Number = 0;
var i:Number = 0;

var rot, blau;

onMouseDown = function () {
     onMouseMove = function () {
     a++;
     i++;
        
     if(rot) {
        var grafik:MovieClip = attachMovie("grafik1", "grafik1" + a, i);
        musik(_xmouse, _ymouse);
     }
     if(blau) {
        var grafik:MovieClip = attachMovie("grafik2", "grafik2" + a, i);
        musik(_xmouse, _ymouse);
     }
        
     grafik._y_ymouse;
     grafik._x = _xmouse;
              
     grafik._rotationMath.sin(i) * 400;
        
     }      
}      

   
onMouseUp = function(){ //Löschen wenn ohne Mausdrücken zeichnen soll
      delete onMouseMove
}


//gezeichnete wieder löschen
clear_btn.onRelease = function() {
     removeMovieClip(grafik);
}


Vielen Dank schon im Voraus für die Hilfe!
Schlagwörter: malen, Movieclip löschen
micB#2
Benutzerbild von micB
Beiträge: 186
Registriert: Jun 2009

12.06.2010, 16:26

dein bild besteht nicht aus 1 movieClip, der grafik heisst.
du erstellst bei jedem mouseMove einen neuen movieclip und jeder davon wird erst einmal "grafik" genannt.
allerdings ist das kein instanzname, auf den du später zurückgreifen kannst.
die bezeichnung ist nur beim erstellen innerhalb der move-funktion gültig.

du könntest jetzt jedem movieclip einen instanznamen mitgeben und dann alle einzeln anhand ihres namens finden und löschen.
oder aber du gehst einfacher vor und zeichnest nicht auf die bühne, sondern alle grafik-clips in einen container, den du dann mit kompletten inhalt löschen kannst.
ActionScript:
1
2
3
4
var a:Number  = 0;
var i:Number = 0;
var container:MovieClip = this.createEmptyMovieClip("container", this.getNextHighestDepth());
var rot, blau;

im moveScript dann die grafiken in den container:
ActionScript:
1
2
3
_root.container.attachMovie("Grafik2", "grafik"+a, i);
_root.container["grafik"+a]._y = _ymouse
_root.container["grafik"+a]._x = _xmouse


im clear-button container löschen und gleich wieder neu anlegen für nächstes bild:
ActionScript:
1
2
3
4
5
clear_btn.onRelease = function() {
       _root.container.removeMovieClip()
     var container:MovieClip = _root.createEmptyMovieClip("container", this.getNextHighestDepth());
     
}
Jule88#3
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

12.06.2010, 17:16

Super, funktioniert wirklich klasse, wie ich es wollte. Vieeelen Dank!!
Du hast mir meinen Tag gerettet ;)

Eine Frage hätte ich aber noch: ist es auch möglich, immer nur einen Schritt rückgängig zu machen, also quasi einen "undo-Button"?

Viele Grüße
Jule
jomac#4
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

12.06.2010, 17:41

Du kannst einfach den letzten MovieClip entfernen und a oder i um eins senken (also ein einziges Element des Arrays entfernen; genau gleich wie den ganzen container).
Warum benutzt du eigentlich a und i? a ist doch == i?
Jule88#5
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

12.06.2010, 19:30

Danke für deine Antwort. Das klingt vom Prinzip her logisch, allerdings weiß ich nicht genau wie ich das umsetzen soll. Ich muss sagen ich bin absolute ActionScript Anfängerin und mache das für ein Hochschul-Projekt.

Könntest du mir vielleicht sagen, wie das aussehen müsste? Ich wäre dir sehr dankbar.

Und ja mit a und i hast du recht, ist das Gleiche. Weiß auch nicht was ich mir dabei gedacht habe. Wohl nicht so viel...
jomac#6
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

12.06.2010, 20:53

Z.B. so:
ActionScript:
1
2
3
4
5
myBackButton.onRelease = function(){
  if(i > 0){
    _root.container['grafik' + --i].removeMovieClip(); // in einer Klammer wäre --i noch etwas schöner ;)
}
}
Jule88#7
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

12.06.2010, 21:19

Danke! Das kommt der Sache schon sehr nahe. Allerdings bleibt komischer weise immer das zu letzt gezeichnetet Objekt stehen und erst ab dem vorletzten werden die Movieclips gelöscht.

Kann man auch anstatt die einzelnen Objekte zu löschen die letzte komplette Zeichnung löschen?
Denn mit einer Mausbewegung, je nach dem wie lang sie ist, wird ja eine Reihe von Objekten gezeichnet. Sodass nun nicht davon die einzelnen Objekte gelöscht werden sondern, die komplette letzte Mausbewegung bzw. Zeichnung.
jomac#8
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

12.06.2010, 23:06

Ich habe erst jetzt gesehen, dass du zuerst i erhöhst und nachher den MovieClip erstellst, dann müsstest du i-- nehmen.
Dein Problem ist eigentlich ziemlich einfach zu lösen.
Bei onmoueseDown speicherst du i z.B. in einem Array und bei onmouseUp wieder. Jetzt kannst du alle Elemente von onmouseDown bis onmouseUp entfernen. Es gäbe natürlich noch viele andere Möglichkeiten.
Bei deinem Beispiel oben sähe das dann so aus:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var history:Array;
onMouseDown = function(){
  history[history.length] = new Array(i, i);
  onMouseMove = function(){
    if(rot){
     _root.container["grafik" + i].attachMovie("grafik1", "grafik1" + i, i);
     musik(_xmouse, _ymouse);
    }else if(blau) {
     _root.container["grafik" + i].attachMovie("grafik2", "grafik2" + i, i);
     musik(_xmouse, _ymouse);
    }
    _root.container["grafik" + i]._y_ymouse;
    _root.container["grafik" + i]._x = _xmouse;   
    _root.container["grafik" + i]._rotationMath.sin(i) * 400;
    i++;
  }
}

onMouseUp = function(){ //Löschen wenn ohne Mausdrücken zeichnen soll
history[history.length - 1][1] = i;
  delete onMouseMove
}

backButton.onRelease = function(){
  if(history.length > 0){
    var n = history[history.length - 1][0];
    i = n;
    while(n < history[history.length - 1][1]){
     _root.container['grafik' + n++].removeMovieClip();
    }
    history.length--;
  }
}

Ich hoffe ich habe keine Fehler gemacht ;), sonst sag einfach wieder Bescheid, aber sollte grösstenteils stimmen.
Jule88#9
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

12.06.2010, 23:35

Vielen Dank für deine Mühe!
Aber leider funktioniert das irgendwie nicht richtig.
Jetzt kann ich nämlich gar nicht mehr zeichnen, somit weiß ich auch nicht ob der "back Button" funktioniert ;)

Ersetzt ich jedoch diese Zeile, wie du sie mir gerade geschrieben hattest:

ActionScript:
1_root.container["grafik" + i].attachMovie("grafik1", "grafik1" + i, i);


mit dieser Zeile bzw. in diese Schreibweise:

ActionScript:
1_root.container.attachMovie("grafik1", "grafik"+i, i);


dann kann ich wieder zeichnen. Jedoch geht dann der "back Button" nicht :(
jomac#10
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

12.06.2010, 23:45

Das ist wegen copy&paste aus dem oberen Beitrag... sry
Kannst du evtl die FLA-Datei hochladen? Dann wäre es einfacher und ich kann kurz testen, was ich schreibe ;)
Wenn ich es nur hier im Forum direkt schreibe passieren mir leider sehr schnell Fehler... insbesondere wenn der Code zusammenkopiert ist.
Jule88#11
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

12.06.2010, 23:52

Ja klar verständlich :)

Hier die .fla. Der Code zum zeichnen fängt erst bei Zeile 517 oder so an, das davor einfach ignorieren, ist nur damit Musik beim Zeichnen erzeugt wird :)

Die Maske .swf Datei, ist damit die Buttons zu sehen sind.

Angehängte Dateien:
Komprimierte Datei WiiBrush.rar66.29 KB
Geändert von Jule88 am 12.06.10 um 23:52 Uhr
jomac#12
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

13.06.2010, 00:22

OK, hat etwas lange gedauert...
Folgendes ab Zeile 560 bis Ende ersetzen:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
var i:Number = 0;


var container:MovieClip  = this.createEmptyMovieClip("container", this.getNextHighestDepth());

var rot, blau, weis, gelb, lila;

var history:Array = new Array;

onMouseDown = function () {
     history[history.length] = new Array(i, i);
     onMouseMove = function () {
     if(rot) {
        _root.container.attachMovie("grafik1", "grafik" + i, i);
          musik(_xmouse, _ymouse);
     }
     else if(blau) {
        _root.container.attachMovie("grafik2", "grafik" + i, i);
          musik(_xmouse, _ymouse);
     }
     else if(weis) {
        _root.container.attachMovie("grafik3", "grafik" + i, i);
        musik(_xmouse, _ymouse);
     }
     else if(gelb) {
        _root.container.attachMovie("grafik4", "grafik" + i, i);
        musik(_xmouse, _ymouse);
     }
     else if(lila) {
        _root.container.attachMovie("grafik2", "grafik" + i, i);
        musik(_xmouse, _ymouse);
     }
     
     _root.container["grafik"+i]._y = _ymouse;
     _root.container["grafik"+i]._x = _xmouse;
     
     _root.container["grafik"+i]._y = _ymouse;
     _root.container["grafik"+i]._x = _xmouse;
     
     _root.container["grafik"+i]._xscale = 30;
     _root.container["grafik"+i]._yscale = 30;
     
     _root.container["grafik"+i]._rotation = Math.sin(i) * 400;
     _root.container["grafik"+i]._alpha = Math.random() * 50;
     
     _root.container["grafik"+i]._rotation = grafik2["grafik5" + (i - 1)]._rotation + Math.random() * 50 - 25;
 
        history[history.length - 1][1]++;
        i++;
     }      
}      

   
onMouseUp = function(){
  if(history[history.length - 1][0] == i){
        undoFunction();
     }
       delete onMouseMove
}

clear_btn.onRelease = function() {
      _root.container.removeMovieClip()
      var container:MovieClip = _root.createEmptyMovieClip("container", this.getNextHighestDepth());
      
}

undoFunction = function(){
     if(history.length > 0){
        var n = history[history.length - 1][0];
        i = n;
        while(n < history[history.length - 1][1]){
           _root.container['grafik' + n++].removeMovieClip();
        }
        history.length--;
     }   
};

undo_btn.onRelease = undoFunction;


PS: was mir jetzt gleich noch aufgefallen ist setzt du den Wert _rotation aus einem bestimmten Grund 2 Mal?
ActionScript:
1
2
3
4
5
    
     _root.container["grafik"+i]._rotation = Math.sin(i) * 400;
     _root.container["grafik"+i]._alpha = Math.random() * 50;
    
     _root.container["grafik"+i]._rotation = grafik2["grafik5" + (i - 1)]._rotation + Math.random() * 50 - 25;
Geändert von jomac am 13.06.10 um 00:26 Uhr
Jule88#13
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

13.06.2010, 00:37

Wow! Vielen, vielen vielen Dank!!! Funktioniert super!

Du hast mir damit wirklich sehr geholfen :)

Danke für deine Mühe!
Jule88#14
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

13.06.2010, 00:50

Wegen dem Rotation: Ja das hatte den Grund, das sich eine Grafik anders drehen sollte als die andere, daher zweimal.
jomac#15
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

13.06.2010, 00:53

Das macht sie aber im momentanen Fall nicht mehr bzw. alle machen das selbe.
Wenn du das auch noch dazuhaben möchtest musst du dies durch eine if-Schleife ersetzen. Z.B. if rot THEN rotation = bla ELSE rotation = blablab
Jule88#16
Benutzerbild von Jule88
Beiträge: 43
Wohnort: Leonberg
Registriert: Jan 2010

Themenautor/in

13.06.2010, 11:54

Ja, ich hatte es jetzt schon ganz rausgenommen, war nicht so wichtig :)

Kurze Frage, du hast ja gesehen, das ich mit verschiedenen Objekten zeichnen will. Jedoch werden die dann ja immer nur dupliziert, wie bei einem Stempel. Du weißt nicht zufällig ob und wie so etwas hier mit Flash geht? Link

Das war eigentlich mein ursprüngliches Ziel, solche schönen Flammen zeichnen zu können. Aber keine Ahnung wie :). Das Beispiel ist mit Java gemacht.

AntwortenRegistrieren Seite1 2  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2024 Sebastian Wichmann - Flashhilfe.de