hej alle.
jeg har brug for lidt hjælp.
jeg er ved at prøve at bygge en fil om, så det ikke længere bare er en lang fil med ActionScript filer, men mange små selvstændige class'es, som så kan bruges i andre sammenhænge.
jeg har dog lidt problemer.
jeg forsøger at rette størrelsen på et MovieClip på stage i en funktion i en selvstændig class, men løber hele tiden i dette problem:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at com.felixsanchez.FullscreenBackground::FullscreenBackground/resizeBackground()
at FullscreenBackgroundDemo/onResize()
jeg må på en eller anden måde referere forkert til mit MoveiClip...
her er min Document Class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package { import com.felixsanchez.NewCustomContextMenu.NewCustomContextMenu; import com.felixsanchez.FullscreenBackground.FullscreenBackground; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; public class FullscreenBackgroundDemo extends Sprite { private var _fsb:FullscreenBackground; public function FullscreenBackgroundDemo() { setupContextMenu(); _fsb = new FullscreenBackground("static", "image_bg1.jpg"); addChild(_fsb); stageInit(); } function stageInit():void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.BEST; stage.frameRate = 30; stage.showDefaultContextMenu = true; stage.addEventListener(Event.RESIZE, onResize, false, 0, true); } private function onResize(e:Event):void { //trace("_fsb.width = "+_fsb.width+" & _fsb.height = "+_fsb.height); _fsb.resizeBackground(_fsb.width, _fsb.height); } |
og her er den selvstændige class, der gør at det fejler:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package com.felixsanchez.FullscreenBackground { import caurina.transitions.Tweener; import com.felixsanchez.ExtendedLoader.ExtendedLoader; import flash.display.Sprite; import flash.events.Event; public class FullscreenBackground extends Sprite { private var _type:String; private var _pictures:String; private var _el:ExtendedLoader; private var _ratio:Number; private var _stageWidth:Number; private var _stageHeight:Number; private var _backgroundWidth:Number; private var _backgroundHeight:Number; public function FullscreenBackground(type:String, pictures:String) { _type = type; _pictures = pictures; trace("com.felixsanchez.FullscreenBackground & type = "+_type+" & pictures = "+_pictures); var _el = new ExtendedLoader(_pictures); addChild(_el); _el.addEventListener("ExtendedLoaderDone", ExtendedLoaderDone, false, 0, true); _el.addEventListener(Event.RESIZE, resizeBackground, false, 0, true); } private function ExtendedLoaderDone(e:Event):void { //addChild(_el); trace("ExtendedLoaderDone"); } public function resizeBackground(backgroundWidth:Number, backgroundHeight:Number):void { trace(stage.stageWidth, stage.stageHeight); _stageWidth = stage.stageWidth; _stageHeight = stage.stageHeight; _backgroundWidth = backgroundWidth; _backgroundHeight = backgroundHeight; trace("backgroundWidth = "+backgroundWidth+" & backgroundHeight = "+backgroundHeight); _ratio = _backgroundWidth / _backgroundHeight; trace("_ratio = "+_ratio); ///* if ((_stageWidth / _ratio) >= _stageHeight) { trace("do one thing"); _el.width = _stageWidth; _el.height = (_stageWidth / _ratio); //root._fsb.width = _stageWidth; //root._fsb.height = (_stageWidth / _ratio); //_root._fsb.width = _stageWidth; //_root._fsb.height = (_stageWidth / _ratio); } else { trace("do another thing"); //_el.height = _stageHeight; //_el.width = (_stageHeight * _ratio); } //trace(_el.width, _el.height); //*/ } } } |
problemet ligger i når eventlisteneren i Document class'en reagerer på Event.RESIZE og kalder funktionen onResize. denne kalder så igen resizeBackground i den eksterne class, hvor jeg som I kan se, kan trace en masse værdier, men ikke finde ud af at resize mit MovieClip..
kan ovenstående beskrivelse og vedhæftede kode gøre, at der er nogle, der kan gennemskue dette.. eller mangler jeg at beskrive noget?
på forhånd tak
felisan
4 kommentarer
Hej,
Det er nemt nok. Du skriver
var _el = new ExtendedLoader(_pictures)i
public function FullscreenBackground(type:String, pictures:String)dvs du laver jo en ny lokal variabel _el.
Det er nok ikke det du vil
Normalt er det fordi din stage reference endnu ikke er sat. Det er derfor man har en Event.ADDED_TO_STAGE, hvor man normalt sætter stage listeners.
Derudover smider du en eventlistener på dit ExtendedLoader objekt på en Event.RESIZE, men det er Stage objekter der smider sådan en, ikke MovieClips eller Sprites.
hej mat.
tak for svaret.
du har helt ret mht. Event.RESIZE, den er nu flyttet til:
stage.addEventListener(Event.RESIZE, onResize, false, 0, true);
jeg har også prøvet lidt forskelligt med Event.ADDED_TO_STAGE uden at have fået det til at spille. for at forstå ADDED_TO_STAGE bedre, kan du så fortælle;
1) om jeg bruger ADDED_TO_STAGE på stage i min FullscreenBackgroundDemo.as fil?
2) om jeg bruger ADDED_TO_STAGE på _fsb i min FullscreenBackgroundDemo.as fil?
3) om jeg bruger ADDED_TO_STAGE på _el i min FullscreenBackground.as fil?
4) eller om alle 3 ovenstående forslag er helt hen i vejret, og jeg bør have en grundig opsang i min event-forståelse...
på forhånd tak
felisan
I ovenstående ville jeg umiddelbart sige at din positionering for dit "_fbs" objekt i din "FullscreenBackgroundDemo" klasse burde defineres i "FullscreenBackground". Der er ingen grund til at du kalder en eller anden resizing kode på den udefra, det kan den fint selv håndtere.
Og du kan passende fange ADDED_TO_STAGE i "FullscreenBackground" og bruge den til at hæfte din eventlistener til Event.RESIZE.