Ich fordere eure (ehrliche&faire) Kritik!

DerWalter

Mitglied
Ich habe das erste mal etwas in Flash gebaut, würde jetzt gerne den code posten und mich verbessern lassen. Auf gut österreichischisch: Wie hätte ichs besser schneller direkter machen können. BITTE! unbedingt den Aufbau IM .fla kritisieren. Denn ich mag so schnell wie nur möglich so weit wie nur möglich kommen. Es genügt mir auch wenn Ihr nur direkt einen Befehl oder die Art eines Codeteils kritisiert, nur dann bitte mit Begründung, es soll ja nicht in einer sinnlosen Niedermähung, meiner einems, enden. Hiermit erkläre ich meinen Unterricht, für ERÖFFNET ;)

Danke an alle die sich einen Augenblick Zeit nehmen.

PHP:
a = 20; //anzahl sterne
b = 10; //anzahl streifen

//////////////erstelle neuen movieclip 
this.createEmptyMovieClip("container", 1);
this.createEmptyMovieClip("container2", 2);
////////////////////erstelle sterne
 for (i=1; i<=a; i++) {

	container.attachMovie("stern", "stern"+i, i+500); 	//name
	container["stern"+i].blendMode = "add";				//addiert
	container["stern"+i]._alpha = Math.random(90)+40;	//random duchsichtig min 40 maximal 120 ^^
	if (container["stern"+i]._alpha<40){				//wenn alpha kleiner 40 setze + 20
	container["stern"+i]._alpha=container["stern"+i]._alpha+20;
	};	
	container["stern"+i]._x = Math.round(Math.random()*100+512);	//random position irgendwo ^^ war spielerei
	container["stern"+i]._y = Math.round(Math.random()*150+275);
	container["stern"+i]._rotation = Math.round(Math.random()*150+50);
	container["stern"+i].speed = Math.round(Math.random()*10+2000);
}
/////////////////////das selbe nochmal für die scheinchein
for (i=1; i<=b; i++) {
	container2.attachMovie("schein", "schein"+i, i+500);
	container2["schein"+i].blendMode = "add";
	container2["schein"+i]._x = Math.round(Math.random(1000)*1000);
	container2["schein"+i]._y = 255;
	container2["schein"+i].speed = Math.round(Math.random()*10+3);

	if (Math.random()*8 >= 4) {
		container2["schein"+i].richtung = "links";
	} else {
		container2["schein"+i].richtung = "rechts";
	}
}

this.onEnterFrame = function() {
	
///////////////////////////////////sternchen bewegung, hab ich übernommen keinen plan von ... :|

	for (i=1; i<=a; i++) {
		container["stern"+i]._y -= Math.sin(container["stern"+i].speed);
		container["stern"+i]._x += Math.cos(container["stern"+i].speed);
		container["stern"+i]._rotation += Math.round(Math.random(10));
		if (container["stern"+i]._x<0 || container["stern"+i]._x>1000 || container["stern"+i]._y<350 || container["stern"+i]._y>425) {
			reset(i);

		}
	}
///////////////////// das is von mir juhu :)
	for (i=1; i<=b; i++){

			if (container2["schein"+i].speed<=3) {
				container2["schein"+i].speed = Math.round(Math.random()*10+3);//speed erhöhen falls zu klein
			}
			
			//wenn links anstosst richtungs wechsel nach rechts und umgekehrt jippie :D
			if (container2["schein"+i].richtung == "links" && container2["schein"+i]._x<=-20) {
				container2["schein"+i].richtung = "rechts";
				container2["schein"+i].speed = Math.random()*10+3;
			} else if (container2["schein"+i].richtung == "links") {
				container2["schein"+i]._x -= container2["schein"+i].speed;
			}
			if (container2["schein"+i].richtung == "rechts" && container2["schein"+i]._x>=925) {
				container2["schein"+i].richtung = "links";
				container2["schein"+i].speed = Math.random()*10+3;
			} else if (container2["schein"+i].richtung == "rechts") {
				container2["schein"+i]._x += container2["schein"+i].speed;
			}

		}
};

