Volledige versie bekijken : calling methods
Muanh
%Europe/Berlin %470 %2007, 12:17
Hey iedereen,
Ik heb een class die de sprite class uitbreid. Hier heb ik een public functie aan toe gevoegd.
Ik heb in een main class een instance van deze class gemaakt en deze aan een container toegevoegd.
Nu wil ik graag via getChildAt().method mijn functie aanroepen maar dan krijg ik een error en zegt hij dat deze methode undefined is. Dit kan ik opzich wel begrijpen maar hoe zou ik deze methode dan aan kunnen roepen? Ik moet door alle instances in een lijst kunnen lopen dus gewoon de naam zal niet gaan.
Ik hoop dat jullie me kunnen helpen.
alvast bedankt.
Muanh
Mediamonkey
%Europe/Berlin %480 %2007, 12:31
Je zou door al z'n children moeten kunnen lopen via:
for (var i:int = 0; i < numChildren; i++) {
var child:* = getChildAt(i);
}
Probeer dit eens te runnen (moet je wel een ScrollPane en een Button aan je library toevoegen):
import fl.controls.Button;
import fl.containers.ScrollPane;
var pane:ScrollPane = new ScrollPane();
pane.setSize(550, 400);
this.addChild(pane);
var btn1:Button = new Button();
btn1.label = "Hello";
pane.addChild(btn1);
var btn2:Button = new Button();
btn1.label = "World";
btn2.move(0, 30);
pane.addChild(btn2);
for (var i:int = 0; i < pane.numChildren; i++) {
var child:* = pane.getChildAt(i);
trace(child);
}
Muanh
%Europe/Berlin %484 %2007, 12:37
Ja dat is precies wat ik doe, ik heb een loop die door al mijn children loopt.
for(var i:int=0;i<bryob_con.numChildren;i++)
{
if((bryob_con.getChildAt(i).x<mouseX&&bryob_con.getChildAt(i).x>con_mousex)&&(bryob_con.getChildAt(i).y<mouseY&&bryob_con.getChildAt(i).y>con_mousey))
{
bryob_con.getChildByName("bryob1").makeselected();
}
}
Maar ik kan de method van die children niet aanroepen.
marcvz
%Europe/Berlin %583 %2007, 15:00
Kun je niet gewoon al je instances in een array opslaan?
Is je method public?
En heb je getraced of bryob_con.getChildByName("bryob1") inderdaad een object geeft?
Muanh
%Europe/Berlin %611 %2007, 15:40
for(var i:int=0;i<bryob_con.numChildren;i++)
{
if((bryob_con.getChildAt(i).x<mouseX&&bryob_con.getChildAt(i).x>con_mousex)&&(bryob_con.getChildAt(i).y<mouseY&&bryob_con.getChildAt(i).y>con_mousey))
{
trace(bryob_con.getChildAt(i));
//bryob_con.getChildAt(i).makeselected();
}
}
Sorry dit is de code die ik gebruik die van net was alleen iets om uit te proberen(wat dus niet werkte).
En om je vragen te beantwoorden, ja mijn method is public. Hij geeft inderdaad een object terug. En via de array zou kunnen maar vroeg me af of het zo ook kan.
Ik kan alle geerfde properties wel opvragen alleen mijn eigen niet. Ik krijg de volgende foutmeldingen bij ene methode en property.
1119: Access of possibly undefined property isSelected through a reference with static type flash.display:DisplayObject.
1061: Call to a possibly undefined method makeselected through a reference with static type flash.display:DisplayObject.
Iemand die me kan helpen?
marcvz
%Europe/Berlin %617 %2007, 15:49
Dan lijken je methods toch niet te bestaan..
Ik heb een class die de sprite class uitbreid. Hier heb ik een public functie aan toe gevoegd.
Ik heb in een main class een instance van deze class gemaakt en deze aan een container toegevoegd.
Heb je daar ook de actionscript van?
Want de fout zit denk ik gewoon ergens in je class..
Muanh
%Europe/Berlin %620 %2007, 15:53
package
{
import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class bryob extends Sprite
{
private var food:int = 0;
private var speed:int = 3;
private var isSelected:Boolean=false;
private var bryobCircle:Sprite = new Sprite();
private var selectedCircle:Sprite = new Sprite();
public var destX:int = 0;
public var destY:int = 0;
function bryob():void
{
init();
}
function init():void
{
drawbryob();
addEventListener(MouseEvent.CLICK,clickHandler);
}
function drawbryob():void
{
bryobCircle.x=0;
bryobCircle.y=0;
selectedCircle.x=0;
selectedCircle.y=0;
bryobCircle.graphics.beginFill(0x0066CC);
bryobCircle.graphics.drawCircle(0,0,5);
bryobCircle.graphics.endFill();
selectedCircle.graphics.lineStyle(1,0xFF0000);
selectedCircle.graphics.drawCircle(0,0,8);
selectedCircle.alpha=0;
addChild(bryobCircle);
addChild(selectedCircle);
}
function clickHandler(event:MouseEvent):void
{
makeselected();
}
public function makeselected():void
{
isSelected=true;
selectedCircle.alpha=100;
}
function moveToDest():void
{
var MoveTimer:Timer = new Timer(30);
MoveTimer.addEventListener(TimerEvent.TIMER,moveTi merHandler);
MoveTimer.start();
}
function moveTimerHandler(event:TimerEvent):void
{
var dx:Number = destX - x;
var dy:Number = destY - y;
var angle:Number = Math.atan2(dy, dx);
var vx:Number = Math.cos(angle) * speed;
var vy:Number = Math.sin(angle) * speed;
x += vx;
y += vy;
}
}
}
Hier is hij, ze bestaan echt. Ik denk dat het probleem ligt in het feit dat ik ze wil aanroepen via die getChildAt functie. Maar ik weet niet hoe ik hier omheen moet.
O ja ik weet dat mijn code nog niet netjes is, dat gebeurd bij mij meestal als iets niet wil lukken ;)
marcvz
%Europe/Berlin %630 %2007, 16:07
Je isSelected var is private.. Dus daar komt de 1119 error waarschijnlijk vandaan.
En misschien dat je loop door de childeren ook objects terug geeft die geen instance van je class zijn. En die method dus niet hebben..
Ik ben laatst zelf ook met een dergelijke code aan het tobben geweest.
Maar heb dat al snel opgelost door gewoon alle instances in een array te zetten op het moment dat ik ze aanmaakte.
Zo weet je gelijk hoeveel het erzijn. En door een array loopen werkt ook sneller dan de getChildByName code.
En je hebt ook nog eens het voordeel, dat je door de objecten kunt loopen zonder dat ze aan de display list toegevoegd zijn.
Muanh
%Europe/Berlin %635 %2007, 16:14
ok bedankt dan zal ik dat ook maar doen, die isSelected heb ik trouwens daarna weer private gemaakt. Op het moment van testen was hij ff public om te testen ;).
Maar bedankt dan gaan we toch maar weer array's gebruiken.
Muanh
%Europe/Berlin %640 %2007, 16:22
Ok heb het nu veranderd in Array's alles werkt nu. Vind het alleen raar dat hij het met array's wel kan en met een display list niet. Toch bedankt voor alle hulp iedereen.
Mediamonkey
%Europe/Berlin %679 %2007, 17:18
-- edit --
nevermind, ik maakte een foutje. ben nog ff aan het testen.
-- edit 2 --
Okee, hier heb je wat werkende code:
import bryob;
import flash.events.MouseEvent;
var con_mousex:int = 0;
var con_mousey:int = 0;
var bryob_con:MovieClip = new MovieClip();
bryob_con.addEventListener(MouseEvent.CLICK, onMouseClick);
bryob_con.graphics.beginFill(0xFFFFFF, 1);
bryob_con.graphics.drawRect(0, 0, 550, 400);
bryob_con.graphics.endFill();
this.addChild(bryob_con);
for (var i=0; i<5; i++) {
var b:bryob = new bryob();
b.x = Math.random()*550;
b.y = Math.random()*400;
bryob_con.addChild(b);
}
function onMouseClick(event:MouseEvent):void {
for(var i:int=0;i<bryob_con.numChildren;i++) {
var child:* = bryob_con.getChildAt(i);
if (child is bryob) {
//trace("child is bryob: "+child);
if((child.x < bryob_con.mouseX && child.x > con_mousex) && (child.y < bryob_con.mouseY && child.y > con_mousey)) {
trace(">> "+child);
child.makeselected();
}
} else {
//trace("child is not bryob: "+child);
}
}
}
TheDutch
%Europe/Berlin %745 %2007, 18:54
Nu wil ik graag via getChildAt().method mijn functie aanroepen maar dan krijg ik een error en zegt hij dat deze methode undefined is.
Even helemaal terug naar het begin. Ik denk dat je moet casten :).
Dit zou volgensmij moeten werken:
bryob(bryob_con.getChildAt(i)).makeselected();
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.