Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-01-2008, 13:51   #1 (permalink)
daaSeeker
 
Registriert seit: Jul 2002
Beiträge: 171
movieclips & "magnetische" abstoßung

Hallo,
In meinem Flash-Film befinden sich mehrere movieclips. Diese lassen sich per drag&drop verschieben. Ich würde gerne realisieren, dass sich die mc's nicht berühren...d.h. unterschreitet ein mc einen definierten Mindestabstand, so soll er die anderen abstoßen.
Meine action-script Kenntnisse sind leider nicht sehr gut, deshalb meine Frage, ob jemand vielleicht schon einmal ein ähnliches Problem hatte oder ein passendes Tutorial kennt (konnte leider keines finden)...
Thunderrace ist offline   Mit Zitat antworten
Alt 13-01-2008, 20:25   #2 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
Quick & Dirty habe ich Dir das grad mal zusammengetippt:
Einfach neue Datei und ins erste Frame kopieren.

Wie gesagt quick&dirty, aber so haste schonmal nen Ansatz

PHP-Code:
var min_abstand 5;
var 
breite:Number 50;
var 
hoehe:Number breite;
var 
anzahl:Number 16;

var 
verteilung Math.ceil(Math.sqrt(anzahl));
var 
abstandX:Number = (Stage.width-(breite*verteilung))/(verteilung+1);
var 
abstandY:Number = (Stage.height-(hoehe*verteilung))/(verteilung+1);
var 
max_annaeherung:Number Math.max(breitehoehe);
max_annaeherung Math.sqrt(max_annaeherung*max_annaeherung*2)+min_abstand;


for(var 
i:Number 0i<anzahli++)
{
    var 
mc make_mc(breitehoehethis"mc"+i);
    
mc._x i%verteilung*(breite abstandX)+abstandX;
    
mc._y Math.floor(i/verteilung)*(hoehe abstandY)+abstandY;
    
mc.onEnterFrame = function ()
    {
        
check_nachbarn(this);
    }
    
mc.onPress = function () {
        
startDrag(this);
        
_root.curr_active this;
    }
    
mc.onRelease = function () {
        
stopDrag();
        
delete _root.curr_active;
    }
}

function 
check_nachbarn(mc:MovieClip):Void
{

        var 
tmp:MovieClip;
        
mitte_mc_x mc._x+breite/2;
        
mitte_mc_y mc._y+hoehe/2;

    for(var 
i:Number 0i<anzahli++)
    {
        
tmp mc._parent["mc"+i];
        if (
tmp == mc || tmp == _root.curr_active) continue;
        do {
            
mitte_tmp_x tmp._x+breite/2;
            
mitte_tmp_y tmp._y+hoehe/2;

            
abstands_vektor_x mitte_mc_x-mitte_tmp_x;
            
abstands_vektor_y mitte_mc_y-mitte_tmp_y;
                
            
abstand_laenge Math.sqrt(abstands_vektor_x*abstands_vektor_x abstands_vektor_y*abstands_vektor_y);
            if (
abstand_laenge<max_annaeherung)
            {
                
tmp._x += tmp._x mc._x 1: -1;
                
tmp._y += tmp._y mc._y 1: -1;
            }
        } while (
abstand_laenge<max_annaeherung);
    }
}

function 
make_mc(w:Numberh:Numbertl:MovieClipname:String):MovieClip
{
    var 
tmp:MovieClip tl.createEmptyMovieClip(nametl.getNextHighestDepth());
    
tmp.beginFill(0xFF0000);
    
tmp.moveTo(00);
    
tmp.lineTo(w0);
    
tmp.lineTo(wh);
    
tmp.lineTo(0h);
    
tmp.lineTo(00);
    
tmp.endFill();
    return 
tmp;


Geändert von pape (13-01-2008 um 20:26 Uhr)
pape ist offline   Mit Zitat antworten
Alt 13-01-2008, 20:56   #3 (permalink)
daaSeeker
 
Registriert seit: Jul 2002
Beiträge: 171
Hallo Robert,
Vielen Dank für Dein Script! Wahnsinn!!!!

Ganz so aufwendig hätte es jedoch gar nicht sein müssen, weil die mc's sind bereits auf der bühne vorhanden. Ich würde diese dann lediglich mit mc1, mc2 etc benennen... das hieße, man müßte gar keine mc's generieren...

Ich habe versucht jetzt nur den unteren Teil deines Scripts zu verwenden:
Code:
function check_nachbarn(mc:MovieClip):Void
{

        var tmp:MovieClip;
        mitte_mc_x = mc._x+breite/2;
        mitte_mc_y = mc._y+hoehe/2;

    for(var i:Number = 0; i<anzahl; i++)
    {
        tmp = mc._parent["mc"+i];
        if (tmp == mc || tmp == _root.curr_active) continue;
        do {
            mitte_tmp_x = tmp._x+breite/2;
            mitte_tmp_y = tmp._y+hoehe/2;

            abstands_vektor_x = mitte_mc_x-mitte_tmp_x;
            abstands_vektor_y = mitte_mc_y-mitte_tmp_y;
                
            abstand_laenge = Math.sqrt(abstands_vektor_x*abstands_vektor_x + abstands_vektor_y*abstands_vektor_y);
            if (abstand_laenge<max_annaeherung)
            {
                tmp._x += tmp._x > mc._x ? 1: -1;
                tmp._y += tmp._y > mc._y ? 1: -1;
            }
        } while (abstand_laenge<max_annaeherung);
    }
}

function make_mc(w:Number, h:Number, tl:MovieClip, name:String):MovieClip
{
    var tmp:MovieClip = tl.createEmptyMovieClip(name, tl.getNextHighestDepth());
    tmp.beginFill(0xFF0000);
    tmp.moveTo(0, 0);
    tmp.lineTo(w, 0);
    tmp.lineTo(w, h);
    tmp.lineTo(0, h);
    tmp.lineTo(0, 0);
    tmp.endFill();
    return tmp;
}
Darauf haben die mc's auf der Bühne jedoch dann leider nicht mehr reagiert.
Wäre Dir für einen weiteren Tip sehr dankbar
Thunderrace ist offline   Mit Zitat antworten
Alt 15-01-2008, 22:59   #4 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
Hab Dir den Code mal kommentiert. Wie gesagt, ist er nicht sehr gut, sondern soll nur einen Ansatz darstellen. Einfach kopieren ist nicht
Bischen Eigeninitiative musst Du schon mitbringen, denn ein Forum ist nicht dafür gedacht "wie geht das? - programmier mir das mal jemand!".

ActionScript:
  1. function check_nachbarn(mc:MovieClip):Void
  2. {
  3.  
  4.         var tmp:MovieClip;
  5. //Mitte des mcs berechnen (kommt auf die Ausrichtung an, ggf hier korrigieren, wenn nicht oben links ausgerichtet)
  6.         mitte_mc_x = mc._x+breite/2;
  7.         mitte_mc_y = mc._y+hoehe/2;
  8. //alle mcs durchlaufen (anzahl muss definiert sein (!) und angeben wieviele mcs es gibt)
  9.     for(var i:Number = 0; i<anzahl; i++)
  10.     {
  11.         //Referenz auf den in diesem Durchlauf geprüften mc
  12.         tmp = mc._parent["mc"+i];
  13.         // Der mc wird nicht mit sich selbst geprüft (tmp==mc) oder falls er der aktive mc ist (aktiv war in meinem script der mc, der geklickt wurde.
  14.         //Der sollte sich nämlich nicht bewegen, da er von der Maus gesteuert wird)
  15.         if (tmp == mc || tmp == _root.curr_active)
  16.                 //gehe direkt zum nächsten Schleifendurchlauf und brich diesen hier ab.
  17.                 continue;
  18.         do {
  19.             //Berechne  die Mitte des aktuell betrachteten nachbarns
  20.             mitte_tmp_x = tmp._x+breite/2;
  21.             mitte_tmp_y = tmp._y+hoehe/2;
  22.  
  23.            //Abstand zwischen den Mitten der Mcs berechnen
  24.             abstands_vektor_x = mitte_mc_x-mitte_tmp_x;
  25.             abstands_vektor_y = mitte_mc_y-mitte_tmp_y;
  26.  
  27.             // Laenge des Abstandsvektors (bischen Vektorrechnen ;) )               
  28.             abstand_laenge = Math.sqrt(abstands_vektor_x*abstands_vektor_x + abstands_vektor_y*abstands_vektor_y);
  29.  
  30.             //falls der Abstand zu gering ist (max_annaeherung gibt die maximale Annaeherung an.. muss natürlich auch definiert sein)
  31.             if (abstand_laenge<max_annaeherung)
  32.             {
  33.                 //dann bewege den nachbarn tmp vom mc weg
  34.                 //jenachdem ob nach (links oder rechts) und (oben oder unten) muss man +1 oder -1 rechnen.
  35.                 tmp._x += tmp._x > mc._x ? 1: -1;
  36.                 tmp._y += tmp._y > mc._y ? 1: -1;
  37.             }
  38.         //solange diese Schritte wiederholen, bis der Mc weit genug weg ist.
  39.         } while (abstand_laenge<max_annaeherung);
  40.     }
  41. }
pape ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele