PDA

Volledige versie bekijken : Array probleem


W0utR
%Europe/Berlin %801 %2008, 20:14
Ik zit met een vervelend probleem, ik heb een movieclip van 400x200px, die ik vol zet met kleine blokjes.

Elk blokje zet ik in een Array, dat werkt allemaal goed.
for (var i:Number = 0; i < rectsWidth; i++) {
yPos = 0;
for (var j:Number = 0; j < rectsHeight; j++) {
var rect:MovieClip = new MovieClip();

rect.graphics.beginFill(0xFFFFFF);
rect.graphics.drawRect(xPos, yPos, rectDimensions, rectDimensions);
rect.graphics.endFill();

layout.holder.addChild(rect);

// push the rects into an array
myArray.push(rect.name);


yPos += rectDimensions;
}
xPos += rectDimensions;
}

Maar nu zou ik graag randomBlokje op alpha = 0 zetten, dit probeerde ik als volgt:
function deleteRandom() {
var arrayLenght:Number = myArray.length;
var randomNumber:Number = Math.round(Math.random()*arrayLenght);

trace(myArray[randomNumber]);
myArray[randomNumber].alpha = 0;
}

Maar dat geeft mij de volgende error terug:
ReferenceError: Error #1056: Cannot create property alpha on String.

Dauntless
%Europe/Berlin %813 %2008, 20:32
// push the rects into an array
myArray.push(rect.name);

Wat push je hier dus? => De naam van je rect, en dat is een string. Maak er gewoon 'myArray.push(rect)' van.

Ook: Gebruik Math.floor() zodat je geen afronding fout krijgt naar een ongedefiniëerde index.
En het kan zijn dat je (myArray[randomNumber] as DisplayObject).alpha = 0' moet gebruiken.

Mr. Black
%Europe/Berlin %815 %2008, 20:34
Waarom voeg je rect.name toe? Toch gewoon alleen maar rect? :)

for (var i:Number = 0; i < rectsWidth; i++) {
yPos = 0;
for (var j:Number = 0; j < rectsHeight; j++) {
var rect:MovieClip = new MovieClip();

rect.graphics.beginFill(0xFFFFFF);
rect.graphics.drawRect(xPos, yPos, rectDimensions, rectDimensions);
rect.graphics.endFill();

layout.holder.addChild(rect);

// push the rects into an array
myArray.push(rect);


yPos += rectDimensions;
}
xPos += rectDimensions;
}


En dan even casten:

function deleteRandom() {
var arrayLenght:Number = myArray.length;
var randomNumber:Number = Math.round(Math.random()*arrayLenght);

trace(myArray[randomNumber]);

var rect:Sprite = myArray[randomNumber] as Sprite;
rect.alpha = 0;
}

W0utR
%Europe/Berlin %819 %2008, 20:40
bedankt, beide werkte.

Het was me niet opgevallen dat ik rect.name in de array zette.

Welke is nu de beste manier?
Gelijk ik doe of gelijk Mr. Black doet?

Dauntless
%Europe/Berlin %826 %2008, 20:50
Het casten is het beste, zo laat je niets aan het toeval over. Maar ze zullen beiden even goed werken (alleen die Math.round kan nog fouten opleveren)

awesomo
%Europe/Berlin %839 %2008, 21:08
var randomNumber:Number = Math.round(Math.random()*arrayLenght);
Is niet echt perfect random want als Math.random()*arrayLenght<=0.5 dan gaat die 0 worden en als 0.5<Math.random()*arrayLenght<=1.5 dan wordt die 1. Gevolg: waarde 1 gaat dubbel zoveel voorkomen + er is ook de mogelijkheid dat je randomNumber=arrayLenght kan uitkomen, wat natuurlijk een Error zal veroorzaken (zoals Dauntless al zei). Wat ik zou voorstellen is.
var randomNumber:uint = uint(Math.random()*arrayLenght);