Frage bzgl. Random

FlorianR

Erfahrenes Mitglied
Hallo Zusammen,

ich habe eine kleine Anfängerfrage und bin durch die Suche noch nicht wirklich schlauer geworden. Ich habe ein Flashfilm der im Grunde aus 3 Abschnitten besteht. Wenn der Film startet soll er zufällig mit einem der 3 Abschnitte beginnen.

Ich weiss das es die Funktion random(); und Math.random(); gibt. Wobei random(); seit Flash4 angeblich veraltet ist. Nun weiss ich aber nicht, wie ich dem random eines der 3 Schlüsselbilder ( wo er beginnen soll ) zuweisen soll. Ich hoffe ihr könnt mir weiterhelfen.

Gruß,
Florian
 
Hi,

mal angenommen, die Filme liegen in Bild 1, 2 und 3:
Code:
gotoAndStop(int(Math.random() * 3) + 1);

Gruß

P.S.: Beginnt das ganze etwas später (z.B. in Frame 5), dann addier einfach ein paar Frames hinzu.
.
 
Danke für die Antwort :-)
Leider startet er nun immer von der gleichen Position aus.

Zwischen den Abschnitten liegen 98 Frames...

gotoAndPlay(int(Math.random() * 3) + 98);

er startet aber immer den 2. Abschnitt (also nach den ersten 98 Frames).
Und was ist, wenn die Abschnitte nach einer unterschiedlichen Anzahl von Frames beginnen (ist nicht der Fall, wäre aber interessant zu wissen, wie man es dann lösen muss, um das ganze zu verstehen).

Gruß,
Florian
 
Hi,

bei längeren Abständen kommst Du natürlich mit Addition nicht weiter. Ich würds in dem Fall einfach mit einer switch-case-Abfrage lösen:
Code:
var rnd = int(Math.random() * 3);
switch(rnd) {
    case 0: gotoAndPlay(98); break;
    case 1: gotoAndPlay(117); break;
    case 2: gotoAndPlay(219); break;
}
Bei konstanten Abständen könntest Du zwar mit einem Multiplikator arbeiten, aber so sollte es auch gehen. ;)

Gruß
.
 
Ah herrlich, vielen Dank :-) - funktioniert!
Bei einer weiteren Möglichkeit (case) müsste ich den Multiplikator auf *4 setzen usw.- richtig?

Gruß
 
Hi,

bei längeren Abständen kommst Du natürlich mit Addition nicht weiter. Ich würds in dem Fall einfach mit einer switch-case-Abfrage lösen:
Code:
var rnd = int(Math.random() * 3);
switch(rnd) {
    case 0: gotoAndPlay(98); break;
    case 1: gotoAndPlay(117); break;
    case 2: gotoAndPlay(219); break;
}
Bei konstanten Abständen könntest Du zwar mit einem Multiplikator arbeiten, aber so sollte es auch gehen. ;)

Gruß
.

Hi, ich sitz gerade an einer ähnlichen Sache. Es geht um einen (später erweiterbaren) Endlosloop von Überblendungen, die alle gleich lang sind. Die Anim soll einfach an irgend einem Überblendungs-Startbild einsteigen und wenn die Html-Seite mit F5 aktualisiert wird, steigt die Anim irgendwo anders ein. Ich hatte mir jetzt was überlegt, die entsprechenden Key-frames in einem Array zu definieren, den ganzen Loop in einen Movieclip zu packen und auf onLoad ein gotoAndPlay mit einem der Arrayindexes zu starten. Aber so scheints ja viel einfacher zu gehen. Wie gestaltet sich das denn mit so einem Multiplikator?
 
Hi,

ich würd nicht unbedingt sagen, dass Deine Methode umständlicher ist:
Code:
var frames = new Array(50, 100, 150, 200, 250);

function getRandomFrame() {
  var d = int(Math.random() * frames.length);
  meinClip.gotoAndPlay(frames[d]);
}
Wenn die Abstände gleich sind, gehts natürlich auch so:
Code:
var abstand = 50;

var anzahl = 5;

function getRandomFrame() {
  var d = int(Math.random() * anzahl);
  meinClip.gotoAndPlay(1 + d * abstand);
}

Gruß
.
 
Klasse, werd´ ich auch mal testen. Nun hab ich mir aber auf Anraten meines Action-Script-Referenzhandbuches angewöhnt, den Keyframes keine Nummern, sondern sinnvolle Bezeichnungen zu geben. Kann Random denn auf Strings als Variable [d]zugreifen? Im Handbuch werden immer nur Ganzzahlen erwähnt.
 
Hi,

nein, die Methode gibt immer nur eine Zahl zwischen 0 und 1 zurück.

Wenn Du Stringbezeichner für Deine Frames verwenden willst, solltest Du die erste der von mir vorgeschlagenen Methoden verwenden (zu einem Stringbezeichner lassen sich ja schlecht z.B. 50 Frames dazuaddieren ;)):
Code:
var frames = new Array("ani1", "ani2", "ani3", "ani4", "ani5");

function getRandomFrame() {
  var d = int(Math.random() * frames.length);
  meinClip.gotoAndPlay(frames[d]);
}

Gruß
.
 
Zurück