Flashhilfe.de - Flash Community

Drop nur auf anderem MovieClip zulassen [Flash 10]

 


AntwortenRegistrieren Seite1  

Stryck#1
Benutzerbild von Stryck
Beiträge: 21
Registriert: Oct 2010

05.11.2010, 22:05

Hi,
ich arbeite derzeit an einem Projekt, in dem ich MovieClips per Drag and Drop in einen vorgegebenen Bereich ziehen möchte. Wenn ich dieses Drop feld nicht getroffen habe, sollen die entsprechenden Objekte wieder zurück an die ursprüngliche Position.

Das ganze habe ich versucht so zu lösen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function mouseUpHandler(evt:MouseEvent):void
{
     var obj = evt.target;
     var target = obj.dropTarget;
     if (target != null)
     {
        test(target, obj);
     }
     obj.stopDrag();
}


function test(target, obj)
{
     if (target == mc_bg)
     {
        obj.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
        obj.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
     }
     else
     {
        obj.x = ori_x;
        obj.y = ori_y;
     }
}


Das ganze bewirk allerdings das Gegenteil. Das Objekt geht zurück wenn der Bereich (hier der mc_bg) getroffen wurde und wenn nicht bleibt es an dem Drop point.
Das ganze habe ich versucht durch ein != anstatt des == in der test function zu lösen. Dann kann man das Objekt aber überall platzieren.

Wäre super, wenn ihr mir helfen könntet.

Paul
Werbung
Beiträge: 0
Registriert: Feb 2016


willie33#2
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

06.11.2010, 11:24

Ich hab das so gelöst:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import flash.geom.Point;
import flash.events.MouseEvent;

var originalPos:Point = new Point(movingMC.x, movingMC.y); //originale position des MCs der gedragged wird
var targetPos:Point = new Point(80, 51.5); //ziel position

movingMC.addEventListener(MouseEvent.MOUSE_DOWN, onMCMouseDown);
movingMC.addEventListener(MouseEvent.MOUSE_UP, onMCMouseUp);

function onMCMouseDown(e:MouseEvent):void
{
     this.stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMove);
     e.target.startDrag(); //Starte mit dem draggen
}

function onMCMouseUp(e:MouseEvent):void
{
     this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, stageMouseMove);
     e.target.stopDrag(); //Hör auf zum draggen
   if (e.target.hitTestObject(targetMC)) //Wenn mein MC das ziel berührt
   {
        e.target.x = targetPos.x;
        e.target.y = targetPos.y;
     } else
     {
        e.target.x = originalPos.x;
        e.target.y = originalPos.y;
     }
}

function stageMouseMove(e:MouseEvent):void
{
     e.updateAfterEvent(); //Refresht die stage
}
Loading comments...

Angehängte Dateien:
Adobe Flash Quelldatei snapIntoPlace-test1.fla8.53 KB
Geändert von willie33 am 06.11.10 um 11:26 Uhr
RustyCake#3
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

06.11.2010, 11:43

Das Problem bei dropTarget ist, der verwendet nicht den in Eigenschaften vergebenen Instanznamen, sonder den Internen!!
Zum testen in:
ActionScript:
1
2
3
4
function test(target, obj)
{
  trace(target.name)// da steht dann "instance1" oder sowas, aber nicht mc_bg
}
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
Stryck#4
Benutzerbild von Stryck
Beiträge: 21
Registriert: Oct 2010

Themenautor/in

06.11.2010, 14:29

Hi,
@ willie33: Jo geht auch ;) vielen Dank.

@ RustyCake: ja genau instance1 kommt da bei mir, wenn ich jetzt allerdings
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
function test(target, obj)
{
     if (target == instance1)
     {
        obj.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
        obj.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
     }
     else
     {
        obj.x = ori_x;
        obj.y = ori_y;
     }
}

daraus mache sagt er mir, dass ich auf eine nicht definierte Eigenschaft zugreifen will. Gibt es irgendwelche Möglichkeiten, dass Flash auch dann mit den Instanznamen arbeitet, die ich vergeben habe?
Ich habe jetzt nur die Möglichkeit gefunden einfach zu fragen, ob das target instance1 heißt, allerdings variieren diese Namen ständig, wenn ich neue movieclips hinzufüge.
Werbung
Beiträge: 0
Registriert: Feb 2016


willie33#5
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

06.11.2010, 22:27

Ganz unten ist die Erläuterung:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.display.MovieClip;
import flash.display.DisplayObject;

var initialCoord:Point = new Point(mc.x, mc.y); //Der Startpunkt deines MCs

mc.addEventListener(MouseEvent.MOUSE_DOWN, onMCMouseDown);
mc.addEventListener(MouseEvent.MOUSE_UP, onMCMouseUp);

function onMCMouseDown(e:MouseEvent):void
{
     stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
     mc.startDrag();
}

function onMCMouseUp(e:MouseEvent):void
{
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
     mc.stopDrag();
     test(mc); //Jetzt wird geprüft
}

function onMouseMove(e:MouseEvent):void
{
     e.updateAfterEvent();
}

function test(pmc:MovieClip):void
{
     var target:PossibleTarget = null; //Der Platzhalter für ein getestetes Ziel
   for (var i:int = 0; i < this.numChildren; i++)
     {
        if (this.getChildAt(i) is PossibleTarget) //Hittest wird nur gemacht, wenn child eine Instanz von "PossibleTarget" ist
      {
           if (pmc.hitTestObject(this.getChildAt(i)))
           {
              target = this.getChildAt(i) as PossibleTarget; //Ziel ist valide und wird weiter verwendet
            break;
           }
        }
     }
     
     if (target) //Überprüfung ob die Schleife eine Ergebnis ergeben hat
   {
        pmc.x = ((target.width / 2) - (pmc.width / 2)) + target.x;
        pmc.y = ((target.height / 2) - (pmc.height / 2)) + target.y;
     } else //Ansonsten wird die Position des MCs zurückgesetzt
   {
        pmc.x = initialCoord.x;
        pmc.y = initialCoord.y;
     }
}

Du möchtest ja verschiedene MCs auf einen Hit überprüfen, kannst den ZielMC aber nicht hart codieren.
Da ist die Lösung: Erstelle zuerst eine Klasse die z.B. den Namen "PossibleTarget" hat. Diese Klasse erweitert "MovieClip" und besitzt einen Konstruktor.
Nun kannst du in Flash einen MovieClip für die  Bibliothek erstellen. Diesen weist du die Basisklasse "PossibleTarget" zu.
Nun kannst du in deinem Skript alle Element die auf der Bühne sind durchgehen, und prüfen, ob sie a) eine Instanz von "PossibleTarget" sind und b) ob ein hitTest "true" ergibt.
Beide Dateien im Anhang werden benötigt, damit dieses Beispiel ausgeführt werden kann.
Loading comments...

Angehängte Dateien:
Adobe Flash ActionScript-Datei PossibleTarget.as0.19 KB
Adobe Flash Quelldatei snapViaClasses-test1.fla12.61 KB
Geändert von willie33 am 06.11.10 um 22:32 Uhr
Stryck#6
Benutzerbild von Stryck
Beiträge: 21
Registriert: Oct 2010

Themenautor/in

06.11.2010, 23:51

Super vielen Dank, hats gelöst.

Grüße
Paul

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Online-Spiel Crossover [Flash 11] 05.06.2019 - Indy_Crossover
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de