Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-02-2004, 13:56   #1 (permalink)
NonsenseStone
Gast
 
Beiträge: n/a
Angry Begrenzung der Zufallsbewegung

Hallo miteinander,

ich versuche es noch ein letztes Mal mein Problem hier zu schildern, hatte dies bereits gemacht, aber leider hatte dazu keiner geantwortet. Ich habe soweit viel alleine geschafft und ich habe sicherlich die Suchfunktion des Forums genutzt, vielleicht einfach nur die falschen Suchbegriffe genutzt?

Zu meinem anliegen: Ich habe Schmetterlinge die per Zufall auf die Bühne platziert werden, jedoch mir immer aus dem Bild rausfliegen, ich wollte wenn sie am rechten Rand sind die Bewegung negativ machen, damit sie in die andere Richtung fliegen. Habe es Ansatzweise nur bei der X-Koordinate gemacht. Hier ist mal der Code den ich bisher benutzt habe. Diese liegt auf dem ersten Frame in _level0:

ActionScript:
  1. fscommand("fullscreen", "false");
  2. fscommand("allowscale", "false");
  3. //
  4. bilderLaden = new loadVars();
  5. bilderLaden.load("http://localhost/fla/bilder.php");
  6. bilderLaden.onLoad = function(success) {
  7.     if (success) {
  8.         randomPic = random(_root.bilderLaden.dateienanzahl);
  9.         bildContainer.loadMovie("http://localhost/fla/img/pic"+randomPic+".jpg");
  10.     } else {
  11.         trace("Fehler beim laden!");
  12.     }
  13. };
  14. // ._rotation
  15. function setzeButterflies(posX, posY, max, mult) {
  16.     for (var i = 0; i<max; i++) {
  17.         butterfly_mc = attachMovie("butterfly_mc", "butterfly_mc"+(i+1), i);
  18.         butterfly_mc._x = posX;
  19.         butterfly_mc._x = posX;
  20.         butterfly_mc._y = posY;
  21.         // Skalierung START
  22.         scaleArray = new Array("10", "20", "25", "30", "40");
  23.         scaleZahl = 5;
  24.         zufallScale = random(scaleZahl);
  25.         scale = scaleArray[zufallScale];
  26.         trace(scale);
  27.         butterfly_mc._xscale = scale;
  28.         butterfly_mc._yscale = scale;
  29.         // Skalierung ENDE
  30.         // Färben START
  31.         farbArray = new Array("6F8657", "D5CEA9", "FFFFFF");
  32.         farbanZahl = 3;
  33.         zufallsFarbe = random(farbanZahl);
  34.         farbe = farbArray[zufallsFarbe];
  35.         butterflyFarbe = new Color(butterfly_mc);
  36.         butterflyFarbe.setRGB(parseInt(farbe,16));
  37.         // Färben ENDE
  38.         butterfly_mc.onEnterFrame = bewegung;
  39.     }
  40.     function bewegung() {
  41.         this.vx += Math.random()*.55-.25;
  42.         this.vy += Math.random()*.55-.25;
  43.         this.vx *= mult;
  44.         this.vy *= mult;
  45.         // Begrenzung?
  46.         if (this._x <= 300) {
  47.             this._x += this.vx;
  48.         } else if (this._x >= 300) {
  49.             this._x -= this.vx;
  50.         }
  51.         // Begrenzung
  52.         this._y += this.vy;
  53.     }
  54. }
  55. setzeButterflies(150, 220, 3, .95);

Bitte wirklich höflichst um Eure mithilfe!

Nonsense. Stone

P.S.: Die Filmgröße ist auf 300 x 440 eingestellt, dass sollte auch der Begrenzungsbereich sein.
  Mit Zitat antworten
Alt 02-02-2004, 15:28   #2 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
du musst damit sie in die andere richtung fliegen die kraft nicht nur in einem rechnungsschritt umkehren
aber ne frage-dieses script funktioniert?
ActionScript:
  1. function bewegung() {
  2.                 this.vx += Math.random()*.55-.25;
  3.                 this.vy += Math.random()*.55-.25;
  4.                 this.vx *= mult;
  5.                 this.vy *= mult;
  6.                 // Begrenzung?
  7.                 if (this._x <= 300) {
  8.                         this._x += this.vx;
  9.                 } else if (this._x >= 300) {
  10.                         this._x -= this.vx;
  11.                 }
  12.                 // Begrenzung
  13.                 this._y += this.vy;
  14.         }
darum gehts dir
hast du die variable mult im root definiert?auf nen eventuelles "mult" auf den schmetterlingen wird so garnicht zugegriffen.
die zufallsberechnung ist auch etwas suspekt und unausgewogen
die drängen alle gegen rechts unten, weil deine zufallswerte immer >0 sind.

also wie gesagt das sollte dein momentanes problem lößen:
ActionScript:
  1. if(this._x+this._width>300) || (this._x-this._width<0) this.vx*=-1
  2. if(this._y+this._height>440) || (this._y-this._height<0) this.vy*=-1

das anstatt deinem if block und vor dem setzen der x und y werte einfügen kehrt die kraft um.

trotzdem wirste wohl probleme kriegen wenn du nicht irgendwann die vektoren vx und vy wieder auf 0 zurücksetzt die gehen ja irgendwann gegen unendlich- oder zumindest den multiplikator temporär <1 setzt, damit die werte schrumpfen

deluxe

Geändert von Deluxe (02-02-2004 um 15:29 Uhr)
Deluxe ist offline   Mit Zitat antworten
Alt 02-02-2004, 17:59   #3 (permalink)
NonsenseStone
Gast
 
Beiträge: n/a
Hi deluxe,

Danke für Deine Hilfe. Das Mult definiere ich in der letzten Zeile:

ActionScript:
  1. setzeButterflies(150, 220, 3, .95);

Vielleicht füge ich Dir mal die Datei bei, damit Du weisst wie ich es gemacht habe, evtl. hast Du einen alternativen Vorschlag?
Angehängte Dateien
Dateityp: zip butterfly.zip (29,8 KB, 68x aufgerufen)
  Mit Zitat antworten
Alt 03-02-2004, 00:10   #4 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
aber das mult ist nicht in deiner funktion vorhanden
leg die im momentanen mc(butterfly_mc) ab, und greife innerhalb der funktion- die ja später dein onEnterFrame wird per

this.mult darauf zu
zip hab ich grad keine nerven zu
deluxe
Deluxe ist offline   Mit Zitat antworten
Alt 03-02-2004, 18:09   #5 (permalink)
NonsenseStone
Gast
 
Beiträge: n/a
Unhappy Uh?

Hi deluxe,

habe jetzt mult im butterfly_mc definiert und greife auch per this.mult drauf zu, aber irgendwie bekomme ich dauernd Fehlermeldungen, nachdem ich Deinen Code eingefügt habe:

ActionScript:
  1. fscommand("fullscreen", "false");
  2. fscommand("allowscale", "false");
  3. //
  4. bilderLaden = new loadVars();
  5. bilderLaden.load("fla/bilder.php");
  6. bilderLaden.onLoad = function(success) {
  7.     if (success) {
  8.         randomPic = random(_root.bilderLaden.dateienanzahl);
  9.         bildContainer.loadMovie("fla/img/pic"+randomPic+".jpg");
  10.     } else {
  11.         trace("Fehler beim laden!");
  12.     }
  13. };
  14. // ._rotation
  15. function setzeButterflies(posX, posY, max) {
  16.     for (var i = 0; i<max; i++) {
  17.         butterfly_mc = attachMovie("butterfly_mc", "butterfly_mc"+(i+1), i);
  18.         butterfly_mc._x = posX;
  19.         butterfly_mc._x = posX;
  20.         butterfly_mc._y = posY;
  21.         // Skalierung START
  22.         scaleArray = new Array("10", "20", "25", "30", "40");
  23.         scaleZahl = 5;
  24.         zufallScale = random(scaleZahl);
  25.         scale = scaleArray[zufallScale];
  26.         trace(scale);
  27.         butterfly_mc._xscale = scale;
  28.         butterfly_mc._yscale = scale;
  29.         // Skalierung ENDE
  30.         // Färben START
  31.         farbArray = new Array("6F8657", "D5CEA9", "FFFFFF");
  32.         farbanZahl = 3;
  33.         zufallsFarbe = random(farbanZahl);
  34.         farbe = farbArray[zufallsFarbe];
  35.         butterflyFarbe = new Color(butterfly_mc);
  36.         butterflyFarbe.setRGB(parseInt(farbe,16));
  37.         // Färben ENDE
  38.         butterfly_mc.onEnterFrame = bewegung;
  39.     }
  40.     function bewegung() {
  41.         this.vx += Math.random()*.55-.25;
  42.         this.vy += Math.random()*.55-.25;
  43.         this.vx *= this.mult;
  44.         this.vy *= this.mult;
  45.         if(this._x+this._width>300) || (this._x-this._width<0) this.vx*=-1
  46.         this._x += this.vx;
  47.         if(this._y+this._height>440) || (this._y-this._height<0) this.vy*=-1
  48.         this._y += this.vy;
  49.     }
  50. }
  51. setzeButterflies(150, 220, 3);
  Mit Zitat antworten
Alt 04-02-2004, 14:01   #6 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
du musst natürlich auch mult in dem jeweiligen butterfly setzen
die funktion bewegung is jetzt korrekt
aber die for schleife in der setzeButterflies funktion is noch nicht korrekt
musste so shcreiben
ActionScript:
  1. //hier mult weiterhing übergeben
  2. function setzeButterflies(posX, posY, max,mult) {
  3.         for (var i = 0; i<max; i++) {
  4.                 butterfly_mc = attachMovie("butterfly_mc", "butterfly_mc"+(i+1), i);
  5. //...
  6. //hier mult in den aktuellen butterfly setzen-is doch nen anderer mc!
  7. butterfly_mc.mult=mult
  8. //..
  9.  

deluxe
Deluxe ist offline   Mit Zitat antworten
Alt 04-02-2004, 16:00   #7 (permalink)
NonsenseStone
Gast
 
Beiträge: n/a
Talking KOMPLETT ANDERS!

Hi deluxe,

also ich habe es jetzt einmal komplett anders gemacht. Ich habe mult fest definiert im butterfly_mc, somit hat jede weiterer Schmetterling die selbe Fluggeschwindigkeit. Das mit der Begrenzung habe ich jetzt mit einer X-Richtung und Y-Richtung Variablen angegeben, doch trotzdem verschwinden die Schmetterlinge nach einer Zeit aus dem Bild. Hier nochmal das Skript

auf butterfly_mc:
ActionScript:
  1. var mult = .95;

und auf Szene1:
ActionScript:
  1. fscommand("fullscreen", false);
  2. fscommand("allowscale", false);
  3. //
  4. bilderLaden = new loadVars();
  5. bilderLaden.load("fla/bilder.php");
  6. bilderLaden.onLoad = function(success) {
  7.     if (success) {
  8.         randomPic = random(_root.bilderLaden.dateienanzahl);
  9.         bildContainer.loadMovie("fla/img/pic"+randomPic+".jpg");
  10.     } else {
  11.         trace("Fehler beim laden!");
  12.     }
  13. };
  14. var richtung_x = 1;
  15. var richtung_y = 1;
  16. function setzeButterflies(max) {
  17.     for (var i = 0; i<max; i++) {
  18.         butterfly_mc = attachMovie("butterfly_mc", "butterfly_mc"+(i+1), i);
  19.         butterfly_mc._x = random(200);
  20.         butterfly_mc._y = random(340);
  21.         // Skalierung START
  22.         scaleArray = new Array("20", "25", "30", "35", "40", "45", "50");
  23.         scaleZahl = scaleArray.length;
  24.         zufallScale = random(scaleZahl);
  25.         scale = scaleArray[zufallScale];
  26.         butterfly_mc._xscale = scale;
  27.         butterfly_mc._yscale = scale;
  28.         // Skalierung ENDE
  29.         // Färben START
  30.         farbArray = new Array("6F8657", "D5CEA9", "FFFFFF", "F0EDE0");
  31.         farbanZahl = farbArray.length;
  32.         zufallsFarbe = random(farbanZahl);
  33.         farbe = farbArray[zufallsFarbe];
  34.         butterflyFarbe = new Color(butterfly_mc);
  35.         butterflyFarbe.setRGB(parseInt(farbe, 16));
  36.         // Färben ENDE
  37.         butterfly_mc.onEnterFrame = bewegung;
  38.     }
  39.     function bewegung() {
  40.         this.vx += (Math.random()*.55-.25) * richtung_x;
  41.         this.vy += (Math.random()*.55-.25) * richtung_y;
  42.         this.vx *= this.mult;
  43.         this.vy *= this.mult;
  44.         if(this._x>300) richtung_x = -1;
  45.         if(this._x<0) richtung_x = 1;
  46.         if(this._y>440) richtung_y = -1;
  47.         if(this._y<0) richtung_y = 1;
  48.         /*if(this._x+this._width>300) richtung_x = -1;
  49.         if(this._x+this._width<80) richtung_x = 1;
  50.         if(this._y+this._height>440) richtung_y = -1;
  51.         if(this._y+this._height<80) richtung_y = 1;*/
  52.         this._x += this.vx;
  53.         this._y += this.vy;
  54.     }
  55. }
  56. setzeButterflies(5);

So, das meiste ist gelöst, wollte auch, dass die Platzierung des neuen Schmetterlings zufallsbedingt ist, habe einfach die ursprungs Koordinaten X und Y mit random gelöst, wobei das nicht wirklich "sauber" ist, aber er klappt. Mir ist nicht wichtig, dass jeder butterfly_mc seine eigenen mult bekommt, sondern vielmehr, dass die innerhalb des von mir definieren Feld bleiben.

Du hast mir sehr viel geholfen, vielen lieben Dank!

Ciao,
Nonsense. Stone
  Mit Zitat antworten
Alt 04-02-2004, 16:57   #8 (permalink)
Neuer User
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 6.415
ActionScript:
  1. function bewegung() {
  2.                 this.vx += (Math.random()*.55-.25)
  3.                 this.vy += (Math.random()*.55-.25)
  4.                 this.vx *= this.mult;
  5.                 this.vy *= this.mult;
  6. //umkehren
  7.                 if(this._x>300 || this._x<0) this.vx*=-1;
  8.                 if(this._y>440 || this._y<0) this.vy*= -1;
  9. //rand überschritten? zurücksetzen auf rand
  10.           if(this._x+this._width/2>300) this._x=300-this._width/2
  11.                 if(this._x-this._width/2<0) this._x=this._width/2
  12.                 if(this._y+this._height/2>440) this._y=440-this._height/2
  13.                 if(this._y-this._height/2<0) this._y=this._height/2
  14.                 this._x += this.vx;
  15.                 this._y += this.vy;
  16. }

du solltest doch die vektoren vx und vy umkehren und nicht das was du zu den vektoren addierst
so sollte es klappe aber noch nen rat, bzw immernoch
deine randomfunktion wird deine viecher nach rechts unten schicken weil die x und y werte kontinuierlich ansteigen

besser ist sowas
ActionScript:
  1. this.vx += (Math.random()*.55-.25)-(Math.random()*.55-.25)*Math.random()*2
  2.                 this.vy += (Math.random()*.55-.25)-(Math.random()*.55-.25)*Math.random()*2

damit kannst du zahlen von -0.25 bis +0.25 erreichen
anstatt nur 0 bis 0.25
die hinterste 2 hab ich um ein Math.random erweitert weil die random funktion von flash absoluter kack ist

denn auch wenn statistisch alle werte von -0.25 bis 0.25 auftreten sollten überwiegen -0.25...
desshalb wollt ich die hintere 2 nich so stark werten lassen
jetzt sollten die recht "zufällig" fliegen

gruß
deluxe
Deluxe ist offline   Mit Zitat antworten
Alt 04-02-2004, 19:50   #9 (permalink)
NonsenseStone
Gast
 
Beiträge: n/a
Talking Super!

Hi deluxe,

vielen lieben Dank!!! Passt perfekt jetzt bekomme aber bei MX 2004 Pro immer die Fehlermeldung:

**Warnung** Szene=Szene 1, Ebene=ActionScript, Bild=1:Zeile 4: Der Bezeichner 'loadVars', bei dem es nicht auf die Groß-/Kleinschreibung ankommt, verdeckt das integrierte Objekt 'LoadVars'.
bilderLaden = new loadVars();

Das beeinträchtigt nicht wirklich die Funktion des Skriptes, ist ohne Problem einsetzbar, aber wundere mich darüber!

Also, vielen lieben Dank!!!!

Nonsense. Stone
  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 17:26 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele