2012-10-04 3 views
1

Je crée un terrain dynamique bloqué en flash (AS3), et tout va bien, le terrain est correctement placé. Mais j'ai besoin d'inclure les collisions et je veux que les blocs soient dans un MovieClip (sprite), donc je peux tester la collision avec le terrain lui-même. Ps: Je ne sais pas s'il serait bon de tester individuellement les collisions avec chaque bloc car j'utiliserai une fonction enterframe et la génération de blocs est dynamique. Le problème auquel je suis confronté est que j'ai un sprite appelé blockHolder, mais je ne peux pas ajouter les blocs à cela.AS3: impossible de rajouter des clips vidéo indexés dans un sprite

Voici le code (je l'ai simplifié si nous avons les blocs en cours de création en cascade si vous les AddChild dans la scène directement, comme addChild (clonedSquare)

L'erreur que je reçois. TypeError: erreur # 1009: ne peut pas accéder à la propriété ou la méthode d'une référence d'objet nul

var blockHolder:Sprite = new Sprite(); 

var clonedSquare = new square(); 

var lowestPoint:int = 10; 
var highestPoint:int = 20; 
var areaLenght:int = 10; 

function createLvl():void 
{ 
    for (var i:Number = 0; i<(areaLenght); i++) 
    { 
     clonedSquare = new square(); 
     clonedSquare.x = i * clonedSquare.width; 
     //sets the height of the first block 
     if (i == 0) 
     { 
      var firstY:Number = Math.ceil(Math.random()*((lowestPoint-highestPoint))+highestPoint)*clonedSquare.height; 
      clonedSquare.y = firstY; 
      trace("terrain begins " + firstY + " px down"); 
     } 
     else 
     { 
       var previousId:Number = i - 1; 
       clonedSquare.y = getChildByName("newSquare"+previousId).y + clonedSquare.height; 
     } 
     //sets the entity (block) name based on the iteration 
     clonedSquare.name = "newSquare" + i; 
     //adds the cloned square 
     blockHolder.addChild(clonedSquare); 
    } 
    addChild(blockHolder); 
} 

createLvl(); 
+0

demandez-vous pourquoi vous obtenez cette erreur? – Ronnie

+0

Avant 'blockHolder.addChild (clonedSquare)', qu'est-ce que vous obtenez si vous tracez (blockHolder) '? –

Répondre

0

Eh bien, je fixe l'erreur, je ne suis toujours pas clair quant à ce que vous demandez Fondamentalement ajouter... chaque bloc à un tableau et une référence le bloc de cette façon. Votre clonedSquare.y = getChildByName("newSquare"+previousId).y + clonedSquare.height; lançait l'erreur. De plus, votre firstY a placé le premier bloc de ma scène, donc je l'ai juste mis à 0 en tant que premier 0Y

var blockHolder:Sprite = new Sprite(); 
var squares:Array  = []; 
var lowestPoint:int  = 10; 
var highestPoint:int = 20; 
var areaLenght:int  = 10; 

function createLvl():void 
{ 
    for (var i:Number = 0; i<(areaLenght); i++) 
    { 
     var clonedSquare = new square(); 
     clonedSquare.x = i * clonedSquare.width; 
     if (i == 0) 
     { 
      var firstY:Number = Math.ceil(Math.random()*((lowestPoint-highestPoint))+highestPoint)*clonedSquare.height; 
      //clonedSquare.y = firstY; 
      clonedSquare.y = 0; 
      trace("terrain begins " + firstY + " px down"); 
     } 
     else 
     { 
      clonedSquare.y = squares[i - 1].y + clonedSquare.height; 
     } 
     blockHolder.addChild(clonedSquare); 
     squares.push(clonedSquare); 
    } 
    addChild(blockHolder); 
} 
createLvl(); 
+0

Merci beaucoup, ça a marché! Le premierY multiplie le calcul par la hauteur carrée (j'utilise un carré de 10px, c'est pour ça qu'il apparaît sur ma scène) – Fogs

+0

Ah, gotcha! Oui les places que j'utilisais étaient proches de 100px .. Bon, cool, content que ça marche – Ronnie

Questions connexes