PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Endlosschleife


burnout
21.12.2006, 17:38
hallo,bei dem versuch mit actionscript eine eindlosschleife zu erzeugen ,bekomme ich die meldung "das durch die ausführung des script ,das programm abstürzen könnte"

was kann man da machen?

danke.


pate33
21.12.2006, 17:43
Keine Endlosschleife erzeugen?! Was genau willst du denn damit machen? Es gibt z.B. auch Intervalle (siehe setInterval(), [1]) als Alternative.

[1] http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001766.html

burnout
21.12.2006, 18:04
hört sich logisch an,aber ich brauch doch eine,da ich jetzt meinen duplizierten movieclip mit if abfragen der position,die points bewegen möchte und dazu muss er immer den selben code ab arbeiten! so ungefähr stell ich mir das vor...

pate33
21.12.2006, 18:20
dann geht das mit dem Interval am besten. Einfach eine Funktion schreiben, welche dann alle x Millisekunden aufgerufen wird. Endlosschleifen sind keine sonderlich gute Wahl. ;)

burnout
21.12.2006, 18:41
dank dir,ich versuche das ganze mal mit intervalle ,bis zum nächsten problem :D

mnemonic
21.12.2006, 18:44
hört sich logisch an,aber ich brauch doch eine,da ich jetzt meinen duplizierten movieclip mit if abfragen der position,die points bewegen möchte und dazu muss er immer den selben code ab arbeiten! so ungefähr stell ich mir das vor...
Dafür kannst (musst!) Du auch MovieClip.onEnterFrame nehmen. Das sollte am genausten sein.
Oder nimm, wie von Patrick vorgeschlagen, setInterval.

Skripte mit Endlosschleifen werden vom Interpreter gnadenlos nach einem festen Timeout abgemurkst, was auch gut so ist.
Beherzige das Prinzip der Zeitleiste (Timeline).

burnout
22.12.2006, 19:07
hallo,ich hab die rotation jetzt soweit hinbekommen ,blöd ist nur,das nur _level.pDupli29 rotiert!
wie kann ich das ändern?
und wenn der point sein limit erreicht hat,bleibt er nur an der selben stelle und rotiert da vor sich hin.
danke.

stop();
var maxVel:Number = 5;
var maxX:Number = 730;
var maxY:Number = 270;
var posX:Number = 0;
var posY:Number = 0;
var num:Number = 30;
var pDupli:MovieClip;
point._visible = false;
var ration:Number = 100;

for(var i:Number = 1; i < num; i++)
{
pDupli = point.duplicateMovieClip("pDupli" + i, i);
pDupli = this["pDupli" + i];
pDupli._x += pDupli._x ;
pDupli._y += pDupli._y ;
pDupli._x = random (maxX); // verteilte mc auf X koordinate
pDupli._y = random (maxY); // verteilte mc auf Y koordinate
}
function eCallback():Void
{
if (pDupli._x + posX < maxX and pDupli._y + posY < maxY)
{
pDupli._x = pDupli._x + random (maxVel) ;
pDupli._y = pDupli._y + random (maxVel) ;
}
else
{
pDupli._x = pDupli._x - random (maxVel) ;
pDupli._y = pDupli._y - random (maxVel) ;
}
if (pDupli._y + posY > maxY and pDupli._y + posY > maxY)
{
pDupli._x = pDupli._x - random (maxVel) ;
pDupli._y = pDupli._y - random (maxVel) ;
}
else
{
pDupli._x = pDupli._x - random (maxVel) ;
pDupli._y = pDupli._y - random (maxVel) ;
}

trace("duplicat " + pDupli);
}
setInterval(this,"eCallback",ration);

mnemonic
22.12.2006, 19:30
hallo,ich hab die rotation jetzt soweit hinbekommen ,blöd ist nur,das nur _level.pDupli29 rotiert!
wie kann ich das ändern?
Schau Dir den Code nochmal genau an.
Welchen Wert hat pDupli am Ende der for-Schleife?

und wenn der point sein limit erreicht hat,bleibt er nur an der selben stelle und rotiert da vor sich hin.
danke.
Ich würde schwer darauf tippen, dass das an den Bedingungen liegt.
Änder die Bedingungen mal wie folgt ab:
if (((pDupli._x + posX) < maxX) && ((pDupli._y + posY) < maxY)))

HTH

burnout
23.12.2006, 03:00
hi,die rotation funktioniert jetzt soweit und zwar mit folgender bedingung!

((pDupli._x + posX < maxX) && (pDupli._y + posY < maxY))
((pDupli._x + posX > maxX) && (pDupli._y + posY > maxY))

ich glaub du hattest eine klammer zuviel gesetzt ,da er mir das (((pDupli._x + posX) < maxX) && ((pDupli._y + posY) < maxY)))als fehler auslegt!
Schau Dir den Code nochmal genau an.
Welchen Wert hat pDupli am Ende der for-Schleife?
trace sagt mir das pDupli bis 29 inkrementiert wird!


thx!

mnemonic
23.12.2006, 04:36
trace sagt mir das pDupli bis 29 inkrementiert wird!
Mir war das soweit schon klar, ich wollte lediglich, dass Du Dich nochmal intensiv mit dem Code auseinandersetzt, da man den "Fehler" schon als überaus offensichtlich bezeichnen könnte. ;)

Also: Am Ende der for-Schleife ist pDupli eine Referenz auf den zuletzt erstellten MovieClip (pDupli29). Da Du den Wert von pDupli im weiteren Verlauf des Codes nicht mehr änderst, bleibt er auch eine Referenz auf den zuletzt erstellten MovieClip und da Du pDupli auch innerhalb von eCallback benutzt und den Wert auch dort nicht veränderst wird natürlich auch nur dieser eine Clip bewegt.
Wenn Du willst, dass sich alle 29 Clips bewegen, dann musst Du natürlich auch innerhalb von eCallback eine Schleife benutzen und jeden Clip separat ansprechen.

Keine Panik, sowas passiert flott. :)

HTH

burnout
23.12.2006, 14:11
danke dir,hast mir echt gut geholfen.hier nochmal der fertige code für die rotation der duplizierten mc´s

stop();
var maxVel:Number = 5;
var maxX:Number = 730;
var maxY:Number = 270;
var posX:Number = 0;
var posY:Number = 0;
var num:Number = 30;
var pDupli:MovieClip;
point._visible = false;
var ration:Number = 40;

for(var i:Number = 1; i < num; i++)
{
pDupli = point.duplicateMovieClip("pDupli" + i, i);
pDupli = this["pDupli" + i];
pDupli._x += pDupli._x ;
pDupli._y += pDupli._y ;
pDupli._x = random (maxX);
pDupli._y = random (maxY);
trace (pDupli);
}
function eCallback():Void
{
for(var i:Number = 1; i < num; i++)
{
pDupli = this["pDupli" + i];

if ((pDupli._x + posX < maxX) && (pDupli._y + posY < maxY))
{
pDupli._x = pDupli._x + random (maxVel) ;
pDupli._y = pDupli._y + random (maxVel) ;
}
else
{
pDupli._x = pDupli._x - random (maxVel) ;
pDupli._y = pDupli._y - random (maxVel) ;
}
if ((pDupli._x + posX > maxX) && (pDupli._y + posY > maxY))
{
pDupli._x = pDupli._x + random (maxVel) ;
pDupli._y = pDupli._y + random (maxVel) ;
}
else
{
pDupli._x = pDupli._x - random (maxVel) ;
pDupli._y = pDupli._y - random (maxVel) ;
}
}

}
setInterval(this,"eCallback",ration);