Drag and Drop Problem

Hi,

probiers mit diesem Code:
Code:
var current = 0;
var max = 3; // Maximalanzahl;

firstOne.onPress = function() {
	if (current >= max) return;
	var newOne = this.duplicateMovieClip("dup" + current, this._parent.getNextHighestDepth());
	newOne.tf.text = current + 1;
	newOne._alpha = 70; // kann weg
	newOne.onRelease = newOne.onReleaseOutside = function() {
		current --;
		this.removeMovieClip();
	}
	newOne.onPress = function() {
		this.startDrag();
	}
	newOne.startDrag();
	current ++;
}

firstOne.onRelease = firstOne.onReleaseOutside = function() {
	this._parent["dup" + (current - 1)].stopDrag();
}
Erklärungen:
  1. Die Methode "removeMovieClip" des MovieClip-Objektes erwartet keinen Parameter. Gelöscht wird immer der MC, der vor der Methode notiert ist. ;)

  2. Das "stopDrag" kannst Du Dir sparen: Wenn der MC gelöscht wird, wird er natürlich auch nicht mehr gezogen ...

  3. Du musst "current" in der onRelease-Methode einfach um 1 herunterzählen.

  4. Zusätzlich darfst Du dann aber den onPress-Handler des Ursprungsclips nicht löschen, wenn "current" den Maximalwert erreicht hat: Man könnte ja auch danach noch einen der Duplikate löschen und dann wärs aus mit dem Neukopieren, weil der gesamte Handler futsch ist. Statt dessen habe ich die Überprüfung von "current" einfach an den Anfang des Handlers gesetzt: Ist der Wert höher als der Maximalwert, wird die Funktion einfach verlassen.

Nachtrag: Mit dieser Methode werden nicht wirklich die gelöschten Nummern ersetzt, sondern immer die jeweils letzte. Willst Du wirklich "Lücken füllen", müsstest Du mit Arrays arbeiten, was eine recht umfangreiche Umstellung des Codes erfordern würde. Sag in diesem Fall noch einmal Bescheid.

Gruß
.
 
So hatte ich es ja schon probiert, aber wenn ich nachdem ich einen neuen MC erstellt habe den vorherigen "lösche" wird ein Neuer erstellt, der so heißt wie der der zuletzt erstellt wurde und das möchte ich nicht.
Die MC's sollen sich in ihrem Namen unterscheiden, dass brauch ich für die nachträgliche Verwendung.
Ob dabei die Lücken gefüllt werden oder die neuen MC's am Ende angehängt werden ist eigentlich egal!
 
... wenns nur um die Unterscheidung ginge, könnte man ja "current" weiterhin hochzählen. ;)

Wie auch immer: ich habe den Code mal so umgestellt, dass nur die Zahlen von 1 - "max" verwendet werden:
Code:
var current = 0;
var max = 3; // Maximalanzahl;
var clones = new Array(max);
var currentClone = null;

for (var i=0; i<clones.length; i++) {
	clones[i] = false;
}

firstOne.onPress = function() {
	if (getAmt() >= max) return;
	currentClone = this.duplicateMovieClip("dup" + getTimer(), this._parent.getNextHighestDepth());
	doPush(currentClone);
	currentClone.idx = parseInt(getIdx(currentClone), 10);
	currentClone.tf.text = (currentClone.idx + 1);
	currentClone._alpha = 70; // kann weg
	currentClone.onRelease = currentClone.onReleaseOutside = function() {
		erase(this);
		this.removeMovieClip();
	}
	currentClone.onPress = function() {
		this.startDrag();
	}
	currentClone.startDrag();
}

firstOne.onRelease = firstOne.onReleaseOutside = function() {
	currentClone.stopDrag();
}

function getAmt() {
	var a = 0;
	for (var i=0; i<clones.length; i++) {
		if (clones[i] != false) {
			a ++;
		}
	}
	return a;
}

function getIdx(obj) {
	for (var i=0; i<clones.length; i++) {
		if (obj == clones[i]) {
			return i;
		}
	}
}

function doPush(obj) {
	for (var i=0; i<clones.length; i++) {
		if (clones[i] == false) {
			clones[i] = obj;
			return;
		}
	}
}

function erase(obj) {
	for (var i=0; i<clones.length; i++) {
		if (obj == clones[i]) {
			clones[i] = false;
			return;
		}
	}
}
Wie gesagt: diese Variante erfordert Arrays.

Gruß
.
 
Danke!
Ich denke das ist die eleganteste Lösung und erfüllt genau das was sich mir vorgestellt hab.
Nochmal 1000 Dank, das hat mir echt weitergehofen!
 
Jetzt kommt das große ABER:
Füge ich das ganze in mein Programm ein, ist es möglich nachdem max erreicht wurde weitere MC's zu erstellen. die dann den Namen a tragen.
Wie kann das sein? Ich hab jetzt extra zum Testen den Code 1:1 übernommen.
 
... kann 1000 Gründe haben, vermutlich Trunctations oder Adressierungsprobleme. Ich hab ja keine Ahnung, wie Dein restliches Projekt aussieht.

Du solltest die .fla einmal posten.

Gruß

P.S.: Vor Montag werde ich nicht antworten können, also hab etwas Geduld.
.
 
Ich habe hier im Forum etwas gefunden, mit dem man Objekte nur platzieren kann, wenn sie sich über einem bestimmten anderen befinden. Ich wollte das jetzt gerne mit dem was ich habe kombinieren. Dabei bin ich hierzu gekommen:
PHP:
var current = 0;
var max = 3; // Maximalanzahl;
var clones = new Array(max);
var currentClone = null;
var a = 0;

for (var i=0; i<clones.length; i++) {
    clones[i] = false;
}

fi.firstOne.onPress = function() {
     if (getAmt() >= max) return;
    currentClone = this.duplicateMovieClip("dup" + getTimer(), this._parent.getNextHighestDepth());
    doPush(currentClone);
    currentClone.sx = currentClone._x;
    currentClone.sy = currentClone._y;
    currentClone.brother = _root["background"];
    currentClone.idx = parseInt(getIdx(currentClone), 10);

    currentClone.onRelease = currentClone.onReleaseOutside = function() {
        
        this.stopDrag();
        if (this._droptarget.substr(this._droptarget.lastIndexOf("/") + 1) == this.brother._name) {
            //this._x = this.brother._x;
            //this._y = this.brother._y;
            //delete this.onPress;
        } else {
            
            this.onEnterFrame = function() {
                this._x += (this.sx - this._x) / 5;
                this._y += (this.sy - this._y) / 5;
                if (Math.abs(this.sx - this._x) < 1 && Math.abs(this.sy - this._y) < 1) {
                    //delete this.onEnterFrame;
                    erase(this);
                    this.removeMovieClip();
                }
            }
        }
        
    }
    currentClone.onPress = function() {
        this.startDrag();
    }
    currentClone.startDrag();
}

fi.firstOne.onRelease = fi.firstOne.onReleaseOutside = function() {
    currentClone.stopDrag();
    if (currentClone._droptarget.substr(currentClone._droptarget.lastIndexOf("/") + 1) == currentClone.brother._name) {

        } else {
            currentClone.onEnterFrame = function() {
                currentClone._x += (currentClone.sx - currentClone._x) / 5;
                currentClone._y += (currentClone.sy - currentClone._y) / 5;
                if (Math.abs(currentClone.sx - currentClone._x) < 1 && Math.abs(currentClone.sy - currentClone._y) < 1) {
                    delete currentClone.onEnterFrame;
                    removeMovieClip(currrentClone);
                }
            }
        }
        
}

function getAmt() {
    for (var i=0; i<clones.length; i++) {
        if (clones[i] != false) {
            a ++;
        }
    }
    return a;
}

function getIdx(obj) {
    for (var i=0; i<clones.length; i++) {
        if (obj == clones[i]) {
            return i;
        }
    }
}

function doPush(obj) {
    for (var i=0; i<clones.length; i++) {
        if (clones[i] == false) {
            clones[i] = obj;
            return;
        }
    }
}

function erase(obj) {
    for (var i=0; i<clones.length; i++) {
        if (obj == clones[i]) {
            clones[i] = false;
            return;
        }
    }
}
Aber so werden die Movieclips nicht gelöscht, wenn sie ein zweites Mal bewegt werden und sich nicht über dem brother-Object befinden. Sie rücken zurück auf die Ausgangsposition, dass sollen sie ja auch, werden aber nicht aus dem Array gelöscht.
 
HI,

fang doch mal an zu debuggen, indem Du an alle relevanten Stellen (z.B. vor den Aufruf von "erase") trace-Aktionen setzt. In der Regel solltest Du Deine Ablauflogik so nachvollziehen und den Fehler einkreisen können. Bringt ja nichts, Dir alles vorzukauen. ;)

Gruß
.
 
Ist ja nicht so, dass ich nicht schon versucht hätte den Fehler selbst zu finden.
Hab auch nicht Lust ständig zu nerven. Aber mittlerweile kann ich auch nur noch drei Instanzen erzeugen, egal, was ich als max angebe.
Bleibt halt alles so wie es ganz am Anfang war!
Trotzdem Danke für Deine Hilfe!
 

Neue Beiträge

Zurück