PDA

Volledige versie bekijken : MC's op stage plaatsen mbv array


gzzle
%Europe/Berlin %450 %2009, 10:48
Hi!

Hoop dat iemand mij op weg kan helpen.
Ik heb een aantal movieclipjes die ik mbv een array op de stage plaats. Dat gaat allemaal prima:


for (var i:int = 0; i < containerNum; i++) {
var container:MovieClip = new mc_container();
container.y = 111;
container.x = 309 + container.width * i;
addChild(container);
}


Het zijn in totaal 8 mc's. Wat ik eigenlijk wil dat het doet, is dat er tussen elke mc een bepaalde ruimte zit, bijvoorbeeld 50 pixels. Nu krijg je alle 8 de mc's achter elkaar aan geplakt (beginnend bij 309 px). Ik heb geprobeerd om de code aan te passen zodat er tussen de mc's nog ruimte zit, maar ik krijg het niet voor elkaar...

anyone?

Mind
%Europe/Berlin %501 %2009, 12:01
for (var i:int = 0; i < containerNum; i++) {
var container:MovieClip = new mc_container();
container.y = 111;
container.x = 309 + (container.width + 50) * i;
addChild(container);
}


zo gaat dat denk lukken!

bye, Mind

PsK
%Europe/Berlin %501 %2009, 12:02
Hey gzzle,

Om ruimte te creëren moet je formule iets aanpassen.
container.x = startpositie + (tussenruimte + breedtemovieclip) * i;

container.x = 309 + (container.width+50) * i;


succes

gzzle
%Europe/Berlin %515 %2009, 12:22
Djeezz... thnx jullie allebei! Wat stom zeg.. ik had al een keer iets soortgelijks geprobeerd alleen dan de "+ 50" helemaal achteraan in de zin.. En dit is zoooo enorm logisch! Ik snap niet dat ik daar niet opgekomen ben... haha.. Thnx!

Misschien heeft één van jullie nog een oplossing voor het volgende;

Wat ik dan nu heb is een rijtje van 8 mc's naast elkaar. Wat ik in eerste instantie wilde doen was dat in totaal 8 keer doen, dus je krijgt 8 rijtjes van 8 mc's onder elkaar. Ik weet zelf namelijk niet zo goed hoe je dat in één keer kan doen. Dus 1 array van 64 mc's, die zo worden ingedeeld dat ze om de 8 mc's een regel naar beneden gaan, dus een vlak van 8x8..

Kan iemand mij een zetje in de goede richting geven? Of anders, weet iemand waar ik dit kan vinden? Ik heb voor mijn gevoel al heel internet afgezocht.. maar ken het niet vinden....

LuchtJon
%Europe/Berlin %553 %2009, 13:17
Ik heb wel een mooi stukje code voor je als je dat kunt gebruiken:


function maakGrid():void {
var b:Array = new Array(aantal_movieclips);
for(var j = 0; j < b.length; j++){
b[j] = new mc_container();
b[j].x = 0 + (breedte van container + 50* j ) - ((Math.ceil((j+1)/aantal_naast_elkaar)-1)*hoeveelheid_naar_links_verplaatsen);
b[j].y = (Math.ceil((j+1)/aantal_naast_elkaar)-1)*hoogte van container;
this.addChild(b[j]);
}

}


Je moet aantal_movieclips en breedte en hoogte van container en hoeveelheid_naar_links_verplaatsen en aantal naast elkaar in de code natuurlijk vervangen met je eigen waarden, maar het idee is dit:

Math.ceil(a/b) Bovenstaande geeft de plafondwaarde van a gedeeld door b. als ik 1 deel door 8 is de plafondwaarde dus 1.
0 + (breedte van container + 50* j ) - ((Math.ceil((j+1)/aantal_naast_elkaar)-1)* hoeveelheid_naar_links_verplaatsen); Dit zorgt ervoor dat elke keer 8 movieclips een oplopende x waarde hebben, en dan bij de negende wordt x weer 0, omdat de movieclip dan de breedte van 8 movieclips met tussenruimte naar links wordt geplaatst. Immers, bij j==0, de eerste movieclip uit de array, wordt dit: (Math.ceil(j+1)/8)-1 gelijk aan 1 - 1, dus 0. Dit geldt voor alle movieclips tot en met j == 7 (de achtste). immers, Math.ceil( 8 / 8 ) - 1 is nog steeds 0. Bij de negende is het Math.ceil( 9 / 8 ) - 1, is 1. En zo gaat het door tot je 8 rijen hebt gemaakt.

Nu het stuk voor de y:

(Math.ceil((j+1)/aantal_naast_elkaar)-1)*hoogte van container;

Dit stuk is makkelijker, omdat het hetzelfde doet als de x, namelijk de eerste 8 movieclips y ==0 maken, de volgende acht y == 1 * hoogte, de acht daarna y == 2*hoogte etc.

Als je het nog niet snapt: probeer even te spelen met Math.ceil door te tracen in Flash. Ik hoop dat je er wat aan hebt.

gzzle
%Europe/Berlin %561 %2009, 13:28
Hi LuchtJon!

Thnx... ziet er in ieder geval een stuk beter uit dan het vorige 8 keer onder elkaar zetten! Ik ga het zo direct ff proberen..

thnx!

gzzle
%Europe/Berlin %495 %2009, 11:53
LuchtJon!

Ik heb inmiddels je idee geprobeerd, maar het werkt niet. Althans, er gebeurt niets. Hij geeft geen error of iets dergelijks, maar er komt ook niets in beeld. Tis net alsof de code er niet in staat...

Ik heb de code zo gemaakt als jij zei, en enkel de getallen ingevuld.....

Ook getraced.. maar daar kwam verder ook niet echt iets uit ofzo.

hm.... iemand een idee??

PsK
%Europe/Berlin %515 %2009, 12:21
Ook getraced.. maar daar kwam verder ook niet echt iets uit ofzo.

Post je code/source eens want hier kan niemand iets mee...

gzzle
%Europe/Berlin %520 %2009, 12:29
Ok sorry.. ik dacht omdat het om precies dezelfde code als hierboven gaat, dat het wel duidelijk zou zijn.


function maakGrid():void
{
var b:Array = new Array(64);
for (var j = 0; j < b.length; j++)
{
b[j] = new mc_container();
b[j].x = 309 + (b[j].width + 19 * j) - ((Math.ceil(j + 1) / 8 - 1) *401);
b[j].y = (Math.ceil((j + 1) / 8) - 1) * 33.5;

addChild(b[j]);
}
}

LuchtJon
%Europe/Berlin %538 %2009, 12:54
Het enige wezenlijke verschil tussen mijn code en de jouwe is dat de mijne in een functie is gezet die je nog apart moet aanroepen met maakGrid();
Verder kan ik er niks zinnigs over zeggen omdat je maar een fragment van de code post, en de fout misschien wel ergens anders zit.

gzzle
%Europe/Berlin %663 %2009, 15:55
Hi guys,

mijn excuses dan, gezien dit het enige is dat in de code staat, uitgezonderd geïmporteerde packages enzo dacht ik dat men het overbodig zou vinden als ik alles had geplaatst. Misschien ook mijn onervarenheid in het vragen van hulp. Nogmaals, sorry.

Maaarr... ik ben eruit en het werkt. punt was onder andere dat bij de eerste Math.ceil de haakjes niet goed geplaatst waren en die had ik wel zo overgenomen. Dat heb ik aangepast, en ik heb het uit de functie gehaald en het geheel in een public funtion gezet. Nu werkt ie prima. Even voor de goede orde, ALLE CODE:


package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.display.SimpleButton;

public class main extends Sprite
{
private var containers:Array = new Array(64);
private var bieb:MovieClip;
private var wissen:SimpleButton;

public function main()
{
bieb = new mc_bieb();
bieb.x = 36;
bieb.y = 109.2;
addChild(bieb);

for (var i:int = 0; i < containers.length; i++)
{
containers[i] = new mc_container();
containers[i].x = 309 + (containers[i].width + 19) * i - (Math.ceil((i + 1) / 8 - 1) * 428);
containers[i].y = 111 + (Math.ceil((i + 1) / 8) - 1) * 54;
addChild(containers[i]);
}
}


}
}


En op deze manier werkt ie perfect!

Thnx jullie allebei voor de hulp!

grtz