//falls ein stern böse war und sich über den ausgemachten rand gewagt hat zurück zum start :D
function reset(no) {
	container["stern"+i]._x = Math.round(Math.random()*250+512);
	container["stern"+i]._y = Math.round(Math.random()*150+300);
	container["stern"+i]._rotation = Math.round(Math.random()*150+50);
	container["stern"+no].speed = Math.round(Math.random()*10+2000);
}
/////////////////////////////////////////////////////////////////////////////
////////////////////////////////ENTER BUTTON/////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

enter_btn.onRelease = function() { //wenn losgelassen passiert das
this.onEnterFrame = function() {
	

	
	//solange die 3 movieclips net alpha 0 oder kleiner haben wird alpha dezimiert
	if (container["stern"+i]._alpha<=0 && container2["schein"+i]._alpha<=0 && enterscreen._alpha<=0)
	{
			container["stern"+i]._alpha=0;
			container2["schein"+i]._alpha=0;
			enterscreen._alpha=0;
			delete this.onEnterFrame;
			drift();
	}
	else
	{
		for (i=1; i<=a; i++) {
			container["stern"+i]._alpha -=10;		
			trace("stern "+enterscreen._alpha);	
		};

		for (i=1; i<=b; i++){
			container2["schein"+i]._alpha -= 10;
			trace("schein "+enterscreen._alpha);	
		};
			enterscreen._alpha -= 7;
			trace("enterscreen "+enterscreen._alpha);	
	
		};
	}
};

////////////////////////DRIFt!///////////////////////////
///jaaaa hier werden die schwarzen felder ausgefadet!!///
drift = function(){
	this.onEnterFrame = function(){
	if(rand_oben._alpha>=0){
		rand_oben._alpha-=5;
		rand_unten._alpha-=5;
			if(rand_oben._alpha<=10){
				rand_oben._y-=100;
				rand_unten._y+=100;
			}
	}else{
		delete this.onEnterFrame;
		gotoAndStop(2);	
	}
	}
}
stop();

ps.: die kommentare im code sind kein spam sondern orignial ;) weis noch aus Director Lingo Zeiten das man ohne einfach aufgeschmissen ist, und da es normalerweise keiner liest sind diese eben kindisch und ohne Rechtschreibung formatiere, so bin ich numal wenn ich nicht gerade auf tutorials.de schreibe :D

~mfg.derWalter~
 

Anhänge

Hi,

nur erstmal eine Kleinigkeit auf den ersten Blick: Statt überall
Code:
container["stern"+i]
zu schreiben (anfällig für Tippfehler), würde ich diese Referenz einmal in einer Variable ablegen und diese verwenden:
Code:
var obj = container["stern"+i];
obj._alpha = sonstwas;
// .. usw.
;)

Du könntest auch überlegen, Deine MovieClips in einem Array abzulegen - dann ersparst Du Dir die Einzelreferenzierung und kannst bei Bedarf auch recht fix alle Elemente durchlaufen:
Code:
var stern = new Array();

for (var i=0; i<anzahl; i++) {
    stern[i] = container.attachMovie("stern", "stern" + i, i +5 00);
}
Code:
// wenn irgendwas mit allen Sternen passieren soll:
for (var i in stern) {
    stern[i].irgendwas = wasanderes;
}

