Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-10-2011, 23:41   #1 (permalink)
Student
 
Registriert seit: Oct 2011
Beiträge: 9
Mehrdimensionales Array

Nach vielen Stunden Arbeit ohne Ergebnisse, möchte ich nun euch fragen da ich es anscheinend nicht versteh.

Habe ein mehrdimensionales Array, ich möchte nun das nach jedem erzeugten Objekt aus der Bibliothek eine zufällige Pause gemacht wird, bis der nächste Arraywert ausgelesen wird.

Code:
//Array der Feuer-Koordinaten
var FireArray = new Array();
	FireArray[0] = ({xk:240, yk:276});
	FireArray[1] = ({xk:255, yk:288});
	FireArray[2] = ({xk:304, yk:288});
	FireArray[3] = ({xk:333, yk:307});
	FireArray[4] = ({xk:361, yk:289});
	FireArray[5] = ({xk:380, yk:308});
	
//Länge des Arrays
var ArrayLenght = FireArray.length;
	
//Zähler für Feuererzeugung
var n = 1;

function machFeuer() {	
for(i=0; i < ArrayLenght; i++) {
	// Parameter
	// 1) Bezeichner des Symbols
	// 2) Instanzname der neuen Instanz
	// 3) Tiefe
	
	_root.attachMovie("fire", "fire" + n, n);
	_root["fire"+n]._x = FireArray[i].xk;
	_root["fire"+n]._y = FireArray[i].yk;

	//Dem Feuer ein Skript zuweisen
	_root["fire"+n].onEnterFrame = function() {
	}
	//Laufvariable inkrementieren
	n++;
}
}
Bin student und habe als Semesterprojekt ein Spiel zu erledigen und genau an dieser Stelle hänge ich, bevor ich dies nicht habe kann ich mit dem HitTest nicht fortfahren.

Freue mich auf jeden Fall für jede Hilfe!!

Lg
HonkMarc ist offline   Mit Zitat antworten
Alt 11-10-2011, 23:58   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
willkommen im flashforum.

