onMouseStop?

Denniz

Erfahrenes Mitglied
Hi Leute,

weiß jemand ob es in AS2 eine Methode wie onMouseStop gibt?
Ich will bei onMouseMove ein setInterval aufrufen.
Jetzt soll das SetInterval nicht permanent durchlaufen sondern beim stoppen der Mousebwegung wieder gecleared werden.
Bislang ist mir bis auf diese Möglichkeit hier nichts anderes eingefallen wie ich das umsetzten kann, allerdings klappt das auch nicht so richtig:


Code:
import mx.utils.Delegate;
var iv;
var mousex = _root._xmouse;
var mousey = _root._ymouse;

var mouseListener:Object = new Object();
mouseListener.onMouseMove = function() {
	iv = setInterval(Delegate.create(this, checkMouse), 500);
	updateAfterEvent();
};
function checkMouse() {
	if ((_root._xmouse == mousex) && (_root._ymouse == mousey)) {
                trace("X");
		clearInterval(iv);
	}
	else {
		mousex = _root._xmouse;
		mousey = _root._ymouse;
	}
}
Mouse.addListener(mouseListener);

Es muß doch irgendwie einfacher gehen ein stoppen der mausbewegung abzufragen und warum geht mein skript nicht?
 
Hi,

Du musst das Intervall auch in Deinem Mouse-Listener löschen, sonst werden so lange neue Intervalle erzeugt, wie sich die Maus bewegt (und löschen kannst Du bei Stillstand nur das jeweils letzte):
Code:
mouseListener.onMouseMove = function() {
	clearInterval(iv);
	iv = setInterval(Delegate.create(this, checkMouse), 500);
	updateAfterEvent();
}

Gruß
.
 
Also es soll so lange ein Interval ausgeführt werden solange man die maus bewegt.
Wenn man die maus nicht mehr bewegt soll das Interval stoppen.
Ja, genau das tut ein Intervall: Es wird so lange im Intervall von X Millisekunden aufgerufen, bis Du es beendest (in sofern arbeitet es nicht wie z.B. "setTimeOut" bei JS, was nur einmal aufgerufen wird).

Dein Script arbeitet nach meiner Änderung so, wie Du es vorgegeben hast.

Lässt Du das "clearInterval" im Mousehandler weg, so wird bei jeder Mausbewegung eine neue Interval-ID erzeugt, und Du ertrinkst irgendwann in Intervallen, die alle parallel arbeiten.

Gruß
.
 
Lässt Du das "clearInterval" im Mousehandler weg, so wird bei jeder Mausbewegung eine neue Interval-ID erzeugt, und Du ertrinkst irgendwann in Intervallen, die alle parallel arbeiten.
Ja du hast recht, aber das clearinterval löscht mir doch schon die ID und somit mein interval bevor das setInterval überhaupt dazu gekommen ist meine Funktion aufzurufen.
Nach deiner Ergänzung wir das setInterval erst richtig aufgerufen wenn ich keine mausbewegung mehr mache da ab dort ja das setinteval dann nicht mehr gelöscht wird weil kein onMouseMove und kein clearInterval.

Ok, ich erkläre es noch mal detalierter:

Ich will solange ich die Maus über der Bühne bewege in einem Abstand von 500ms eine Funktion permanent aufrufen.
Wenn ich dann die maus nicht mehr bewege soll das Interval gelöscht werden und die Funktion nicht mehr aufgerufen werden.
Wenn man danach die maus wieder bewegt dann spielt sich das gleiche wieder von vorne ab.

Diese Skript traced mir aber erst die meldungen wenn ich keine mausbewegung ( onMouseMove) mehr mache, liegt ja an dem clearing. Es sollte aber die meldung "DIESER TEXT BLINKT ALLE 500ms AUF WEIL DAS INTERVAL LÄUFT UND DU DIE MAUS BEWEGST" tracen solange ich die maus bewege.

Code:
import mx.utils.Delegate;
var iv;
var mousex = _root._xmouse;
var mousey = _root._ymouse;
var mouseListener:Object = new Object();
//Solange man die Maus bewegt soll alle 500 ms checkMouse() aufgerufen werden
//Wenn man dann irgenwann die Maus nicht mehr bewegt dann soll
//"KEIN INTERVAL - KEINE MAUSBEWEGUNG" getraced werden
//
//Bei diesem Skript  aber wird das Interval erst aufgerufen wenn man die Maus gestoppt hat
mouseListener.onMouseMove = function() {
	clearInterval(iv);
	iv = setInterval(Delegate.create(this, checkMouse), 500);
};
function checkMouse() {
	if ((_root._xmouse == mousex) && (_root._ymouse == mousey)) {
		trace("KEIN INTERVAL - KEINE MAUSBEWEGUNG");
		clearInterval(iv);
	}
	else {
		trace("DIESER TEXT BLINKT ALLE 500ms AUF WEIL DAS INTERVAL LÄUFT UND DU DIE MAUS BEWEGST");
		mousex = _root._xmouse;
		mousey = _root._ymouse;
	}
}
Mouse.addListener(mouseListener);
 
