Probleme mit zoombarer Karte, Maske und MousOver

Moin !
Ein Flash anfänger der kurz vorm Verzweifeln ist bittet um Rat. :)

Ziel: Interaktive naja "Landkarte" (4 gebäude, Krankenhaus) die beweglich und zoombar ist. Die Namen der Gebäude und Straßen sollen ein und ausgeblendet werden.

Ich habe eine Karte eines Gebäudekomplexes mit Freehand nachgebaut und nach Flash importiert. In FlashMX als MC.map angelegt eine Maske drübergepackt (um ein interface darzustellen). Ein schieberegler steuert den Zoomfaktor und stellt ihn in % in einem dyn. Textfeld da. MC.map kann man mit der maus im Bereich der Maske hin und her ziehen.

Soweit ist alles wunderbar und super. Ich wollte jetzt das man wenn man über ein Gebäude der Karte mit der Maus kommt der Name in einem anderen dynamischen Texfeld (das auf dem Inderface ist, andere MC und auserhalb der Maske) anzuzeigen.
Ich dachte das mach Ich mit unsichtbaren buttons und MousOver Event. Geht aber nicht, der Maus Zeiger wird zwar zur Hand aber sonst nix.

Ne andere Idee war mir die Mitte der Maske zu nehmen und immer den Namen des Ortes anzuzeigen welches unter der Mittet ist. Sind so 30 Orts Namen die Ich dann abfragen müßte.
Ich weiß nicht wie man sowas in Flash leichter umsetzt aber die Buttons würde Ich leichter verstehen :)

Ich hab mal eine kleine Bsp. Fla beigelegt.So jetzt hab Ich aber hoffentlich alles erkärt und hoffe auf schnelle Hilfe.
Und danke schonmal :)
 

Anhänge

  • Flash.zip
    6,7 KB · Aufrufe: 20
Hi,

Dein erster Ansatz ist auf jeden Fall der einfachere. Allerdings hast Du auf der Karte ansich schon Mausereignisse (press, release usw.), die die untergeordneten Ereignisse auf den Details überschreiben.

Lösung: Überprüfe mit onEnterFrame und hitTest, ob sich die Maus über einem Textfeld befindet.

Alternativ kannst Du die bisherigen Handler auf der Karte auf einem untergeordneten MovieClip innerhalb der Karte unterbringen (weniger performanceintensiv), aber das ist "fernschriftlich" nicht so einfach zu erklären. ;)

Gruß
.
 
Hi
danke für die schnelle Antwort!
Jetzt wo dus sagst klingts logisch warums nett geht. Hm mit dem hittest hab Ich noch nichts gemacht. Du meinst ein unsichbares Objekt an die Maus hängen und dann mit hittest bafragen wann es die Namens buttons trifft? Hm ok versteh Ich (glaub Ich). Frage kann Ich den hittest auch nur mit der Maus machen? Oder brauch Ich das Objekt?
Und zum verständniss meiner einer, onEnterFrame brauch Ich damit sich das Texfeld sich aktualisiert, bei jedem neuen Hit?

Ja Ich bin Anfänger und das ist mein erstes Flash Projekt :)
thx :)
 
Hi,

selbstverständlich kannst Du mit hitTest auch nur die Mausposition abfragen:
PHP:
if (meinMovieClip.hitTest(_xmouse, _ymouse, true)) {
    trace("HIT!");
}

Gruß
.
 
hm
Ich kriegs nicht so richtig hin, mal schmeißt er hunderte an "Hit" meldungen aus (setzt dann auch schön das Texfeld), und mal macht er es gar nicht oder nur sporadisch.
Woran liegt das?
Oder Wärst du so nett mir meine fla umzubaun? :)
thx
 
Hi,

na ja, Du hast schon etliche Fehler in Deinem Aufbau gehabt:
  • Ich nehme an, die Instanzen von "Dock" sollen die Textanzeige auslösen. Zunächst würde ich dafür keine Schaltflächen, sondern MovieClips verwenden. Dann solltest Du nicht allen drei Schaltflächen den selben Instanznamen geben. Instanznamen sollten eindeutig sein; verwende lieber dock1, dock2 und dock3.

  • Dann brauchst Du unter der Karte noch eine unsichtbare Fläche - sonst kannst Du die Karte nur verschieben, wenn sich die Maus über einer Dock-Instanz befindet oder zufällig genau auf einer Linie der Karte

  • Gib dem Textfeld nicht den selben Instanznamen wie seine Textfeldvariable. Damit überschreibst Du einen der beiden Bezeichner. Im Prinzip kommst Du ohne Textfeldvariable aus.

  • set() ist veraltete (Flash 4) Syntax. Ausserdem ist der Pfad zum Textfeld falsch. Erledige die Zuweisungen lieber von aussen.

Ich lasse zum Testen einfach mal die Nummer der Dock-Instanz anzeigen. Willst Du für jeden unsichtbaren Button einen eigenen Text anzeigen, so erstellst Du am besten ein Array:
PHP:
var texte = new Array("Über Button 1", "Über Button 2", "und über Button 3");
... und lässt beim rollOver (sprich hier: hitTest) einfach den entsprechenden Arrayeintrag anzeigen:
PHP:
if (map["dock" + i].hitTest(_xmouse, _ymouse, true)) {
	report.text = texte(i - 1);
	isover = true;
}

Gruß
.
 

Anhänge

  • karte_usw.zip
    35,6 KB · Aufrufe: 17
Ahhhh super :)
Ich danke dir, das hat mir weitergeholfen.
Hm flash 4 syntax ? Das wußt Ich nicht, werd nochein wenig die Bücher wälzen :)

Vielen dank nochmal,
Gruß
 
Ah ... äh :)
eine frage hab Ich da doch noch. Kann man den hittest nur auf den Abschnitt der maske beschränken?

hihi das wärs dann aber glaub Ich

Gruß
 
Hi,

ja, Du musst in diesem Fall die Koordinaten der Maske in der onEnterFrame-Methode abfragen:
PHP:
this.onEnterFrame = function() {
	var isover = false;
	if (_xmouse > maske_x && _ymouse > maske._y && _xmouse < maske_r && _ymouse < maske_b) {
		for (var i=1; i<=dock_anzahl; i++) {
			if (map["dock" + i].hitTest(_xmouse, _ymouse, true)) {
				report.text = texte(i - 1);
				isover = true;
			}
		}
		if (!isover) report.text = "Maus über nichts";
	}
}
in den Variablen maske_x, maske_y, maske_r und maske_b musst Du die Koordinaten der vier Eckpunkte Deiner Maske speichern.

Einfacher geht es, wenn Du die Maske auch in einen MovieClip umwandelst und ihr einen Instanznamen gibst (z.B. "mask"). Dann kannst Du auch die Maske einfach mit hitTest abfragen:
PHP:
if (mask.hitTest(_xmouse, _ymouse, false)) {

Gruß
.
 
Super lieben Dank !
Ich hab ja tage geforscht und einfach hier gepostet und schon läuft alles, super :)
ach ja ... und danke, danke, danke :)
 
Zuletzt bearbeitet:
Zurück