Zitat:
Zitat von HonkMarc Beitrag anzeigen
ich möchte nun das nach jedem erzeugten Objekt aus der Bibliothek eine zufällige Pause gemacht wird, bis der nächste Arraywert ausgelesen wird.
dann kein for sondern einen globalen zeiger
und schau dir in der flash-hilfe bitte das
setInterval
an.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (12-10-2011 um 00:01 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 12-10-2011, 00:00   #3 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Hallo und willkommen im FlashForum!

Zunächstmal ist das kein mehrdimensionales Array, sondern eine Array von Objekten (aber das nur am Rande).

Wenn verschiedene Aktionen zeitlich nacheinanderausgeführt werden sollen, ist es keine gute Idee, sie auf einen Rutsch mit einer for-Schleife abzuarbeiten. Versuch's stattdessen mal mit einem Interval:
PHP-Code:
//Array der Feuer-Koordinaten
var fireArray:Array = [
    {
xk:240yk:276 },
    {
xk:255yk:288 },
    {
xk:304yk:288 },
    {
xk:333yk:307 },
    {
xk:361yk:289 },
    {
xk:380yk:308 }
];

function 
fire() {    
    var 
fireMc:MovieClip attachMovie("fire""fire" currentFireNumgetNextHighestDepth());
    
fireMc._x fireArray[currentFireNum].xk;
    
fireMc._y fireArray[currentFireNum].yk;
    
    
currentFireNum++;
    if (
currentFireNum >= fireArray.lengthclearInterval(fireInterval);
}
    
//Zähler für Feuererzeugung
var currentFireNum:Number 0;
var 
fireInterval:Number setInterval(fire1000); 
Unsonsten solltest Du noch auf die üblichen Regeln für sauberen AS-Code achten:
  • Alle Variablen Typisieren
  • Variablen- und Funktionsnamen immer mit einem Kleinbuchstaben beginnen
  • Wenn möglich Literale ([ ]) statt der Konstruktoren (new Array()) verwenden
  • Unnötige Klammern vermeiden
  • Zugriffe auf _root und _global vermeiden
  • Dynamische Zugriffe über die Klammersyntax reduzieren und stattdessen lokale Variablen verwenden.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (12-10-2011 um 00:07 Uhr)
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 12-10-2011, 00:08   #4 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
PHP-Code:
//Array der Feuer-Koordinaten
var firePositions:Array = [
    {
x240y276},
    {
x255y288},
    {
x304y288},
    {
x333y307},
    {
x361y289},
    {
x380y308}
];
    
function 
machFeuer(n:Number) {    
    if(!
nn=0;

    var 
fire:MovieClip _root.attachMovie("Fire""fire"+nn);
    
fire._x firePositions[n].x;
    
fire._y firePositions[n].y;
    
    if(++
firePositions.length)
        
setTimeout(machFeuerMath.random() * 3000n);
}

machFeuer();    
//oder 
machFeuer(0); 
VariablenNamen immer mit Kleinbuchstaben beginnen, und Klassen mit Grossbuchstaben (Fire beim attachMovie)

Zitat:
var FireArray = new Array();
FireArray[0] = ({xk:240, yk:276});
FireArray[1] = ({xk:255, yk:288});
FireArray[2] = ({xk:304, yk:288});
FireArray[3] = ({xk:333, yk:307});
FireArray[4] = ({xk:361, yk:289});
FireArray[5] = ({xk:380, yk:308});
also, ich kenne durchaus noch umständlichere Varianten, das zu schreiben. nicht viele, aber ich kenne welche

und nur zum verständnis: das was du hier hast ist immer noch ein eindimensionales Array (eine Liste von Objekten). Bei mehrdimensionalen Arrays hast du Array in Array (in Array ...), und dann erst einen Wert || Objekt

edit: zu spät, und dann auch noch (fast) das selbe geschrieben wie Martin
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (12-10-2011 um 00:12 Uhr)
thomas_E ist offline   Mit Zitat antworten
Alt 12-10-2011, 09:33   #5 (permalink)
Student
 
Registriert seit: Oct 2011
Beiträge: 9
Danke für die vielen Hinweise und Richtigstellungen!!

Werde gleich alles Richtigsetzen und mir einprägen, damit es der Namenskonvention gerecht wird.

Danke!!!

Lg
HonkMarc ist offline   Mit Zitat antworten
Alt 17-10-2011, 21:26   #6 (permalink)
Student
 
Registriert seit: Oct 2011
Beiträge: 9
removeMovieClip();

Sodale hab jz mein Dokument angepasst an die allgemeine Schreibweise, warum jedoch soll man nicht "_root" verwenden?

Hab es auch geschafft das die Elemente durcheinander ausgegeben werden. Jetzt habe ich nur das Problem das ich einen Stop-Button habe und wenn ich den klicke sollen die erzeugten Objekte gelöscht werden.

Code:
_root.stop_btn.onRelease = function() {
    gotoAndPlay(3); 
	stop();
	//Löschen der Intervalle
	clearInterval(fireInterval);
	clearInterval(countdownInterval);
	//Feuer von der Oberfläche löschen
	for(i=0; i < 35; i++) {
		_root.fire0.removeMovieClip();
		//_root.fire1.removeMovieClip();
		//_root.fire2.removeMovieClip();
		//_root.fire3.removeMovieClip();
	}
}
Hierbei ist mein Problem das ja durch das attachMovie immer eine Zahl an "fire" angehängt wird, wie baue ich das in die for-Schleife das ich nicht 36mal fire0,fire1, fire2 etc. schreiben muss? Hab insgesamt 36 Koordinaten in meinem Array.
HonkMarc ist offline   Mit Zitat antworten
Alt 17-10-2011, 22:26   #7 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Zitat:
Zitat von HonkMarc Beitrag anzeigen
Sodale hab jz mein Dokument angepasst an die allgemeine Schreibweise, warum jedoch soll man nicht "_root" verwenden?
Weil das so wäre, als würdest du jeden Weg, den du gehst, dort beginnen, wo der erste Mensch seinen Fuß zum ersten mal auf den Boden gesetzt hat.

Zitat:
Zitat von HonkMarc Beitrag anzeigen
Hierbei ist mein Problem das ja durch das attachMovie immer eine Zahl an "fire" angehängt wird, wie baue ich das in die for-Schleife das ich nicht 36mal fire0,fire1, fire2 etc. schreiben muss? Hab insgesamt 36 Koordinaten in meinem Array.
Speichere deine MCs in einem Array. (so wie du es ja mit den Positionen schon tust)

Habe mich mal an thomas' Code zuschaffen gemacht um besagtes zu demonstrieren:
PHP-Code:
//Array der Feuer-Koordinaten
var firePositions:Array = 
[
    {
x240y276},
    {
x255y288},
    {
x304y288},
    {
x333y307},
    {
x361y289},
    {
x380y308}
];

//timeout ID
var timeoutID:Number 0;

//array für mcs
var fires:Array = [];
    
function 
machFeuer(n:Number):Void
{    
    if(!
nn=0;

    var 
fire:MovieClip attachMovie("Fire"""getNextHighestDepth());
    
fire._x firePositions[n].x;
    
fire._y firePositions[n].y;
    
fires.push(fire);
    
    if(++
firePositions.length)
        
timeoutID setTimeout(machFeuerMath.random() * 3000n);
}

function 
onMouseDown ():Void
{
    
clearTimeout(timeoutID);
    for (var 
i:String in fires
        
fires[i].removeMovieClip();
}

//äktschn:
machFeuer(); 
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick

Geändert von milchreis (17-10-2011 um 22:52 Uhr)
milchreis ist offline   Mit Zitat antworten
Alt 18-10-2011, 09:25   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
fast 1000%ig richtig ;-)

in machFeuer wird (timeoutID = setTimeout) timeoutID mit einem neuen wert gefüllt. damit kann ein timeoutID 'verlohren' gehen und wird ewig weiter arbeiten. das clearTimeout(timeoutID); in onMouseDown entfernt immer nur das aktuelle timeoutID.

entweder dem clickobjekt sein timeoutID zuordnen, oder vor dem neu erzeugen das alte timeoutID stoppen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-10-2011 um 09:28 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 18-10-2011, 09:31   #9 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Wird das fires Array nicht auch beliebig lang?
Omega Psi ist offline   Mit Zitat antworten
Alt 18-10-2011, 09:36   #10 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
korrekt. also fast 999%ig richtig :-(

die objekte werden sowohl als mc auf der bühne als auch als referenz im array verwaltet. also doppelt. es wird aber nur das mc auf der bühne entfernt.

das mit dem array ist grundsätzlich richtig. u.a. auch wenn man die grafik von allem anderen trenne will.
hier würde sich anbieten anstatt einem array ein objekt (container - auf der bühne) zu benützen.

und wenn's eine eigene function zum entfernen geben würde (anstatt das mitten im script irgendwo mit zu machen) dann hätte man sich eventuell auch mehr gedanken darüber gemacht: was gehört alles zum entfernen.

tja, es bleibt schwierig ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-10-2011 um 09:38 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 18-10-2011, 09:55   #11 (permalink)
Student
 
Registriert seit: Oct 2011
Beiträge: 9
Ok alles gut zu wissen... Container noch nie gehört aber ich hab ja ein Buch...

Wird es denn noch schwieriger wenn ich vorhabe jedes Feuer einzeln löschen zu können mittel einem längeren Klick???
HonkMarc ist offline   Mit Zitat antworten
Alt 18-10-2011, 10:00   #12 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Zitat:
Zitat von HonkMarc Beitrag anzeigen
Container
blecheimer. ein behälter, in dem etwas drinn ist. alle mc's sind in einem anderen mc drinn. also ist das der container (der behälter) für diese mc's. der oberste/ unterste (je nachdem wie man das dreht) behälter ist root. da ist alles drinn.

hier z.b. ein container, ein mc, der selbst garkeine grafik besitzt. in dem aber alle "Fire" ge'attachMovie't werden (und nur diese).
vorteil: man kann alle auf einmal verschieben, löschen, ausblenden usw. und eben auch den inhalt zählen usw.

nachteil z.b.: ein array kann man sortieren. den inhalt von einem objekt nicht. gut man kann die tiefe vertauschen .. man muss sich halt vorher überlegen, was man machen will und dazu passend die beste lösung finden.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-10-2011 um 10:06 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 18-10-2011, 17:18   #13 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
Zitat:
Zitat von hgseib Beitrag anzeigen
oder vor dem neu erzeugen das alte timeoutID stoppen.
Ich dachte timeout wird nur ein mal ausgeführt?
Insofern gibt's doch nach dem starten des ersten timeouts nur 2 Möglichkeiten:
- entweder die funktion wird aufgerufen, wodurch das timeout (mit der aktuellen ID) beendet wird (und ein neues gestartet)
- oder jemand klickt und der timeout wird abgebrochen

wo geht da was verloren?
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 18-10-2011, 20:00   #14 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ja, sorry, habe setTimeout mit setInterval verwechselt.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 18-10-2011, 20:24   #15 (permalink)
Student
 
Registriert seit: Oct 2011
Beiträge: 9
Hab nun eine gemischte Form von Thomas_E & milchreis geschrieben und es funktioniert.

PHP-Code:
var firePositions:Array = [
    {
xk:240yk:276},
    {
xk:255yk:288},
    {
xk:304yk:288},
    {
xk:333yk:307},
    {
xk:361yk:289},
    {
xk:380yk:308}
];

//Array nicht der Reihe nach ausgeben
firePositions.sort(function () { return random(3)-1;});

//Array für entstandene Feuer zum speichern
var fires:Array = [];

//Zähler für Feuererzeugung
var currentFireNum:Number 0;

var 
globalFireTime:Number 3;

function 
machFeuer() { 
    
//nächste freie Ebene wird mit getNextHighestDepth() gesucht
    
var fireMc:MovieClip attachMovie("fire""fire" currentFireNumgetNextHighestDepth());
    
fireMc._x firePositions[currentFireNum].xk;
    
fireMc._y firePositions[currentFireNum].yk;
    
fires.push(fireMc);
    
    
trace("Feuer "+currentFireNum+" wurde erzeugt");
    
    
//variabel an Feuer-Objekt anhängen
    
fireMc.fireTime _root.globalFiretime;
    
        
    
//Dem Feuer ein Skript zuweisen
    
fireMc.onEnterFrame = function() {
        
//Feuer muss durch einen Klick löschbar sein.
        //Wenn ein Feuer nicht geklickt wird soll es nach einer 
        //bestimmten Zeit sich selbst löschen.
    
}
        
    
currentFireNum++;
    
    if (
currentFireNum >= firePositions.length) {
        
clearInterval(fireInterval);
    }


Auch ein Danke für alle Hinweise, jz muss ich es schaffen dass die Feuer anklickbar sind und somit löschbar oder wenn sie nicht angeklickt werden das sie nach eienr bestimmten Zeit sich selbst löschen. Für Hinwiese bin ich dankbar!


Lg Marcus
__________________
Student an der FH St.Pölten - 1 Sem. Flash
HonkMarc 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
mehrdimensionales array r74 Flash Einsteiger 8 09-03-2007 13:22
Mehrdimensionales Array thkolz ActionScript 1 12 02-12-2005 19:05
mehrdimensionales Array the crunch ActionScript 1 7 28-10-2005 09:09
mehrdimensionales array astaroth PHP und MySQL 4 21-03-2005 07:45
mehrdimensionales Array axeff ActionScript 1 6 14-05-2004 12:50


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele