hitTest

harrry

Erfahrenes Mitglied
Hallo zusammen,
ich habe ein Problem mit einem beweglichen Feld namens "archiv", das folgendes Skript trägt, um es entgegen der Mausbewegung rauf und runter gleiten zu lassen:
PHP:
onClipEvent (load) {
    //drags the empty movieclip used to define x an Y accelerations
    startDrag(_root.cmsMC.pointer, true);
    //sets the movement sensibility
    _root.cmsMC.speed_archiv = 25;
}
onClipEvent (enterFrame) {
    //calculates the 'delta' movements
    py = -(_root.cmsMC.pointer._y);
    archivy = _root.cmsMC.archiv._y;
    //applies the x and y positions of the background
    if (py>archivy) {
        _root.cmsMC.archiv._y = (archivy+((py-archivy)/_root.cmsMC.speed_archiv));
    }
    if (py<archivy) {
        _root.cmsMC.archiv._y = (archivy-((archivy-py)/_root.cmsMC.speed_archiv));
    }
}
Aus diese Art reagiert das Feld immer, egal wo der Cursor gerade am Bildschirm ist. Nun möchte ich aber, dass die Bewegung des Feldes nur erfolgt, wenn ich mich mit der Maus direkt über dem Feld befinde. Habe dazu einen MovieClip namens "hitZone" erstellt und es mit folgender Änderung versucht:
PHP:
onClipEvent (load) {
    if (this.hitTest(this._parent.hitZone)) {
        startDrag(_root.cmsMC.pointer, true);
        _root.cmsMC.speed_archiv = 25;
    }
}
onClipEvent (enterFrame) {
    py = -(_root.cmsMC.pointer._y);
    archivy = _root.cmsMC.archiv._y;
    if (py>archivy) {
        _root.cmsMC.archiv._y = (archivy+((py-archivy)/_root.cmsMC.speed_archiv));
    }
    if (py<archivy) {
        _root.cmsMC.archiv._y = (archivy-((archivy-py)/_root.cmsMC.speed_archiv));
    }
}
Nur klappt es leider nicht. Nun bewegt sich gar nichts. Was mach ich falsch?
 
Hallo,

einfacher wäre wohl eine Begrenzung des gültigen Drag-Bereichs.
Flashhilfe hat gesagt.:
startDrag(target:Object, [lock:Boolean, left:Number, top:Number, right:Number, bottom:Number])

Für dein Skript würde das dann bedeuten, dass du anhand deines MovieClips hitZone die Eckdaten ermittelst:

Code:
var left = hitZone._x;
var right = hitZone._x+hitZone._width;

var top = hitZone._y;
var bottom = hitZone._height;

startDrag(root.cmsMC.pointer, true, left, top, right, bottom);

gruss
 
Vielen Dank, hab es versucht, aber leider reagiert der Clip "archiv" immer noch auf die Mausbewegungen am gesamtem Bildschirm.

Mein Film enthält den Clip "archiv", der bewegt werden soll, den leeren Clip "pointer" und einen quadratischen Clip namens "hitZone" - nur über diesem soll der "drag" anspringen.

Auf der Zeitleiste habe ich nun stehen:
PHP:
stop();
var links = hitZone._x;
var rechts = hitZone._x+hitZone._width;
var oben = hitZone._y;
var unten = hitZone._height;
.Und auf dem Clip "archiv" liegt nach Deiner Hilfe das da:
PHP:
onClipEvent (load) {
    startDrag(_root.cmsMC.pointer, true, _parent.links, _parent.oben, _parent.rechts, _parent.unten);
    _root.cmsMC.speed_archiv = 25;
}
onClipEvent (enterFrame) {
    py = -(_root.cmsMC.pointer._y);
    archivy = _root.cmsMC.archiv._y;
    if (py>archivy) {
        _root.cmsMC.archiv._y = (archivy+((py-archivy)/_root.cmsMC.speed_archiv));
    }
    if (py<archivy) {
        _root.cmsMC.archiv._y = (archivy-((archivy-py)/_root.cmsMC.speed_archiv));
    }
}
Wie gesagt, die Bewegung findet statt, aber leider nicht begrenzt auf meinen "hitZone"-Bereich...
 
Hallo,


hast du den Pointer-MovieClip schon mal sichtbar gemacht? Bewegt er sich wirklich nur in vorgegebenem Bereich? Im Anhang findest du dein Skript umgesetzt, vielleicht gibt dir das einen Denkanstoss.


gruss
 

Anhänge

Ja, nochmals danke, aber so weit war ich schon - denn auch in Deinem Beispiel bewegt sich der "archiv"-MC auch dann, wenn sich die Maus außerhalb des hitZone-Fläche befindet. Nur der "pointer" bleibt innerhalb der hitTest-Fläche (was mir aber nichts nützt, da er ja ohnehin unsichbar ist).

Mein Ziel ist ja, dass der mc "archiv" sich nicht mehr bewegt, wenn ich mit der Maus außerhalb der hitZone agiere. Geht denn das?
 
Hallo,

tut mir leid, hab ungenau gelesen. Dann kannst du die startDrag-Funktion vergessen und gleich eine Koordinaten-Abfrage in die onEnterFrame-Schlaufe packen. Ist performanter als hitTest:

Code:
var links = hitZone._x;
var rechts = hitZone._x+hitZone._width;
var oben = hitZone._y;
var unten = hitZone._y +hitZone._height; 

var speed_archiv = 25;
var archivy, py;



function onEnterFrame () {
	
	var x = _xmouse;
	var y = _ymouse;
	
	if (x < links || x > rechts || y < oben || y > unten) return;
	
	pointer._y = y;
	pointer._x = x;
	
	py = -(pointer._y);
    archivy = archiv._y;
    if (py>archivy) {
        archiv._y += (py-archivy)/speed_archiv;
    }
    if (py<archivy) {
       archiv._y-= (archivy-py)/speed_archiv;
    }
}

gruss
 
Zuletzt bearbeitet:
Zurück