Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-06-2005, 16:04   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 5
Zufälliges Platzieren von MCs ohne Überlagerungen.

Hallo Zusammen,

ich platziere mittels AS Sterne auf der Bühne. Grösse und Position werden zufällig ermittelt. Jetzt hab ich das soweit fertig. Leider gibt es jetzt immer wieder Überlagerungen der MCs. Das will ich nicht haben. Hätte da an sowas wie ne Arraystruktur gedacht bei der immer geprüft wird, ob eine Position doppelt ist. Kann mir da einer auf die Sprünge helfen, oder einen besseren (leichteren) Ansatz formulieren. Bin nicht so familiär mit Arrays.

Hier mein Code:

PHP-Code:
// Setup
starQty 100// Anzahl der Sterne 
stagewidth 550// Bühnenbreite
stageheight 400// Bühnenhöhe
starMaxSize 10// Maximalbreite eines Sterns

// Erzeuge Galaxie
function initGalaxy() {
    for (
i=1i<=starQtyi++) {
        
// StarMC auf Bühne holen und Namen vergeben
        
_root.attachMovie("star""star_"+ii);        
        
myStar = eval("_root.star_"+i);
        
// Zufällige Breite und Höhe sowie X und Y Position        
        
myStar._width Math.round(Math.random()*starMaxSize)+1;
        
myStar._height myStar._width;
        
myStar._x Math.round(Math.random()*(stagewidth-myStar._width));
        
myStar._y Math.round(Math.random()*(stageheight-myStar._height));
        
//Debug
        
trace("-----------");
        
trace("Name: "+myStar);
        
trace("Grösse: "+myStar._width);
        
trace("X-Pos: "+myStar._x);
        
trace("Y-Pos: "+myStar._y);
        
trace("-----------");
    }
}
initGalaxy(); 
Vielen Dank schonmal für eure Mühe.

Gruesse Boogie
boogiewoogie00 ist offline   Mit Zitat antworten
Alt 27-06-2005, 16:15   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
auch dieses thema ist nicht ganz neu

http://www.seibsprogrammladen.de/fra...ispiele/flash5
-> Verteilen
Sich selbst verteilende Objekte.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 27-06-2005, 16:15   #3 (permalink)
Freizeitflasher
 
Benutzerbild von Alphanimal
 
Registriert seit: Jun 2004
Ort: Niederösterreich
Beiträge: 615
du könntest bei jedem Stern den du erstellst die Position solange neu auswählen, bis er auf einer freien Position ist.
das kannst du mit hitTest abchecken

also:

ActionScript:
  1. sec = 0;
  2. do{
  3.     Position Setzen
  4.     sec++;
  5. }while(Position nicht frei && sec<30)

sec ist nur zur Sicherheit falls nach 30 Versuchen keine freie Position gefunden wird, dass der Stern trotzdem überlappt.

"Position nicht frei" ist dann das nächste Problem...
lässt sich auch über eine Schleife von 0 bis i lösen
ActionScript:
  1. free = true;
  2. for(c=0;c<i;c++){
  3.     if(stern_i.hitTest(stern_c)){
  4.         free = false;
  5.         break;
  6.     }
  7. }

stern_i ist dann _root["stern"+i] und stern_c _root["stern"+c] ...

hoffe das hilft dir weiter
__________________
Some Flash Worx
Alphanimal ist offline   Mit Zitat antworten
Alt 27-06-2005, 16:31   #4 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
...das ist aber alles kompliziert. Wieso nicht einfach so:
ActionScript:
  1. // Setup
  2. starQty = 100;
  3. // Anzahl der Sterne
  4. stagewidth = 550;
  5. // Bühnenbreite
  6. stageheight = 400;
  7. // Bühnenhöhe
  8. starMaxSize = 10;
  9. // Maximalbreite eines Sterns
  10. // Erzeuge Galaxie
  11. function initGalaxy() {
  12.     for (i=1; i<=starQty; i++) {
  13.         // StarMC auf Bühne holen und Namen vergeben
  14.         _root.attachMovie("star", "star_"+i, i);
  15.         myStar = eval("_root.star_"+i);
  16.         // Zufällige Breite und Höhe sowie X und Y Position         
  17.         myStar._width = Math.round(Math.random()*starMaxSize)+1;
  18.         myStar._height = myStar._width;
  19.         myStar._x = Math.round(Math.random()*(stagewidth-myStar._width));
  20.         myStar._y = Math.round(Math.random()*(stageheight-myStar._height));
  21.         if (myStar.hitTest(_root["star_"+(i-1)])) {
  22.             removeMovieClip(myStar);
  23.             i--;
  24.         }
  25.     }
  26.     trace(i);
  27. }
  28. initGalaxy();
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 27-06-2005, 20:03   #5 (permalink)
Freizeitflasher
 
Benutzerbild von Alphanimal
 
Registriert seit: Jun 2004
Ort: Niederösterreich
Beiträge: 615
das if ist zu wenig...
du checkst nur ab, ob der stern nicht den berührt, der vorher gesetzt wurde...
aber wenn der dritte den ersten berührt gehts nicht
aber das mit dem i-- funzt natürlich!
__________________
Some Flash Worx
Alphanimal ist offline   Mit Zitat antworten
Alt 28-06-2005, 08:48   #6 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 5
Scheint tatsächlich nur den zuletzt gesetzten Stern zu prüfen. Komm ich also nicht umhin, die schon vergebenen Positionen in einem Array zu speichern und diesen bei jedem Positionieren zu durchsuchen?

BTW: Was macht eigentlich das i--? Hab ich dann nicht ganz geblickt...


Gruesse Boogie
boogiewoogie00 ist offline   Mit Zitat antworten
Alt 28-06-2005, 11:50   #7 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Moin!
Ja, das if war in der Tat zu wenig. Habe ich irgendwie nicht bedacht (Blödheit oder sowas). So sollte es jetzt aber funzen:
ActionScript:
  1. // Setup
  2. starQty = 100;
  3. // Anzahl der Sterne
  4. stagewidth = 550;
  5. // Bühnenbreite
  6. stageheight = 400;
  7. // Bühnenhöhe
  8. starMaxSize = 10;
  9. // Maximalbreite eines Sterns
  10. // Erzeuge Galaxie
  11. function initGalaxy() {
  12.     for (i=1; i<=starQty; i++) {
  13.         // StarMC auf Bühne holen und Namen vergeben
  14.         _root.attachMovie("star", "star_"+i, i);
  15.         myStar = eval("_root.star_"+i);
  16.         // Zufällige Breite und Höhe sowie X und Y Position
  17.         myStar._width = Math.round(Math.random()*starMaxSize)+1;
  18.         myStar._height = myStar._width;
  19.         myStar._x = Math.round(Math.random()*(stagewidth-myStar._width));
  20.         myStar._y = Math.round(Math.random()*(stageheight-myStar._height));
  21.         for (var x in _root) {
  22.             if (_root[x] instanceof MovieClip && _root[x]!=myStar && myStar.hitTest(_root[x])) {
  23.                 removeMovieClip(myStar);
  24.                 i--;
  25.             }
  26.         }
  27.     }
  28. }
  29. initGalaxy();

edit: Ach so, i-- macht das Gegenteil von i++
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++

Geändert von Der Frager (28-06-2005 um 11:52 Uhr)
Der Frager ist offline   Mit Zitat antworten
Alt 28-06-2005, 11:59   #8 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 5
Juhuhu... Vielen Dank - es funktioniert. Ihr seid genial :-) Danke für die superschnelle Hilfe.

Gruesse und schönen (und hoffentlich klimatisierten) Tag

Boogie
boogiewoogie00 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 15:45 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele