Flash Puzzle inkl. Stoppuhr

Kirstin11

Grünschnabel
Hallo zusammen!

Habe nun schon Stunden mit der Suche bei Google & Co verbracht, um die passende Lösung zu meinem Problem zu finden, aber nun bin ich nur noch verwirrter als vorher :( Ich hoffe, ihr könnt mir weiterhelfen!

Ich soll ein Puzzle erstellen, alles kein Problem. Jedoch ist die Problemstellung folgende:
Man soll einen Teil des Puzzles anklicken können und es "herumziehen" können. Okay, ich weiß, dass man dies per Drag&Drop bewerkstelligt. Allerdings soll das Teil erst nach erneutem Klick positioniert werden und nicht nach Loslassen der Maustaste. Also das, was ich bisher gemacht habe, wäre dann falsch:

onClipEvent (mouseDown) {
xpos = this._x;
ypos = this._y;
if
(this.hitTest(_root._xmouse,_root._ymouse,true)){
this.startDrag(true,0,0,800,600);
}
}
onClipEvent (mouseUp) {
if
(this.hitTest(_root._xmouse,_root._ymouse,false)){
this.stopDrag();
if (eval(this._droptarget) == _root.Ziel1) {
this._x = _root.ziel1._x;
this._y = _root.ziel1._y;
}
else {
this._x = xpos;
this._y = ypos;
}
}
}

Aber wie realisiere ich das dann?

Zweite Frage: Zusätzlich soll eine Stoppuhr integriert werden, die bei Klick auf das erste Teil zu zählen beginnt. Wie kann ich das integrieren?


Ich hoffe sehr, ihr könnt mir weiterhelfen!! Vielen Dank schon mal!
 
Hi,

1. verwende nicht das onMouseDown-Ereignis, da sich dieses auf den gesamten Film bezieht.

2. Du musst beim Klick eine Fallunterscheidung treffen, je nachdem, ob das Objekt im Moment gezogen wird, oder nicht:
Code:
on(press) {
  if (!this.dragging) {
    this.dragging = true;
    this.px = this._x;
    this.py = this._y;
    this.startDrag(true,0,0,800,600);
  } else {
    this.dragging = false;
    this.stopDrag();
    if (eval(this._droptarget) == _root.ziel1) {
      this._x = _root.ziel1._y;
      this._y = _root.ziel1._y;
    } else {
      this._x = this.px;
      this._y = this.py;
    }
  }
}

3. Bitte verwende beim Posten von Code die entsprechenden bbCodes ( [CODE] oder [ACTIONSCRIPT] ) - danke!

Gruß
.
 
Nachtrag: eine Stoppuhr ist prinzipiell problemlos zu implementieren - die Notation auf der MC-Instanz würde ich aber nicht empfehlen. Poste Deine Quelldatei, dann kann ich Dir die Methode auf die richtige Zeitleiste setzen.

Gruß
.
 
Hallo noch mal,

habe nun die letzten paar Tage versucht, selbst auf die Lösung mit der Stoppuhr zu kommen, doch scheinbar bin ich tatsächlich denkbar ungeeignet für ActionScript...
Meine Datei habe ich nun aber online gestellt:

http://kirstin11.ki.funpic.de/Flash/Puzzle.zip
(erstellt in Flash MX (6.0))

Mir ist einfach unklar, wie ich der Stoppuhr sagen soll, dass sie beim Klick auf das erste Teil beginnen und beim Ablegen des letzten Teiles aufhören soll...

Für Hilfe bin ich wie immer sehr dankbar!
 
Hi,

ich kann für Flash 6 leider nicht speichern (arbeite mit Flash 8), daher muss ich Dir die Vorgehensweise erlären:
  • Entferne den Code von allen Puzzleteilen. Es wäre ja recht umständlich, fast den selben Code auf 24 MovieClips notieren zu müssen.
    Tipp: Es ist in fast allen Fällen besser, Code auf Zeitleisten statt auf MovieClip-Instanzen zu notieren.

  • Gib den Puzzleteilen Instanznamen ("teil1" bis "teil24"), so dass die Nummer des Teils mit der des Ziels übereinstimmt. Die Ziele hast Du ja schon benannt.

  • Entferne die Textfeldvariablen aus Deinen Timer-Textfeldern.
    Tipp: Textfeldvariablen sind veraltet (besser ist die Verwendung von Text-Instanznamen und der .text-Eigenschaft). Zudem dürfen keine Pfade ("_root.sekunde") als Textfeldvariablen verwendet werden.

  • Gib den Textfeldern statt dessen folgende Instanznamen: stunde, minute, sekunde, millisekunde (mach das Millisekunden-Textfeld etwas breiter, da die Zahl hier dreistellig wird!)

  • Lege auf der Hauptzeitleiste eine neue Ebene für den Code an, und notiere dort folgendes:
Code:
var amt = 24;

var touched = false;

var stime = 0;

var done = false;

for (var i=1; i<=amt; i++) {
	var obj = this["teil" + i];
	obj.dest = this["ziel" + i];
	obj.dragging = false;
	obj.onPress = function() {
		if (!this.dragging) {
			if (!touched) {
				touched = true;
				startTimer();
			}
			this.stime = getTimer();
			this.bx = this._x;
			this.by = this._y;
			this.startDrag(true, 0, 0, 2000, 1400);
			this.dragging = true;
		} else {
			this.stopDrag();
			if (eval(this._droptarget) == this.dest) {
				this._x = this.dest._x;
				this._y = this.dest._y;
				done ++;
				trace("komplett: " + done);
				if (done >= amt) stopTimer();
			} else {
				this._x = this.bx;
				this._y = this.by;
			}
			this.dragging = false;
		}
	}
}

function startTimer() {
	stime = getTimer();
	this.onEnterFrame = function() {
		var time = getTimer() - stime;
		var stunden = Math.floor(time / 1000 / 60 / 60);
		time -= stunden * 60 * 60 * 1000;
		var minuten = Math.floor(time / 1000 / 60);
		time -= minuten * 60 * 1000;
		var sekunden = Math.floor(time / 1000);
		time -= sekunden * 1000;
		var millisekunden = time;
		stunde.text = stunden;
		minute.text = minuten;
		sekunde.text = sekunden;
		millisekunde.text = millisekunden;
	}
}

function stopTimer() {
	delete this.onEnterFrame;
}
Die Variable "amt" legt die Anzahl der Teile fest. Die Variable "touched" gibt an, ob schon ein Puzzleteil berührt wurde (wenn nicht, wird beim Klick der Timer gestartet). Die Variable "stime" wird als Startzeit für den Timer verwendet, und die Variable "done" gibt an, wie viele Teile bisher korrekt abgelegt wurden.

In der ersten Schleife wird nun jedem Puzzleteil anhand seines Instanznamen der Code zum Klicken und Ziehen zugewiesen (da der Code für jedes Teil fast identisch ist, genügt es, ihn an dieser Stelle einmal zu notieren). Wird das erste Teil angeklickt, so wird der Timer mit der Methode "startTimer" gestartet.

In dieser Funktion wird eine onEnterFrame-Methode gestartet, die aus der verstrichenen Zeit die Werte für Stunden, Minuten, Sekunden und Millisekunden errechnet und die Werte den Textfeldern zuweist.

Wird ein Puzzleteil korrekt abgelegt, so wird die Variable "done" hochgezählt. Wird ihr Wert so groß wie die Anzahl der Teile (amt), so kann der Timer (stopTimer) angehalten werden.

Gruß
.
 
Oha, da wäre ich ja nie draufgekommen...das funktioniert ja einwandfrei! Mein Tag ist nun gerettet :) Tausend Dank
 