Zuletzt bearbeitet:
Na ja,

so wie ich Dich verstehe, macht folgendes Script genau das:
Code:
var mousex = _xmouse;

var mousey = _ymouse;

var iv = setInterval(testMouse, 100);

var ml = new Object();

ml.onMouseMove = function() {
	clearInterval(iv);
	testMouse();
	iv = setInterval(testMouse, 200);
}

function testMouse() {
	if (_xmouse == mousex && _ymouse == mousey) {
		clearInterval(iv);
		trace("STOPP");
	} else {
		mousex = _xmouse;
		mousey = _ymouse;
		trace("Maus wird bewegt");
	}
}

Mouse.addListener(ml);

Vielleicht gäbe es einen sinnvolleren Weg, Dein Ziel zu erreichen - dazu müsstest Du mir beschreiben, wofür (und warum) Du diese Funktion konkret einsetzen willst.

Gruß
.
 
Hi Tobias,

ja gut, so könnte man es machen wenn man nicht auf die Interval Zeit im setInterval angewiesen ist, du läßt in deinem Skript die testMouse(); funktion zur bildrate und nicht zur Intervalzeit laufen. Mir war wichtig das die Funktion in einem gewissen Interval aufgerufen wird.

Ich möchte über zwei unterschiedlich setIntervals, zwei funktionen in bestimmten zeitabständen aufrufen die mir den zurückgelegten weg der maus in einem Zeitinterval berechnen. Dazu gibt mir die eine Funktion eine startpostition des Mauszeigers zu einem zeitpunkt und die andere Funktion die endposition des Mauszeigers zu einem anderem zeitpunkt aus.

Ich habe jetzt eine Möglichkeit gefunden wo auch die intervalzeit berücksichtigt wird.
Zwar etwas umständlich mit einem mouseactive Flag , getTimer() Methode und 'nem onEnterFrame in hintergund laufen aber es klappt jetzt entlich auch mit onMouseMove. :)

Code:
import mx.utils.Delegate;
var iv:Number;
var mausActive:Boolean = false;
var mouseListener:Object = new Object();
mouseListener.onMouseMove = function() {
	var lastTimer:Number = getTimer();
	var lastX:Number = _root._xmouse;
	var lastY:Number = _root._ymouse;
	checkStatus(lastTimer, lastX, lastY);
};
function myIntervalFunc() {
	trace("MEIN INTERVAL WIRD AUFERGUFEN UND ICH BEWEGE DIE MAUS");
}
function checkStatus(pT, pX, pY) {
	if (!mausActive) {
		iv = setInterval(Delegate.create(this, myIntervalFunc), 500);
		mausActive = true;
	}
	_root.onEnterFrame = function() {
		if (getTimer()>pT+200) {
			var nowX :Number= _root._xmouse;
			var nowY:Number = _root._ymouse;
			if (pX == nowX && pY == nowY) {
				mausActive = false;
				trace("MAUS GESTOPPT - INTERVAL GELÖSCHT");
				clearInterval(iv);
				delete this.onEnterFrame;
			}
		}
	};
}
 
Hi,

schön, dass Du für Dich eine Lösung gefunden hast. :)

Übrigens:
du läßt in deinem Skript die testMouse(); funktion zur bildrate und nicht zur Intervalzeit laufen.
Das stimmt nicht (oder siehst Du dort eine onEnterFrame-Methode?). In Zeile drei verwende ich ein Intervall von 100 ms. ;)

Gruß
.
 
Hi,
In Zeile drei verwende ich ein Intervall von 100 ms. ;)

ja das hab ich gesehen auch wenns gestern mal wieder recht spät geworden ist :) .Das meinte ich aber nicht sondern den Aufruf der testMouse() Funktion in dem onMouseMove Event der nicht über setInterval läuft.

Code:
ml.onMouseMove = function() {
	clearInterval(iv);
	testMouse();
	iv = setInterval(testMouse, 1000);
}
 
Das meinte ich aber nicht sondern den Aufruf der testMouse() Funktion in dem onMouseMove Event der nicht über setInterval läuft.
Das mache ich, damit die Meldung ("Maus gestoppt") bei einer Bewegung sofort (und nicht erst nach 100 ms) verschwindet. ;)

Gruß
.
 
Zurück