Dann bevorzuge ich statt folgender Schreibweise:
Code:
for (i=1; i<=b; i++){
eher die Indizierung ab 0:
Code:
for (i=0; i<b; i++){
- mag Geschmackssache sein, aber Listen, Arrays usw. beginnen generell meist mit dem Index 0, so dass eine gewisse Vereinheitlichung stattfindet.

Gruß
.
 
Hallo,

Tobias Menzel hat gesagt.:
var obj = container["stern"+i];
obj._alpha = sonstwas;
// .. usw.

! ;)

Ich empfehle dir, die Animationsfunktionen für die Sterne und die Streifen bzw alle Anweisungen, die onEnterFrame ausgeführt werden sollen, auf die MC's selbst zu legen, etwa so:

Code:
var i = anzahlSterne;

while (i--) {
    var obj = container.attachMovie("stern", "stern"+i, i+500); 	
    obj.blendMode = "add";				
    obj._alpha = Math.random(90)+40;	
    //usw
    //nun aber gibst du dem jeweiligen Clip "seine eigene" Animation mit
    obj.onEnterFrame = function () {
        if (this.speed<=3) {
            this.speed = Math.round(Math.random()*10+3);
        }
        //usw
    }
}

So brauchst du nicht onEnterFrame was weiss ich wieviele for-Schlaufen abzuarbeiten, was nämlich u.U. ganz schön auf die Performance schlagen kann.

gruss
 
@luke: Meinst Du, dass 100 onEnterFrame-Methoden, die ihre jeweiligen Clips animieren schneller abgearbeitet werden, als eine zentrale, die 100 Clips animiert? Müsste ich mal ausprobieren. ;)

Gruß
.
 
@Tobi:

Nee, sind sie nicht ;), die Zeit verwendest du besser, um auszuprobieren, ob 1 zentrales onEnterFrame mit einer 100fach ausgeführten for-Schlaufe schneller ist als 100 onEnterFrames. Und mehr Stil (das mag nun SEHR subjektiv sein :-)) haben die Methoden allemal.

gruss
 
Zuletzt bearbeitet:
Jo dann Dank ich erstmal recht herzlich, und werde nun versuchen den Code mit euren Vorschlägen zu optimieren :).

Die eine oder andere Frage und eine Antwort hätte ich noch:

Weshalb steht an dieser Stelle
PHP:
 for (i=1; i<=a; i++) {

    container.attachMovie("stern", "stern"+i, i+500);
+500?, es steht doch in der Schleife darüber schon 'i++' ?

Weshalb var, geht das nicht auch ohne? Welchen Sinn erfüllt das var an dieser stelle?
PHP:
var obj = container["stern"+i];

Und auf die Anspielung das man i besser auf 0 statt auf 1 setzt, das habe ich deshalb gemacht, weil ich sonst immer 11 statt 10 Sterne habe weil er auch immer eine Instanz mit der 0 hinten daran erstellt. Sprich ich gebe 10 ein und er erstellt instanzen von 0 weg und dann meine 10. Kleiner Perfektionist, und damit habe ich das Problem in meinen Augen gelöst gehabt.

~mfg.derWalter~
 
Zuletzt bearbeitet:
container.attachMovie("stern", "stern"+i, i+500);
... die Zeile ist doch von Dir, oder? Die "500" sind m.E. Überflüssig, da ich annehme, dass der Container bisher keine weiteren MovieClips enthält. "i" muss allerdings in der Tiefenangabe stehen, damit alle Instanzen von "stern" eine eigene Tiefenebene erhalten.

var obj = container["stern"+i];
Deklarierst Du eine Variable innerhalb einer Funktion mit "var", so wird eine lokale Funktionsvariable erstellt, die ausserhalb dieser Funktion keine Gültigkeit hat. Lässt Du das "var" weg, so wird eine Objektvariable angelegt. Ausserhalb von Funktionen kannst Du es theoretisch halten, wie Du willst, es ist aber besserer Stil, Variablen immer mit "var" zu deklarieren. Noch besserer Stil ist es, ab AS2.0 strikte Typen anzugeben:
Code:
var obj:MovieClip = container["stern" + i];
In diesem Fall bekommst Du sogar eine Fehlermeldung, wenn Du versuchst, dieser Variable einen Wert eines anderen Typs zuzuweisen.

Gruß
.
 
Zurück