Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 24-09-2005, 18:19   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 20
mit duplicateMovieClip zeitlich versetzt Raumschiffe verschiedener Größen erstellen?

Hallo!
Ich habe ein Problem, an dem ich heute den ganzen Tag lang nicht dran lösen konnte:
Ich will ein Spiel machen, indem man Raumschiffe beschiessen soll, die vom linken und vom rechten Bildschirmrand in verschiedener Größe an verschiedenen y-Positionen zu verschiedenen Zeitpunkten angeflogen kommen, und sich nicht treffen sollen. Das mit dem Beschiessen hab ich geschafft, nur die Raumschiffe machen arge Probleme.

Für die Größe der Raumschiffe hab ich _xcale und _yscale verwendet, was beides auf der jeweils anderen Seite einer globalen Variablen steht, und damit die Größenverhältnisse des Raumschiffs gleich hält. In der globalen Variable steht noch Math.random(); (und noch nen paar Zahlen), damit die Größe der duplizierten Movieclips immer verschieden ist.
ActionScript:
  1. onClipEvent (enterFrame) {
  2.         _root.shipvlinks.duplicateMovieClip("Schiffvlinkscopy"+i, i);
  3.         _root["Schiffvlinkscopy"+i]._xscale = _global.skalierung
  4.         _root["Schiffvlinkscopy"+i]._yscale = _global.skalierung
  5.         _root["Schiffvlinkscopy"+i]._x += 5
  6.     _global.skalierung = (150+Math.random(150)*1400);
  7. }
wenn man das jetzt aber einfach so auf einen Movieclip in einem Movieclip legt und nach ein paar Frames das Script entfernt, ist der duplizierte Movieclip weg. Während er da ist, wackelt er aber nur rum (skalierung).

Es sollen ja eigentlich alle paar Sekunden ein neuer Movieclip mit neuer Skalierung mit neuer Startposition erstellt werden (zeitliche Verschiebungen des Auftauchens im Sichtfeld will ich durch zufällige Positionierung auf der x-Achse machen), und nicht nach einiger Zeit den einzige erstellten gelöscht haben. Dass die Movieclips dann auch wieder gelöscht werden, bekomme ich auch noch hin. Kleinere Movieclips sollen sich auch ein bisschen langsamer bewegen.

Das wars erstmal, wenn mir noch was einfällt, schreib ich's noch

MfG
Jonny

PS: Ich mache das Script eigentlich mit der Flash 8 Demo, aber die Auswahlmöglichkeit fehlt noch. (so große Unterschiede dürften doch bei so einem Script aber nicht auftauchen, oder?)
Don Jonny ist offline   Mit Zitat antworten
Alt 24-09-2005, 18:58   #2 (permalink)
:Void
 
Benutzerbild von janoshnosh
 
Registriert seit: Jun 2005
Ort: börlin
Beiträge: 931
hi, ich schreibe mal ein paar anregungen und fragen in deinen code:
ActionScript:
  1. onClipEvent (enterFrame) {
  2.         _root.shipvlinks.duplicateMovieClip("Schiffvlinkscopy"+i, i);
  3.  
  4. //_global.skalierung beim ersten durchlauf schon definiert?
  5.         _root["Schiffvlinkscopy"+i]._xscale = _global.skalierung
  6.         _root["Schiffvlinkscopy"+i]._yscale = _global.skalierung
  7.  
  8.         _root["Schiffvlinkscopy"+i]._x += 5
  9. //was ist das? es sieht so aus, als ob du das schiff immer weiter nach rechts
  10. //verschieben wolltest, machst du aber nicht. damit wird lediglich das erstellte
  11. //schiff von 0 auf 5 gesetzt (bei 0/0 wird es dupliziert), beim nächsten durchlauf
  12. //handelt es sich aber schon um ein anderes schiff
  13.  
  14.         _global.skalierung = (150+Math.random(150)*1400);
  15. //angenommen Math.random() gibt die 75, dann ist die resultierende skalierung 105150!! willst du das wirklich??
  16.  
  17. //auf jeden fall musst du "i" inkrementieren (erhöhen), z.b. mit i++;
  18. //damit die duplizierten mc's sich nicht gegenseitig killen
  19. }

wenn du mit flash 8 arbeitest, solltest du besser mit der zeit gehen und keinen code mehr in mc's schreiben. benutze lieber die zeitleiste und schreibe deinen code da.

vielleicht reicht ja schon das i++ alleine!?
gruß janosch
janoshnosh ist offline   Mit Zitat antworten
Alt 24-09-2005, 20:00   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 20
Das macht keinen Unterschied, ob die _global.skalierung schon vorher definiert ist.

Dann verstehe ich da eigentlich nicht, warum das nicht alles weiter verschoben wird: Ich greife doch mit ["Schiffvlinkscopy"+i] auf alle duplizierten Objekte zu!? (Ausserdem wird die Skalierung ja ständig verändert, warum dann nicht auch die Postition?

Ich hab das extra in nen Movieclip geschrieben, weil das Duplizierungsskript nur alle paar Frames kommen sollte, damit nicht eine Wand aus Raumschiffen übern Bildschirm fliegt. Mit einem getTimer(); hab ich das nämlich nicht hinbekommen.

wenn ich mit so einem for(i=1; i<=1; i++) arbeite (von 'ner Flash-Buch-CD), dann werden 10 mc's erstellt und alle vergrößern/verkleinern sich laufend.

Ich möchte ja, dass jedes duplizierte Objekt einmal seine eigene Größe der _global.skalierung anpasst (die auch beibehält, also am besten bei der Erstellung), dann aber die ganze Zeit (in der es sichtbar ist) über sich auf der x-Achse verschiebt, um schlussendlich auf der anderen Seite mit einem removeMovieClip gelöscht zu werden (oder bei Abschuss nach einer großen Explosion )
Don Jonny ist offline   Mit Zitat antworten
Alt 24-09-2005, 21:37   #4 (permalink)
:Void
 
Benutzerbild von janoshnosh
 
Registriert seit: Jun 2005
Ort: börlin
Beiträge: 931
Zitat:
Zitat von Don Jonny
Das macht keinen Unterschied, ob die _global.skalierung schon vorher definiert ist.
es macht den unterschied, dass beim ersten durchlauf ein undefined zugewiesen wird, und das bringt nichts. ist aber in der praxis nicht weiter tragisch.

Zitat:
Ich greife doch mit ["Schiffvlinkscopy"+i] auf alle duplizierten Objekte zu!?
nein, ganz und gar nicht! damit greifst du lediglich auf das objekt zu, dass den index hat, den "i" gerade hat. also auf genau einen mc. aus deinem script geht halt gar nicht hervor, wo und wie du "i" benutzt, wann es erhöht wird.... du sagtest da was von ner for-schleife, um alle objekte von 1-10 zu verschieben, müsstest du
ActionScript:
  1. for (var i:Number=1; i<11; i++) {
  2. _root["Schiffvlinkscopy"+i]._x += 5
  3. }
schreiben, meintest du das??

das alles ist ein bisschen undurchsichtig, am besten ist, du postest ein bisschen mehr code oder die fla.

gruß janosch
janoshnosh ist offline   Mit Zitat antworten
Alt 25-09-2005, 13:52   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 20
Ich häng mal lieber gerade die .fla mit an, denn dein Script hat bei mir nicht funktioniert (sowohl mit der "duplicateMovieClip"-Funktion innerhalb der "for"-geschweiften Klammern als auch ausserhalb).
Angehängte Dateien
Dateityp: zip Problemschiff.zip (5,9 KB, 3x aufgerufen)
Don Jonny ist offline   Mit Zitat antworten
Alt 25-09-2005, 18:20   #6 (permalink)
:Void
 
Benutzerbild von janoshnosh
 
Registriert seit: Jun 2005
Ort: börlin
Beiträge: 931
hi, ich hab dir das mal als zeitleistenvariante geschrieben, allein auch aus dem grund, dass ich bis zuletzt nicht herausgefunden habe, wo du deinen code versteckt hast (obwohl ich ihn sehen konnte) .

ich habe hier doch die interval-methode benutzt und dafür aber auch einige erklärungen mit in den code kommentiert, ich hoffe es ist ein bisschen verständlich. wenn doch noch Fragen dann bitte fragen!
ActionScript:
  1. //startet den interval
  2. intervaller (0);
  3.  
  4. //intervaller: ruft eine funktion in unregelmäßigen abständen auf
  5. function intervaller (i:Number) :Void {
  6.     //laufnummer, die die durchgänge mitzählt
  7.     var j:Number = i + 1;
  8.    
  9.     //r: zufällige zahl zwischen 500 und 2500, nach der der intervaller erneut aufgerufen wird
  10.     var r:Number = random(2000) + 500;
  11.    
  12.     //der vorherige interval wird gelöscht
  13.     clearInterval(intvl);   
  14.    
  15.     //die ziel-funktion wird aufgerufen
  16.     duplicator (j);
  17.    
  18.     //der interval wird erneut gestartet: intervaller wird aufgerufen, r wird als zeit festgelegt, j als parameter an intervaller übergeben
  19.     intvl = setInterval(intervaller, r, j);
  20. }
  21.  
  22. function duplicator (i:Number) :Void {
  23.     //schiff wird erstellt, immer auf der nächsthöheren ebene mit dem namen 'schvlCopy'+laufnummer i
  24.     var ship:MovieClip = _root.shipvlinks.duplicateMovieClip('schvlCopy'+i, _root.getNextHighestDepth());
  25.  
  26.     //zufälliger scale-factor, von 50 bis 150
  27.     var rScale = random(100) + 50;
  28.    
  29.     //ship wird skaliert
  30.         ship._xscale = ship._yscale = rScale;
  31.     //ship wird zufällig auf einen y-wert gesetzt
  32.         ship._y = random(480);
  33.     //ship bekommt eine variable "speed", die einen zufälligen wert hat
  34.         ship.speed = random(8) + 2;
  35.        
  36.     //jedem ship-objekt wird dann der oEF handler zugewiesen
  37.     ship.onEnterFrame = function () {
  38.         //ship ist damit this, also wird ship um x verschoben, um den wert ship.speed
  39.         this._x -= this.speed;
  40.         //wenn _x null ist, also das schiff am linken rand ist, wird es entfernt
  41.         if (this._x < 0) {
  42.             //****hier alle anderen actions festlegen, die fürs verlassen des schiffs eintreten sollen***//
  43.             this.removeMovieClip();
  44.         }
  45.     }   
  46. }
gruß janoschnosch


EDIT: ich habe außerdem die bitrate auf 30 fps gestellt, nicht wundern wenns jetzt flüssiger läuft als bei der anderen version
Angehängte Dateien
Dateityp: zip Schiff.zip (8,2 KB, 11x aufgerufen)

Geändert von janoshnosh (25-09-2005 um 18:22 Uhr)
janoshnosh 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 22:04 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele