[Flash 8] gestrichelte Linien...

SirToby

Erfahrenes Mitglied
Aloha :)

Nach einiger Zeit des reinfuchsens habe ich es geschafft, eine Linie anhand eines an einen Pfad gebundenen Objektes zu Zeichnen.
Nun möchte ich, dass sich diese Linie in Ihrer Gestallt jedoch ändert, sprich von "durchgezogen" nach "gestrichelt" usw.
vgl. Grafik
dashed_line.gif

Ist das grundsätzlich möglich mittels AS, wenn ja, welchen Weg würdet ihr vorschlagen. Bin da eher der Flash-Neuling ;)

Hier noch mal die 2 Flash-Files für ein besseres Nachvollziehen
--> .fla -- http://www.tobyatwork.de/2d-worxx/flash/line/test-follow.fla
--> .swf -- http://www.tobyatwork.de/2d-worxx/flash/line/test-follow.swf

Vielen Dank schon jetzt für ein paar Tipps oder Ähnliches.
 
Hi,

wenn die Linie nicht durchgezogen gezeichnet werden soll, musst Du im MC "TEST_TEXT" abwechselnd lineTo und moveTo verwenden. Probiers mal mit folgendem Code:
Code:
_parent.moveTo(this._x, this._y);

_parent.lineStyle(2, 0x990000, 100);

var c = 0;

this.onEnterFrame = function() {
	c ++;
	if (_parent.dotted && c % 2 == 0) {
		_parent.moveTo(this._x, this._y);
	} else {
		_parent.lineTo(this._x, this._y);
	}
}
Wenn Du nun auf der Hauptzeitleiste (z.B. in Ebene 5) jeweils ein Schlüsselbild in Frame 15 und eins in Frame 30 anlegst, und im ersteren dieses:
Code:
dotted = true;
sowie im letzteren jenes:
Code:
dotted = false;
eingibst, sollte der Bereich zwischen beiden Frames gestrichelt dargestellt werden.

Gruß
.
 
Na, die Lösung kam aber richtig schnell und läuft auch noch einwandfrei. Danke Dir für die schnelle Hilfe. :)

Nur hab ich da noch ein Problem... ;)

Die Rechenoperation zu den Koordinaten raffe ich noch net ganz :confused:
Code:
this.onEnterFrame = function() {
	c ++;
	if (_parent.dotted && c % 2 == 0) {
		_parent.moveTo(this._x, this._y);
	} else {
		_parent.lineTo(this._x, this._y);
	}
}

Wozu dient die inkrementelle Variable c und der später verwendete %-Modulo Operator in diesem Fall?
Die 0 scheint für mich der binäre Wert des boolschen Datentyps "false" zu sein, richtig?
 
Hallo,

die Logik dahinter ist folgende:

Jedesmal wenn c durch 2 einen Rest von 0 ergibt (Modulo-Operation), was faktisch bei jeder zweiten Inkrementierung der Fall ist, wird die Bedingung erfüllt.
Daraus ergibt sich die abwechselnde Ausführung von moveTo und lineTo ->gestrichelte Linie.

gruss
 
Dazu habe ich folgenden gedanklichen Ansatz:

Code:
1. Funktionsdurchlauf:
• c=1
• c / 2 = 0.5 durch modulo aber c = 0

2. Funktionsdurchlauf
• c=2
• c/2 = 1 durch modulo c = 1

3. Funktionsdurchlauf
• c=3
• c/2 = 1.5 durch modulo c = 1

4. Funktionsdurchlauf
• c=4
• c/2 = 2 durch modulo c = 2

Somit kann des ja nicht mehr 0 oder 1 sein. Ich vermute mal stark, dass ich hier einem gänzlichen Gedankenfehler aufsitze, oder?

<edit>
Blödsinn *ditsch* ;)
-- Bei %-Modulo ist ja der Rest entscheident. Ist der Rest "0" wie bei einer Division von 4 / 2 = 2.0 so gibts keine Linie, andernfalls 3 / 2 = 1.5 ist Rest != 0 und somit gilt die Ausweichlösung, eine Linie zu zeichnen.
</edit>
 
Zuletzt bearbeitet:
Jeetzt wirds interessanter ;)

Ich möchte dazu nicht einen extra-Thread eröffnen.

Nun soll ein Button am Ende der Animation eingeblendet werden. Das funktioniert nach einigem Hin und Her und ner Menge Gefrickel (blöde Instanznamen ;)) leider noch net ganz, so wie ich mir das vorstelle, aber eine weniger elegante Lösung als durch einen Funktionsaufruf kann das Problem an sich beheben.

Ein Klick auf diesen Button soll die soeben gezeichnete Linie löschen und noch einmal zeichnen. Seltsamer Weise bekomme ich immer eine Ausgabe zurück:
Code:
START DRAW RECTANGLE
STOP DRAWING RECTANGLE
animateOutline()

Hier der Code zum Einblenden und "steuern" des Buttons:
Code:
repeat_btn._visible = false;
function wiederholen () {
	if (this._currentframe == 50) {
		repeat_btn._visible = true;
			repeat_btn.onRelease = function () {
	   			clear();
	    		gotoAndPlay('Szene 1', 1);
        	}
	}
}

Der Vollständigkeit halber hier auch der Link zur aktuellen .fla und .swf
--> .fla -- http://www.tobyatwork.de/2d-worxx/flash/line/test-follow2.fla
--> .swf -- http://www.tobyatwork.de/2d-worxx/flash/line/test-follow2.swf

Ich vermute, dass ich die clear();-Funktion nicht richtig anwende, bin mir aber unschlüssig, welchen Fehler ich beim Aufruf mache. Habts ihr da ne Idee?
 
Zuletzt bearbeitet:
Hallo,

ich kann nicht erkennen, wo du die Funktion "wiederholen" aufrufst.

gruss

Danke - das war schon genau der richtige Hinweis, bzw. Fragestellung. Zu blöd, eine Funktion zu erstellen und sie dann nicht zu nutzen. Okay, das Einblenden funktioniert nun tadellos, aber das erneute oder wiederholte Zeichnen der Kurve schlägt insofern fehl, als dass keine Linie mehr gezeichnet wird. :confused:
In Frame (50) wird nun die Funktion wiederholen(); aufgerufen und die Wiedergabe zunächst gestoppt.
Code:
wiederholen();
stop();

Das in Frame (1) definierte Ereignis zu "repeat_btn.onRelease" wird entsprechend aufgerufen, zeichnet aber keine Linie nach; wie gesagt. Dieses merkwürdige "Ausgabe"-Fenster öffnet sich auch jetzt wieder.
 
Hallo,

ich hab deine *.fla mal so hergerichtet, dass sie deinen Beschreibungen entsprechend funktoniert.

Folgendes hab ich geändert:

1. Den MovieClip, in dem sich Tobis Skript befindet, hab ich mit "hallo" beschriftet, zusätzlich hab ich das Skript in eine Funktion gepackt und eine weitere Funktion hinzugefügt, die die onEnterFrame-Anweisungen wieder löscht.

2. Auf Frame 1 deines Films wird nun die Startfunktion des hallo-MovieClips in einer onEnterFrame-Schlaufe aufgerufen. Das deshalb, weil sonst die Funktionsdeklaration im hallo-MovieClip noch nicht abgearbeitet wäre.

3. Auf dem letzten Frame wird die stop-Funktion des hallo-MovieClips und die Funktion "wiederholen" aufgerufen.

4. Ich habe auf der Pfadebene, Frame 50 170 Zeilen Code auskommentiert, die die Ausgaben verursachten.

gruss
 

Anhänge

  • test-follow2.fla.zip
    7,9 KB · Aufrufe: 15
Danke für Deine Erklärung, luke.

Das habe ich nun soweit verstanden. Die 170 zeilen Code scheinen wohl bei der Erstellung des Pfades entstanden zu sein, zumindest hab ich den nicht wissentlich eingefügt.

Wie dem auch sei. Jetzt soll, wenn die Taste "w" angetippt wird, das Zeichnen der Linie wiederholt werden, idealer weise sogar auch, während des zeichnens eben selbiger.
Ich habe dazu einige Funktionen bereits herausgesucht, on(keypress) scheint da aber nicht richtig zu sein. Key.isDown und Key.isUp scheinen für mich ebenfalls nicht das Richtige zu sein.

Meine Anweisung
PHP:
on (keyPress "w") {
    zeiger.stopDraw();
}
gibt nur eine Fehlermeldung aus, die da lautet:
Code:
**Fehler** Szene=Szene 1, Ebene=code, Bild=1:Zeile 1: Mausereignisse sind nur bei Schaltflächeninstanzen zulässig
     on (keyPress "w") {

Anzahl der ActionScript-Fehler: 1 	 Gemeldete Fehler: 1

Die Idee mit dieser Anweisung kam aus folgendem Thread:
--> http://www.tutorials.de/forum/flash/5244-key-mit-einer-variablen.html

Möglicher Weise verfolge ich den falschen Ansatz, was mir momentan aber nicht klar ist.
 
Zurück