Hm, mir ist nun ein kleiner Bug aufgefallen:

Alles funktioniert einwandfrei. Habe ich nun aber ein Teil korrekt abgelegt, kann ich das Teil noch mal aufnehmen, wodurch (ich vermute) der "amt"-Wert von 24 zu früh erreicht wird, so dass mein Puzzle fertig ist, bevor ich alle Teile richtig abgelegt habe. D.h. ich könnte 24 Mal das gleiche Teil auf der richtigen Stelle positionieren, und trotzdem wäre mein Puzzle fertig :)
Ich meine, dies lässt sich nur dadurch umgehen, indem man den Teilen sagt, sie sollen liegenbleiben, so dass ich sie nicht mehr umherziehen kann. Aber wie realisiere ich das?
 
Zuletzt bearbeitet:
Hi,

ändere die onPress-Methode der Teile so ab:
Code:
	obj.onPress = function() {
		if (!this.dragging) {
			if (this.ok) return;
			if (!touched) {
				touched = true;
				startTimer();
			}
			this.stime = getTimer();
			this.bx = this._x;
			this.by = this._y;
			this.startDrag(true, 0, 0, 2000, 1400);
			this.dragging = true;
		} else {
			this.stopDrag();
			if (eval(this._droptarget) == this.dest) {
				this._x = this.dest._x;
				this._y = this.dest._y;
				done ++;
				this.ok = true;
				trace("komplett: " + done);
				if (done >= amt) stopTimer();
			} else {
				this._x = this.bx;
				this._y = this.by;
			}
			this.dragging = false;
		}
	}

Gruß
.
 

Neue Beiträge

Zurück